Make WordPress Core

Ticket #35616: 35616.1.diff

File 35616.1.diff, 3.2 KB (added by westonruter, 9 years ago)

Mark dynamically-created settings as dirty so they will get posted

  • src/wp-admin/js/customize-controls.js

    diff --git src/wp-admin/js/customize-controls.js src/wp-admin/js/customize-controls.js
    index 0abfb77..4901b56 100644
     
    33453345                                                        value._dirty = false;
    33463346                                                } );
    33473347
     3348                                                api.previewer.send( 'saved', response );
     3349
    33483350                                                api.trigger( 'saved', response );
    33493351                                        } );
    33503352                                };
  • src/wp-includes/class-wp-customize-manager.php

    diff --git src/wp-includes/class-wp-customize-manager.php src/wp-includes/class-wp-customize-manager.php
    index f5aa604..aa73ed7 100644
    final class WP_Customize_Manager { 
    805805                        'activePanels' => array(),
    806806                        'activeSections' => array(),
    807807                        'activeControls' => array(),
     808                        '_dirty' => array_keys( $this->unsanitized_post_values() ),
    808809                );
    809810
    810811                if ( 2 == $this->nonce_tick ) {
  • src/wp-includes/js/customize-preview.js

    diff --git src/wp-includes/js/customize-preview.js src/wp-includes/js/customize-preview.js
    index 4bf625e..1d18027 100644
     
    8484        });
    8585
    8686        $( function() {
     87                var bg, setValue;
     88
    8789                api.settings = window._wpCustomizeSettings;
    88                 if ( ! api.settings )
     90                if ( ! api.settings ) {
    8991                        return;
    90 
    91                 var bg;
     92                }
    9293
    9394                api.preview = new api.Preview({
    9495                        url: window.location.href,
    9596                        channel: api.settings.channel
    9697                });
    9798
     99                /**
     100                 * Create/update a setting value.
     101                 *
     102                 * @param {string}  id            - Setting ID.
     103                 * @param {*}       value         - Setting value.
     104                 * @param {boolean} [createDirty] - Whether to create a setting as dirty. Defaults to false.
     105                 */
     106                setValue = function( id, value, createDirty ) {
     107                        var setting = api( id );
     108                        if ( setting ) {
     109                                setting.set( value );
     110                        } else {
     111                                createDirty = createDirty || false;
     112                                setting = api.create( id, value, {
     113                                        id: id
     114                                } );
     115
     116                                // Mark dynamically-created settings as dirty so they will get posted.
     117                                if ( createDirty ) {
     118                                        setting._dirty = true;
     119                                }
     120                        }
     121                };
     122
    98123                api.preview.bind( 'settings', function( values ) {
    99                         $.each( values, function( id, value ) {
    100                                 if ( api.has( id ) )
    101                                         api( id ).set( value );
    102                                 else
    103                                         api.create( id, value );
    104                         });
     124                        $.each( values, setValue );
    105125                });
    106126
    107127                api.preview.trigger( 'settings', api.settings.values );
    108128
    109                 api.preview.bind( 'setting', function( args ) {
    110                         var value;
    111 
    112                         args = args.slice();
     129                $.each( api.settings._dirty, function( i, id ) {
     130                        var setting = api( id );
     131                        if ( setting ) {
     132                                setting._dirty = true;
     133                        }
     134                } );
    113135
    114                         if ( value = api( args.shift() ) )
    115                                 value.set.apply( value, args );
     136                api.preview.bind( 'setting', function( args ) {
     137                        var createDirty = true;
     138                        setValue.apply( null, args.concat( createDirty ) );
    116139                });
    117140
    118141                api.preview.bind( 'sync', function( events ) {
     
    130153                        api.preview.send( 'documentTitle', document.title );
    131154                });
    132155
     156                api.preview.bind( 'saved', function( response ) {
     157                        api.trigger( 'saved', response );
     158                } );
     159
     160                api.bind( 'saved', function() {
     161                        api.each( function( setting ) {
     162                                setting._dirty = false;
     163                        } );
     164                } );
     165
    133166                /*
    134167                 * Send a message to the parent customize frame with a list of which
    135168                 * containers and controls are active.