]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-includes/class-wp-customize-panel.php
Wordpress 4.5.3
[autoinstalls/wordpress.git] / wp-includes / class-wp-customize-panel.php
index f5da18e3d7a3447e59959389b8fadab786393bf8..d5441f6310a47033a269fc72d58f43f3dd1d1b01 100644 (file)
@@ -1,13 +1,21 @@
 <?php
 /**
- * Customize Panel Class.
- *
- * A UI container for sections, managed by the WP_Customize_Manager.
+ * WordPress Customize Panel classes
  *
  * @package WordPress
  * @subpackage Customize
  * @since 4.0.0
  */
+
+/**
+ * Customize Panel class.
+ *
+ * A UI container for sections, managed by the WP_Customize_Manager.
+ *
+ * @since 4.0.0
+ *
+ * @see WP_Customize_Manager
+ */
 class WP_Customize_Panel {
 
        /**
@@ -16,6 +24,8 @@ class WP_Customize_Panel {
         * Used when sorting two instances whose priorities are equal.
         *
         * @since 4.1.0
+        *
+        * @static
         * @access protected
         * @var int
         */
@@ -154,8 +164,6 @@ class WP_Customize_Panel {
                $this->instance_number = self::$instance_count;
 
                $this->sections = array(); // Users cannot customize the $sections array.
-
-               return $this;
        }
 
        /**
@@ -166,7 +174,7 @@ class WP_Customize_Panel {
         *
         * @return bool Whether the panel is active to the current preview.
         */
-       public final function active() {
+       final public function active() {
                $panel = $this;
                $active = call_user_func( $this->active_callback, $this );
 
@@ -206,7 +214,8 @@ class WP_Customize_Panel {
         * @return array The array to be exported to the client as JSON.
         */
        public function json() {
-               $array = wp_array_slice_assoc( (array) $this, array( 'title', 'description', 'priority', 'type' ) );
+               $array = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'type' ) );
+               $array['title'] = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) );
                $array['content'] = $this->get_content();
                $array['active'] = $this->active();
                $array['instanceNumber'] = $this->instance_number;
@@ -221,7 +230,7 @@ class WP_Customize_Panel {
         *
         * @return bool False if theme doesn't support the panel or the user doesn't have the capability.
         */
-       public final function check_capabilities() {
+       final public function check_capabilities() {
                if ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) ) {
                        return false;
                }
@@ -240,12 +249,10 @@ class WP_Customize_Panel {
         *
         * @return string Content for the panel.
         */
-       public final function get_content() {
+       final public function get_content() {
                ob_start();
                $this->maybe_render();
-               $template = trim( ob_get_contents() );
-               ob_end_clean();
-               return $template;
+               return trim( ob_get_clean() );
        }
 
        /**
@@ -253,7 +260,7 @@ class WP_Customize_Panel {
         *
         * @since 4.0.0
         */
-       public final function maybe_render() {
+       final public function maybe_render() {
                if ( ! $this->check_capabilities() ) {
                        return;
                }
@@ -281,47 +288,102 @@ class WP_Customize_Panel {
        }
 
        /**
-        * Render the panel container, and then its contents.
+        * Render the panel container, and then its contents (via `this->render_content()`) in a subclass.
+        *
+        * Panel containers are now rendered in JS by default, see {@see WP_Customize_Panel::print_template()}.
         *
         * @since 4.0.0
         * @access protected
         */
-       protected function render() {
-               $classes = 'accordion-section control-section control-panel control-panel-' . $this->type;
+       protected function render() {}
+
+       /**
+        * Render the panel UI in a subclass.
+        *
+        * Panel contents are now rendered in JS by default, see {@see WP_Customize_Panel::print_template()}.
+        *
+        * @since 4.1.0
+        * @access protected
+        */
+       protected function render_content() {}
+
+       /**
+        * Render the panel's JS templates.
+        *
+        * This function is only run for panel types that have been registered with
+        * WP_Customize_Manager::register_panel_type().
+        *
+        * @since 4.3.0
+        *
+        * @see WP_Customize_Manager::register_panel_type()
+        */
+       public function print_template() {
                ?>
-               <li id="accordion-panel-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>">
+               <script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>-content">
+                       <?php $this->content_template(); ?>
+               </script>
+               <script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>">
+                       <?php $this->render_template(); ?>
+               </script>
+        <?php
+       }
+
+       /**
+        * An Underscore (JS) template for rendering this panel's container.
+        *
+        * Class variables for this panel class are available in the `data` JS object;
+        * export custom variables by overriding WP_Customize_Panel::json().
+        *
+        * @see WP_Customize_Panel::print_template()
+        *
+        * @since 4.3.0
+        * @access protected
+        */
+       protected function render_template() {
+               ?>
+               <li id="accordion-panel-{{ data.id }}" class="accordion-section control-section control-panel control-panel-{{ data.type }}">
                        <h3 class="accordion-section-title" tabindex="0">
-                               <?php echo esc_html( $this->title ); ?>
+                               {{ data.title }}
                                <span class="screen-reader-text"><?php _e( 'Press return or enter to open this panel' ); ?></span>
                        </h3>
-                       <ul class="accordion-sub-container control-panel-content">
-                               <?php $this->render_content(); ?>
-                       </ul>
+                       <ul class="accordion-sub-container control-panel-content"></ul>
                </li>
                <?php
        }
 
        /**
-        * Render the sections that have been added to the panel.
+        * An Underscore (JS) template for this panel's content (but not its container).
         *
-        * @since 4.1.0
+        * Class variables for this panel class are available in the `data` JS object;
+        * export custom variables by overriding WP_Customize_Panel::json().
+        *
+        * @see WP_Customize_Panel::print_template()
+        *
+        * @since 4.3.0
         * @access protected
         */
-       protected function render_content() {
+       protected function content_template() {
                ?>
-               <li class="panel-meta accordion-section control-section<?php if ( empty( $this->description ) ) { echo ' cannot-expand'; } ?>">
-                       <div class="accordion-section-title" tabindex="0">
+               <li class="panel-meta customize-info accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>">
+                       <button class="customize-panel-back" tabindex="-1"><span class="screen-reader-text"><?php _e( 'Back' ); ?></span></button>
+                       <div class="accordion-section-title">
                                <span class="preview-notice"><?php
-                                       /* translators: %s is the site/panel title in the Customizer */
-                                       echo sprintf( __( 'You are customizing %s' ), '<strong class="panel-title">' . esc_html( $this->title ) . '</strong>' );
+                                       /* translators: %s: the site/panel title in the Customizer */
+                                       echo sprintf( __( 'You are customizing %s' ), '<strong class="panel-title">{{ data.title }}</strong>' );
                                ?></span>
+                               <# if ( data.description ) { #>
+                                       <button class="customize-help-toggle dashicons dashicons-editor-help" tabindex="0" aria-expanded="false"><span class="screen-reader-text"><?php _e( 'Help' ); ?></span></button>
+                               <# } #>
                        </div>
-                       <?php if ( ! empty( $this->description ) ) : ?>
-                               <div class="accordion-section-content description">
-                                       <?php echo $this->description; ?>
+                       <# if ( data.description ) { #>
+                               <div class="description customize-panel-description">
+                                       {{{ data.description }}}
                                </div>
-                       <?php endif; ?>
+                       <# } #>
                </li>
                <?php
        }
 }
+
+/** WP_Customize_Nav_Menus_Panel class */
+require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menus-panel.php' );