Make WordPress Core

Changeset 20295


Ignore:
Timestamp:
03/28/2012 04:14:09 AM (13 years ago)
Author:
koopersmith
Message:

Create WP_Customize_Control to separate the process of rendering a control from fetching, previewing, and saving its values. see #19910.

Many-to-many mapping between settings and controls.

  • Settings and controls have been separated in both the PHP (WP_Customize_Setting, WP_Customize_Control) and the JS (wp.customize.Setting, wp.customize.Control).
  • While most settings are tied to a single control, some require multiple controls. The 'header_textcolor' control is a good example: to hide the header text, header_textcolor is set to 'blank'.

Add 'Display Header Text' control.

A handful of miscellaneous bugfixes along the way.

Notes:

  • Controls should be separated out a bit more; juggling type-specific arguments in the switch statement is rather inelegant.
  • Page dropdowns are currently inactive and need to be re-linked.
Location:
trunk/wp-includes
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/class-wp-customize-section.php

    r20260 r20295  
    1616    public $title          = '';
    1717    public $description    = '';
    18     public $settings;
     18    public $controls;
    1919
    2020    /**
     
    3636        $this->id = $id;
    3737
    38         $this->settings = array(); // Users cannot customize the $settings array.
     38        $this->controls = array(); // Users cannot customize the $controls array.
    3939
    4040        return $this;
     
    8585            <ul class="customize-section-content">
    8686                <?php
    87                 foreach ( $this->settings as $setting )
    88                     $setting->maybe_render();
     87                foreach ( $this->controls as $control )
     88                    $control->maybe_render();
    8989                ?>
    9090            </ul>
  • trunk/wp-includes/class-wp-customize-setting.php

    r20290 r20295  
    1111    public $manager;
    1212    public $id;
    13     public $priority          = 10;
    14     public $section           = '';
    15     public $label             = '';
    16     public $control           = 'text';
    17     public $control_params    = array();
     13
    1814    public $type              = 'theme_mod';
    19     public $choices           = array();
    2015    public $capability        = 'edit_theme_options';
    2116    public $theme_supports    = '';
    2217    public $default           = '';
    2318    public $sanitize_callback = '';
    24     public $visibility;
    2519
    2620    protected $id_data = array();
     
    6559
    6660    /**
    67      * Enqueue setting related scripts/styles.
    68      *
    69      * @since 3.4.0
    70      */
    71     public function enqueue() {
    72         switch( $this->control ) {
    73             case 'color':
    74                 wp_enqueue_script( 'farbtastic' );
    75                 wp_enqueue_style( 'farbtastic' );
    76                 break;
    77             case 'upload':
    78                 wp_enqueue_script( 'wp-plupload' );
    79                 break;
    80         }
    81     }
    82 
    83     /**
    8461     * Handle previewing the setting.
    8562     *
     
    276253            return false;
    277254
    278         $section = $this->manager->get_section( $this->section );
    279         if ( isset( $section ) && ! $section->check_capabilities() )
    280             return false;
    281 
    282255        return true;
    283     }
    284 
    285     /**
    286      * Check capabiliites and render the control.
    287      *
    288      * @since 3.4.0
    289      */
    290     public final function maybe_render() {
    291         if ( ! $this->check_capabilities() )
    292             return;
    293 
    294         do_action( 'customize_render_setting', $this );
    295         do_action( 'customize_render_setting_' . $this->id, $this );
    296 
    297         $this->render();
    298     }
    299 
    300     /**
    301      * Render the control. Renders the control wrapper, then calls $this->render_content().
    302      *
    303      * @since 3.4.0
    304      */
    305     protected function render() {
    306 
    307         $id    = 'customize-control-' . $this->id;
    308         $class = 'customize-control customize-control-' . $this->control;
    309 
    310         $style = '';
    311         if ( $this->visibility ) {
    312             if ( is_string( $this->visibility ) ) {
    313                 $visibility_id    = $this->visibility;
    314                 $visibility_value = true;
    315             } else {
    316                 $visibility_id    = $this->visibility[0];
    317                 $visibility_value = $this->visibility[1];
    318             }
    319             $visibility_setting = $this->manager->get_setting( $visibility_id );
    320 
    321             if ( $visibility_setting && $visibility_value != $visibility_setting->value() )
    322                 $style = 'style="display:none;"';
    323         }
    324 
    325         ?><li id="<?php echo esc_attr( $id ); ?>" class="<?php echo esc_attr( $class ); ?>" <?php echo $style; ?>>
    326             <?php $this->render_content(); ?>
    327         </li><?php
    328     }
    329 
    330     /**
    331      * Render the control's content.
    332      *
    333      * Allows the content to be overriden without having to rewrite the wrapper.
    334      *
    335      * @since 3.4.0
    336      */
    337     protected function render_content() {
    338         switch( $this->control ) {
    339             case 'text':
    340                 ?>
    341                 <label>
    342                     <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
    343                     <input type="text" value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->name(); ?> />
    344                 </label>
    345                 <?php
    346                 break;
    347             case 'color':
    348                 ?>
    349                 <label>
    350                     <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
    351                     <div class="color-picker">
    352                         <input type="hidden" value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->name(); ?> />
    353                         <a href="#"></a>
    354                         <div class="color-picker-controls">
    355                             <div class="farbtastic-placeholder"></div>
    356                             <div class="color-picker-details">
    357                                 <div class="color-picker-hex">
    358                                     <span>#</span>
    359                                     <input type="text" />
    360                                 </div>
    361                             </div>
    362                         </div>
    363                     </div>
    364                 </label>
    365                 <?php
    366                 break;
    367             case 'checkbox':
    368                 ?>
    369                 <label>
    370                     <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
    371                     <input type="checkbox" value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->name(); checked( $this->value() ); ?> class="customize-control-content" />
    372                 </label>
    373                 <?php
    374                 break;
    375             case 'radio':
    376                 if ( empty( $this->choices ) )
    377                     return;
    378 
    379                 ?>
    380                 <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
    381                 <?php
    382                 foreach ( $this->choices as $value => $label ) :
    383                     ?>
    384                     <label>
    385                         <input type="radio" value="<?php echo esc_attr( $value ); ?>" <?php $this->name(); checked( $this->value(), $value ); ?> />
    386                         <?php echo esc_html( $label ); ?><br/>
    387                     </label>
    388                     <?php
    389                 endforeach;
    390                 break;
    391             case 'select':
    392                 if ( empty( $this->choices ) )
    393                     return;
    394 
    395                 ?>
    396                 <label>
    397                     <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
    398                     <select <?php $this->name(); ?> class="customize-control-content">
    399                         <?php
    400                         foreach ( $this->choices as $value => $label )
    401                             echo '<option value="' . esc_attr( $value ) . '"' . selected( $this->value(), $value, false ) . '>' . $label . '</option>';
    402                         ?>
    403                     </select>
    404                 </label>
    405                 <?php
    406                 break;
    407             case 'upload':
    408                 ?>
    409                 <label>
    410                     <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
    411                     <div>
    412                         <input type="hidden" value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->name(); ?> />
    413                         <a href="#" class="button-secondary upload"><?php _e( 'Upload' ); ?></a>
    414                         <a href="#" class="remove"><?php _e( 'Remove' ); ?></a>
    415                     </div>
    416                 </label>
    417                 <?php
    418                 break;
    419             case 'image':
    420                 $value = $this->value();
    421 
    422                 $image = $value;
    423                 if ( isset( $this->control_params['get_url'] ) )
    424                     $image = call_user_func( $this->control_params['get_url'], $image );
    425 
    426                 ?>
    427                 <label>
    428                     <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
    429                     <input type="hidden" value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->name(); ?> />
    430                     <div class="customize-image-picker">
    431                         <div class="thumbnail">
    432                             <?php if ( empty( $image ) ): ?>
    433                                 <img style="display:none;" />
    434                             <?php else: ?>
    435                                 <img src="<?php echo esc_url( $image ); ?>" />
    436                             <?php endif; ?>
    437                         </div>
    438                         <div class="actions">
    439                             <a href="#" class="upload"><?php _e( 'Upload New' ); ?></a>
    440                             <a href="#" class="change"><?php _e( 'Change Image' ); ?></a>
    441                             <a href="#" class="remove"><?php _e( 'Remove Image' ); ?></a>
    442                         </div>
    443                         <div class="library">
    444                             <ul>
    445                                 <?php foreach ( $this->control_params['tabs'] as $tab ): ?>
    446                                     <li data-customize-tab='<?php echo esc_attr( $tab[0] ); ?>'>
    447                                         <?php echo esc_html( $tab[1] ); ?>
    448                                     </li>
    449                                 <?php endforeach; ?>
    450                             </ul>
    451                             <?php foreach ( $this->control_params['tabs'] as $tab ): ?>
    452                                 <div class="library-content" data-customize-tab='<?php echo esc_attr( $tab[0] ); ?>'>
    453                                     <?php call_user_func( $tab[2] ); ?>
    454                                 </div>
    455                             <?php endforeach; ?>
    456                         </div>
    457                     </div>
    458                 </label>
    459                 <?php
    460                 break;
    461             case 'dropdown-pages':
    462                 printf(
    463                     '<label class="customize-control-select"><span class="customize-control-title">%s</span> %s</label>',
    464                     $this->label,
    465                     wp_dropdown_pages(
    466                         array(
    467                             'name'              => $this->get_name(),
    468                             'echo'              => 0,
    469                             'show_option_none'  => __( '&mdash; Select &mdash;' ),
    470                             'option_none_value' => '0',
    471                             'selected'          => get_option( $this->id )
    472                         )
    473                     )
    474                 );
    475                 break;
    476         }
    477     }
    478 
    479     /**
    480      * Retrieve the name attribute for an input.
    481      *
    482      * @since 3.4.0
    483      *
    484      * @return string The name.
    485      */
    486     public final function get_name() {
    487         return self::name_prefix . esc_attr( $this->id );
    488     }
    489 
    490     /**
    491      * Echo the HTML name attribute for an input.
    492      *
    493      * @since 3.4.0
    494      *
    495      * @return string The HTML name attribute.
    496      */
    497     public final function name() {
    498         echo 'name="' . $this->get_name() . '"';
    499256    }
    500257
  • trunk/wp-includes/class-wp-customize.php

    r20290 r20295  
    1515    protected $settings = array();
    1616    protected $sections = array();
     17    protected $controls = array();
    1718
    1819    /**
     
    2425        require( ABSPATH . WPINC . '/class-wp-customize-setting.php' );
    2526        require( ABSPATH . WPINC . '/class-wp-customize-section.php' );
     27        require( ABSPATH . WPINC . '/class-wp-customize-control.php' );
    2628
    2729        add_action( 'setup_theme',  array( $this, 'setup_theme' ) );
     
    358360     * @since 3.4.0
    359361     *
    360      * @param string $id An specific ID of the setting. Can be a
     362     * @param string $id A specific ID of the setting. Can be a
    361363     *                   theme mod or option name.
    362364     * @param array $args Setting arguments.
    363365     */
    364366    public function add_setting( $id, $args = array() ) {
    365         $setting = new WP_Customize_Setting( $this, $id, $args );
     367        if ( is_a( $id, 'WP_Customize_Setting' ) )
     368            $setting = $id;
     369        else
     370            $setting = new WP_Customize_Setting( $this, $id, $args );
    366371
    367372        $this->settings[ $setting->id ] = $setting;
     
    373378     * @since 3.4.0
    374379     *
    375      * @param string $id An specific ID of the setting.
     380     * @param string $id A specific ID of the setting.
    376381     * @return object The settings object.
    377382     */
     
    386391     * @since 3.4.0
    387392     *
    388      * @param string $id An specific ID of the setting.
     393     * @param string $id A specific ID of the setting.
    389394     */
    390395    public function remove_setting( $id ) {
     
    397402     * @since 3.4.0
    398403     *
    399      * @param string $id An specific ID of the section.
     404     * @param string $id A specific ID of the section.
    400405     * @param array $args Section arguments.
    401406     */
    402407    public function add_section( $id, $args = array() ) {
    403         $section = new WP_Customize_Section( $this, $id, $args );
     408        if ( is_a( $id, 'WP_Customize_Section' ) )
     409            $section = $id;
     410        else
     411            $section = new WP_Customize_Section( $this, $id, $args );
    404412
    405413        $this->sections[ $section->id ] = $section;
     
    411419     * @since 3.4.0
    412420     *
    413      * @param string $id An specific ID of the section.
     421     * @param string $id A specific ID of the section.
    414422     * @return object The section object.
    415423     */
     
    424432     * @since 3.4.0
    425433     *
    426      * @param string $id An specific ID of the section.
     434     * @param string $id A specific ID of the section.
    427435     */
    428436    public function remove_section( $id ) {
    429437        unset( $this->sections[ $id ] );
     438    }
     439
     440    /**
     441     * Add a customize control.
     442     *
     443     * @since 3.4.0
     444     *
     445     * @param string $id A specific ID of the control.
     446     * @param array $args Setting arguments.
     447     */
     448    public function add_control( $id, $args = array() ) {
     449        if ( is_a( $id, 'WP_Customize_Control' ) )
     450            $control = $id;
     451        else
     452            $control = new WP_Customize_Control( $this, $id, $args );
     453
     454        $this->controls[ $control->id ] = $control;
     455    }
     456
     457    /**
     458     * Retrieve a customize control.
     459     *
     460     * @since 3.4.0
     461     *
     462     * @param string $id A specific ID of the control.
     463     * @return object The settings object.
     464     */
     465    public function get_control( $id ) {
     466        if ( isset( $this->controls[ $id ] ) )
     467            return $this->controls[ $id ];
     468    }
     469
     470    /**
     471     * Remove a customize setting.
     472     *
     473     * @since 3.4.0
     474     *
     475     * @param string $id A specific ID of the control.
     476     */
     477    public function remove_control( $id ) {
     478        unset( $this->controls[ $id ] );
    430479    }
    431480
     
    453502     */
    454503    public function prepare_controls() {
    455         // Prepare settings
     504        // Prepare controls
    456505        // Reversing makes uasort sort by time added when conflicts occur.
    457506
    458         $this->settings = array_reverse( $this->settings );
    459         $settings = array();
    460 
    461         foreach ( $this->settings as $id => $setting ) {
    462             if ( ! isset( $this->sections[ $setting->section ] ) || ! $setting->check_capabilities() )
     507        $this->controls = array_reverse( $this->controls );
     508        $controls = array();
     509
     510        foreach ( $this->controls as $id => $control ) {
     511            if ( ! isset( $this->sections[ $control->section ] ) || ! $control->check_capabilities() )
    463512                continue;
    464513
    465             $this->sections[ $setting->section ]->settings[] = $setting;
    466             $settings[ $id ] = $setting;
    467         }
    468         $this->settings = $settings;
     514            $this->sections[ $control->section ]->controls[] = $control;
     515            $controls[ $id ] = $control;
     516        }
     517        $this->controls = $controls;
    469518
    470519        // Prepare sections
     
    474523
    475524        foreach ( $this->sections as $section ) {
    476             if ( ! $section->check_capabilities() || ! $section->settings )
     525            if ( ! $section->check_capabilities() || ! $section->controls )
    477526                continue;
    478527
    479             usort( $section->settings, array( $this, '_cmp_priority' ) );
     528            usort( $section->controls, array( $this, '_cmp_priority' ) );
    480529            $sections[] = $section;
    481530        }
     
    489538     */
    490539    public function enqueue_control_scripts() {
    491         foreach ( $this->settings as $setting ) {
    492             $setting->enqueue();
     540        foreach ( $this->controls as $control ) {
     541            $control->enqueue();
    493542        }
    494543    }
     
    509558
    510559        $this->add_setting( 'header_textcolor', array(
    511             'label'             => 'Text Color',
    512             'section'           => 'header',
    513             'sanitize_callback' => 'sanitize_hexcolor',
    514             'control'           => 'color',
    515             'theme_supports'    => array( 'custom-header', 'header-text' ),
    516             'default'           => get_theme_support( 'custom-header', 'default-text-color' ),
    517         ) );
    518 
    519         /*
    520         $this->add_setting( 'display_header', array(
    521             'label'   => 'Display Text',
     560            // @todo: replace with a new accept() setting method
     561            // 'sanitize_callback' => 'sanitize_hexcolor',
     562            'control'        => 'color',
     563            'theme_supports' => array( 'custom-header', 'header-text' ),
     564            'default'        => get_theme_support( 'custom-header', 'default-text-color' ),
     565        ) );
     566
     567        $this->add_control( 'display_header_text', array(
     568            'settings' => 'header_textcolor',
     569            'label'    => __( 'Display Header Text' ),
     570            'section'  => 'header',
     571            'type'     => 'checkbox',
     572        ) );
     573
     574        $this->add_control( 'header_textcolor', array(
     575            'label'   => __( 'Text Color' ),
    522576            'section' => 'header',
    523             'type'    => 'radio',
    524             'choices' => array(
    525                 'show'  => 'Yes',
    526                 'hide'  => 'No'
    527             ),
    528             // Showing header text is actually done by setting header_textcolor to 'blank'.
    529             // @todo: Do some JS magic to make this work (since we'll be hiding the textcolor input).
    530             'theme_mod' => false,
    531         ) );
    532         */
     577            'type'    => 'color',
     578        ) );
    533579
    534580        // Input type: checkbox
    535581        // With custom value
    536582        $this->add_setting( 'header_image', array(
     583            'default'        => get_theme_support( 'custom-header', 'default-image' ),
     584            'theme_supports' => 'custom-header',
     585        ) );
     586
     587        $this->add_control( 'header_image', array(
    537588            'label'          => 'Header Image',
    538589            'section'        => 'header',
    539             'control'        => 'image',
    540             'default'        => get_theme_support( 'custom-header', 'default-image' ),
     590            'type'           => 'image',
    541591            'control_params' => array(
    542592                'context'        => 'custom-header',
     
    560610        // With sanitize_callback
    561611        $this->add_setting( 'background_color', array(
    562             'label'             => 'Background Color',
    563             'section'           => 'background',
    564             'control'           => 'color',
    565612            'default'           => get_theme_support( 'custom-background', 'default-color' ),
    566613            'sanitize_callback' => 'sanitize_hexcolor',
     614            'theme_supports'    => 'custom-background',
     615        ) );
     616
     617        $this->add_control( 'background_color', array(
     618            'label'   => __( 'Background Color' ),
     619            'section' => 'background',
     620            'type'    => 'color',
    567621        ) );
    568622
    569623        $this->add_setting( 'background_image', array(
    570             'label'          => 'Background Image',
     624            'default'        => get_theme_support( 'custom-background', 'default-image' ),
     625            'theme_supports' => 'custom-background',
     626        ) );
     627
     628        $this->add_control( 'background_image', array(
     629            'label'          => __( 'Background Image' ),
    571630            'section'        => 'background',
    572             'control'        => 'upload',
    573             'default'        => get_theme_support( 'custom-background', 'default-image' ),
     631            'type'           => 'upload',
    574632            'control_params' => array(
    575633                'context'        => 'custom-background',
     
    578636
    579637        $this->add_setting( 'background_repeat', array(
    580             'label'      => 'Background Repeat',
     638            'default'        => 'repeat',
     639            'theme_supports' => 'custom-background',
     640        ) );
     641
     642        $this->add_control( 'background_repeat', array(
     643            'label'      => __( 'Background Repeat' ),
    581644            'section'    => 'background',
    582645            'visibility' => 'background_image',
    583             'control'    => 'radio',
     646            'type'       => 'radio',
    584647            'choices'    => array(
    585648                'no-repeat'  => __('No Repeat'),
     
    588651                'repeat-y'   => __('Tile Vertically'),
    589652            ),
    590             'default'    => 'repeat',
    591653        ) );
    592654
    593655        $this->add_setting( 'background_position_x', array(
    594             'label'      => 'Background Position',
     656            'default'        => 'left',
     657            'theme_supports' => 'custom-background',
     658        ) );
     659
     660        $this->add_control( 'background_position_x', array(
     661            'label'      => __( 'Background Position' ),
    595662            'section'    => 'background',
    596663            'visibility' => 'background_image',
    597             'control'    => 'radio',
     664            'type'       => 'radio',
    598665            'choices'    => array(
    599666                'left'       => __('Left'),
     
    601668                'right'      => __('Right'),
    602669            ),
    603             'default'    => 'left',
    604670        ) );
    605671
    606672        $this->add_setting( 'background_attachment', array(
    607             'label'      => 'Background Attachment',
     673            'default'        => 'fixed',
     674            'theme_supports' => 'custom-background',
     675        ) );
     676
     677        $this->add_control( 'background_attachment', array(
     678            'label'      => __( 'Background Attachment' ),
    608679            'section'    => 'background',
    609680            'visibility' => 'background_image',
    610             'control'    => 'radio',
     681            'type'       => 'radio',
    611682            'choices'    => array(
    612683                'fixed'      => __('Fixed'),
    613684                'scroll'     => __('Scroll'),
    614685            ),
    615             'default'    => 'fixed',
    616686        ) );
    617687
     
    637707            }
    638708
    639             $this->add_setting( "nav_menu_locations[{$location}]", array(
    640                 'label'             => $description,
    641                 'theme_supports'    => 'menus', // Todo: Needs also widgets -- array( 'menus', 'widgets' )
    642                 'section'           => 'nav',
    643                 'control'           => 'select',
    644                 'choices'           => $choices,
     709            $menu_setting_id = "nav_menu_locations[{$location}]";
     710
     711            $this->add_setting( $menu_setting_id, array(
    645712                'sanitize_callback' => 'absint',
     713                'theme_supports'    => 'menus',
     714            ) );
     715
     716            $this->add_control( $menu_setting_id, array(
     717                'label'   => $description,
     718                'section' => 'nav',
     719                'type'    => 'select',
     720                'choices' => $choices,
    646721            ) );
    647722        }
     
    661736
    662737        $this->add_setting( 'show_on_front', array(
    663             'label'          => __( 'Front page displays' ),
     738            'default'        => get_option( 'show_on_front' ),
     739            'capability'     => 'manage_options',
     740            'type'           => 'option',
    664741        //  'theme_supports' => 'static-front-page',
    665             'section'        => 'static_front_page',
    666             'control'        => 'radio',
    667             'choices'        => $choices,
    668             'default'        => get_option( 'show_on_front' ),
     742        ) );
     743
     744        $this->add_control( 'show_on_front', array(
     745            'label'   => __( 'Front page displays' ),
     746            'section' => 'static_front_page',
     747            'type'    => 'radio',
     748            'choices' => $choices,
     749        ) );
     750
     751        $this->add_setting( 'page_on_front', array(
     752            'type'       => 'option',
     753            'capability' => 'manage_options',
     754        //  'theme_supports' => 'static-front-page',
     755        ) );
     756
     757        $this->add_control( 'page_on_front', array(
     758            'label'      => __( 'Front page' ),
     759            'section'    => 'static_front_page',
     760            'type'       => 'dropdown-pages',
     761            'visibility' => array( 'show_on_front', 'page' ),
     762        ) );
     763
     764        $this->add_setting( 'page_for_posts', array(
    669765            'type'           => 'option',
    670766            'capability'     => 'manage_options',
    671         ) );
    672 
    673         $this->add_setting( 'page_on_front', array(
    674             'label'          => __( 'Front page' ),
    675767        //  'theme_supports' => 'static-front-page',
    676             'section'        => 'static_front_page',
    677             'control'        => 'dropdown-pages',
    678             'type'           => 'option',
    679             'capability'     => 'manage_options',
    680             'visibility'     => array( 'show_on_front', 'page' ),
    681         ) );
    682 
    683         $this->add_setting( 'page_for_posts', array(
    684             'label'          => __( 'Posts page' ),
    685         //  'theme_supports' => 'static-front-page',
    686             'section'        => 'static_front_page',
    687             'control'        => 'dropdown-pages',
    688             'type'           => 'option',
    689             'capability'     => 'manage_options',
    690             'visibility'     => array( 'show_on_front', 'page' ),
     768        ) );
     769
     770        $this->add_control( 'page_for_posts', array(
     771            'label'      => __( 'Posts page' ),
     772            'section'    => 'static_front_page',
     773            'type'       => 'dropdown-pages',
     774            'visibility' => array( 'show_on_front', 'page' ),
    691775        ) );
    692776
     
    698782
    699783        $this->add_setting( 'blogname', array(
    700             'label'          => __( 'Site Title' ),
    701             'section'        => 'strings',
    702             'default'        => get_option( 'blogname' ),
    703             'type'           => 'option',
    704             'capability'     => 'manage_options',
     784            'default'    => get_option( 'blogname' ),
     785            'type'       => 'option',
     786            'capability' => 'manage_options',
     787        ) );
     788
     789        $this->add_control( 'blogname', array(
     790            'label'      => __( 'Site Title' ),
     791            'section'    => 'strings',
    705792        ) );
    706793
    707794        $this->add_setting( 'blogdescription', array(
    708             'label'          => __( 'Tagline' ),
    709             'section'        => 'strings',
    710             'default'        => get_option( 'blogdescription' ),
    711             'type'           => 'option',
    712             'capability'     => 'manage_options',
     795            'default'    => get_option( 'blogdescription' ),
     796            'type'       => 'option',
     797            'capability' => 'manage_options',
     798        ) );
     799
     800        $this->add_control( 'blogdescription', array(
     801            'label'      => __( 'Tagline' ),
     802            'section'    => 'strings',
    713803        ) );
    714804    }
  • trunk/wp-includes/customize-controls.php

    r20276 r20295  
    9696    $settings = array(
    9797        'preview'  => esc_url( home_url( '/', $scheme ) ),
     98        'settings' => array(),
    9899        'controls' => array(),
    99100        'prefix'   => WP_Customize_Setting::name_prefix,
     
    101102
    102103    foreach ( $this->settings as $id => $setting ) {
    103         $settings['controls'][ $id ] = array(
     104        $settings['settings'][ $id ] = array(
    104105            'value'   => $setting->value(),
    105             'control' => $setting->control,
    106             'params'  => $setting->control_params,
    107106        );
     107    }
    108108
    109         if ( $setting->visibility ) {
    110             if ( is_string( $setting->visibility ) ) {
     109    foreach ( $this->controls as $id => $control ) {
     110        $settings['controls'][ $id ] = $control->json();
     111
     112        if ( $control->visibility ) {
     113            if ( is_string( $control->visibility ) ) {
    111114                $settings['controls'][ $id ]['visibility'] = array(
    112                     'id'    => $setting->visibility,
     115                    'id'    => $control->visibility,
    113116                    'value' => true,
    114117                );
    115118            } else {
    116119                $settings['controls'][ $id ]['visibility'] = array(
    117                     'id'    => $setting->visibility[0],
    118                     'value' => $setting->visibility[1],
     120                    'id'    => $control->visibility[0],
     121                    'value' => $control->visibility[1],
    119122                );
    120123            }
  • trunk/wp-includes/js/customize-base.dev.js

    r20257 r20295  
    398398        add: function( id, value ) {
    399399            if ( this.has( id ) )
    400                 return;
     400                return this.value( id );
    401401
    402402            this._value[ id ] = value;
  • trunk/wp-includes/js/customize-controls.dev.js

    r20290 r20295  
    77     * - method    - The method to use for syncing. Supports 'refresh' and 'postMessage'.
    88     */
    9     api.Control = api.Value.extend({
     9    api.Setting = api.Value.extend({
    1010        initialize: function( id, value, options ) {
    11             var name = '[name="' + api.settings.prefix + id + '"]';
    12 
    13             this.params = {};
     11            var element;
     12
    1413            api.Value.prototype.initialize.call( this, value, options );
    1514
    1615            this.id = id;
    17             this.container = $( '#customize-control-' + id );
    18             this.element = this.element || new api.Element( this.container.find( name ) );
    19 
    2016            this.method = this.method || 'refresh';
     17
     18            element = $( '<input />', {
     19                type:  'hidden',
     20                value: this.get(),
     21                name:  api.settings.prefix + id
     22            });
     23
     24            element.appendTo( this.previewer.form );
     25            this.element = new api.Element( element );
    2126
    2227            this.element.link( this );
     
    3540    });
    3641
     42    api.Control = api.Class.extend({
     43        initialize: function( id, options ) {
     44            var control = this,
     45                nodes, radios, settings;
     46
     47            this.params = {};
     48            $.extend( this, options || {} );
     49
     50            this.id = id;
     51            this.container = $( '#customize-control-' + id );
     52
     53            settings = $.map( this.params.settings, function( value ) {
     54                return value;
     55            });
     56
     57            api.apply( api, settings.concat( function() {
     58                var key;
     59
     60                control.settings = {};
     61                for ( key in control.params.settings ) {
     62                    control.settings[ key ] = api( control.params.settings[ key ] );
     63                }
     64
     65                control.setting = control.settings['default'] || null;
     66                control.ready();
     67            }) );
     68
     69            control.elements = [];
     70
     71            nodes  = this.container.find('[data-customize-setting-link]');
     72            radios = {};
     73
     74            nodes.each( function() {
     75                var node = $(this),
     76                    name;
     77
     78                if ( node.is(':radio') ) {
     79                    name = node.prop('name');
     80                    if ( radios[ name ] )
     81                        return;
     82
     83                    radios[ name ] = true;
     84                    node = nodes.filter( '[name="' + name + '"]' );
     85                }
     86
     87                api( node.data('customizeSettingLink'), function( setting ) {
     88                    var element = new api.Element( node );
     89                    control.elements.push( element );
     90                    element.link( setting ).bind( function( to ) {
     91                        setting( to );
     92                    });
     93                });
     94            });
     95        },
     96        ready: function() {}
     97    });
     98
    3799    api.ColorControl = api.Control.extend({
    38         initialize: function( id, value, options ) {
    39             var self = this,
     100        ready: function() {
     101            var control = this,
    40102                picker, ui, text, toggle, update;
    41 
    42             api.Control.prototype.initialize.call( this, id, value, options );
    43103
    44104            picker = this.container.find( '.color-picker' );
     
    48108                color = '#' + color;
    49109                toggle.css( 'background', color );
    50                 self.farbtastic.setColor( color );
     110                control.farbtastic.setColor( color );
    51111            };
    52 
    53             this.input = new api.Element( ui.find( 'input' ) ); // Find text input.
    54 
    55             this.link( this.input );
    56             this.input.link( this );
    57112
    58113            picker.on( 'click', 'a', function() {
     
    61116
    62117            this.farbtastic = $.farbtastic( picker.find('.farbtastic-placeholder'), function( color ) {
    63                 self.set( color.replace( '#', '' ) );
    64             });
    65 
    66             this.bind( update );
    67             update( this() );
    68         },
    69         validate: function( to ) {
    70             return /^[a-fA-F0-9]{3}([a-fA-F0-9]{3})?$/.test( to ) ? to : null;
     118                control.setting.set( color.replace( '#', '' ) );
     119            });
     120
     121            this.setting.bind( update );
     122            update( this.setting() );
    71123        }
     124        // ,
     125        //      validate: function( to ) {
     126        //          return /^[a-fA-F0-9]{3}([a-fA-F0-9]{3})?$/.test( to ) ? to : null;
     127        //      }
    72128    });
    73129
    74130    api.UploadControl = api.Control.extend({
    75         initialize: function( id, value, options ) {
     131        ready: function() {
    76132            var control = this;
    77133
    78             api.Control.prototype.initialize.call( this, id, value, options );
    79134            this.params.removed = this.params.removed || '';
    80135
     
    82137                browser: this.container.find('.upload'),
    83138                success: function( attachment ) {
    84                     control.set( attachment.url );
     139                    control.setting.set( attachment.url );
    85140                }
    86141            });
     
    88143            this.remover = this.container.find('.remove');
    89144            this.remover.click( function( event ) {
    90                 control.set( control.params.removed );
     145                control.setting.set( control.params.removed );
    91146                event.preventDefault();
    92147            });
    93148
    94             this.bind( this.removerVisibility );
    95             this.removerVisibility( this.get() );
     149            this.removerVisibility = $.proxy( this.removerVisibility, this );
     150            this.setting.bind( this.removerVisibility );
     151            this.removerVisibility( this.setting.get() );
    96152
    97153            if ( this.params.context )
     
    104160
    105161    api.ImageControl = api.UploadControl.extend({
    106         initialize: function( id, value, options ) {
     162        ready: function( id, value, options ) {
    107163            var control = this;
    108164
    109             api.UploadControl.prototype.initialize.call( this, id, value, options );
    110 
    111             this.thumbnail = this.container.find('.thumbnail img');
    112             this.bind( this.thumbnailSrc );
     165            this.thumbnail    = this.container.find('.thumbnail img');
     166            this.thumbnailSrc = $.proxy( this.thumbnailSrc, this );
     167            this.setting.bind( this.thumbnailSrc );
    113168
    114169            this.library = this.container.find('.library');
     
    138193
    139194            this.library.on( 'click', 'a', function( event ) {
    140                 control.set( $(this).attr('href') );
     195                control.setting.set( $(this).attr('href') );
    141196                event.preventDefault();
    142197            });
     
    152207    // Change objects contained within the main customize object to Settings.
    153208    api.defaultConstructor = api.Setting;
     209
     210    // Create the collection of Control objects.
     211    api.control = new api.Values({ defaultConstructor: api.Control });
    154212
    155213    api.Previewer = api.Messenger.extend({
     
    273331     * ===================================================================== */
    274332
    275     api.controls = {
     333    api.controlConstructor = {
    276334        color:  api.ColorControl,
    277335        upload: api.UploadControl,
     
    290348        });
    291349
     350        $.each( api.settings.settings, function( id, data ) {
     351            api.set( id, id, data.value, {
     352                previewer: previewer
     353            } );
     354        });
     355
    292356        $.each( api.settings.controls, function( id, data ) {
    293             var constructor = api.controls[ data.control ] || api.Control,
     357            var constructor = api.controlConstructor[ data.type ] || api.Control,
    294358                control;
    295359
    296             control = api.add( id, new constructor( id, data.value, {
     360            control = api.control.add( id, new constructor( id, {
    297361                params: data.params,
    298362                previewer: previewer
     
    327391
    328392        // Background color uses postMessage by default
    329         api( 'background_color', function( control ) {
     393        api.control( 'background_color', function( control ) {
    330394            control.method = 'postMessage';
    331395        });
     396
     397        api.control( 'display_header_text', function( control ) {
     398            var last = '';
     399
     400            control.elements[0].unlink();
     401
     402            control.element = new api.Element( control.container.find('input') );
     403            control.element.set( 'blank' !== control.setting() );
     404
     405            control.element.bind( function( to ) {
     406                if ( ! to )
     407                    last = api.get( 'header_textcolor' );
     408
     409                control.setting.set( to ? last : 'blank' );
     410            });
     411
     412            control.setting.bind( function( to ) {
     413                control.element.set( 'blank' !== to );
     414            });
     415        });
    332416    });
    333417
  • trunk/wp-includes/js/plupload/wp-plupload.dev.js

    r20179 r20295  
    6767
    6868        this.uploader.bind( 'FileUploaded', function( up, file, response ) {
    69             response = JSON.parse( response.response );
     69            try {
     70                response = JSON.parse( response.response );
     71            } catch ( e ) {
     72                return self.error( pluploadL10n.default_error, e );
     73            }
    7074
    7175            if ( ! response || ! response.type || ! response.data )
Note: See TracChangeset for help on using the changeset viewer.