[wp-trac] [WordPress Trac] #37274: Facilitate updating/extending Customizer setting values that are objects
WordPress Trac
noreply at wordpress.org
Mon Jul 4 20:22:47 UTC 2016
#37274: Facilitate updating/extending Customizer setting values that are objects
-------------------------+----------------------------
Reporter: westonruter | Owner:
Type: enhancement | Status: new
Priority: normal | Milestone: Future Release
Component: Customize | Version: 3.4
Severity: normal | Keywords:
Focuses: javascript |
-------------------------+----------------------------
There is bit of a dance to work with setting values that are objects.
Consider a `mailing_address` setting that represents a street address:
{{{#!json
{
"street": "123 Fictional St.",
"city": "Portland",
"state": "OR",
"zip": "97201"
}
}}}
Getting the value is as simple as `wp.customize( 'mailing_address'
).get()`, but updating the value is not so simple. To change the `street`
part of this setting, the following is required:
{{{#!js
var value = wp.customize( 'mailing_address' ).get();
value = _.clone( value );
value.street = '123 Imaginary Ave';
wp.customize( 'mailing_address' ).set( value );
}}}
The clone is required because objects are passed by reference, and if the
`value` were to set directly, the subsequent `set` would not trigger a
`change` event.
Widgets and nav menus use objects as values in Core. Widgets aren't
manipulated directly in JS (until #33507) but nav menus and nav menu items
are. Here's the code for managing how a nav menu's name gets changed when
the nav menu's name field is updated:
{{{#!js
control.nameElement.bind(function( value ) {
var settingValue = control.setting();
if ( settingValue && settingValue.name !== value ) {
settingValue = _.clone( settingValue );
settingValue.name = value;
control.setting.set( settingValue );
}
});
}}}
To make it easier to work with setting values as objects, we could
introduce a `wp.customize.Value#setExtend` method that allows an object
value to be extended in the same way that `setState` works in React, take
an object of key/value pairs that are merged on top of the existing value.
Here is an example implementation:
{{{#!js
wp.customize.Value.prototype.setExtend = function( props ) {
var value = _.clone( this.get() );
_.extend( value, props );
this.set( value );
};
}}}
With this, to update the `mailing_address` setting value property in the
above example could be changed to simply:
{{{#!js
wp.customize( 'mailing_address' ).setExtend( { street: '123 Imaginary Ave'
} )
}}}
See also #26061.
--
Ticket URL: <https://core.trac.wordpress.org/ticket/37274>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list