[wp-trac] [WordPress Trac] #31465: Fix JS for sidebar_widgets customizer control to not return undefined items in getWidgetFormControls method

WordPress Trac noreply at wordpress.org
Thu Feb 26 17:31:08 UTC 2015


#31465: Fix JS for sidebar_widgets customizer control to not return undefined items
in getWidgetFormControls method
--------------------------+-------------------------
 Reporter:  westonruter   |       Owner:
     Type:  defect (bug)  |      Status:  new
 Priority:  normal        |   Milestone:  4.2
Component:  Customize     |     Version:  trunk
 Severity:  normal        |  Resolution:
 Keywords:                |     Focuses:  javascript
--------------------------+-------------------------
Description changed by westonruter:

Old description:

> Dynamically-created Customizer settings were introduced in #30936.
> Specifically for widgets in the Customizer, since the dynamic settings
> for widgets get set up before `widgets_init` so that any newly-created
> widget instances will get registered as widgets in
> `$wp_registered_widgets`, the
> `WP_Customize_Widgets::sanitize_sidebar_widgets()` method was changed in
> r31370 to remove the sanitizing check to ensure that all widget IDs in a
> given sidebar correspond to actually-registered widgets.
>
> The side-effect to the sanitization change is that a
> `sidebars_widgets[...]` Customizer setting may end up containing widget
> IDs that do not have corresponding `widget_{id_base}[{number}]` settings.
> This, in turn, causes a problem for
> `wp.customize.controlConstructor.sidebar_widgets.prototype.getWidgetFormControls()`
> which is currently incorrectly assuming that every widget ID in a sidebar
> has a corresponding widget setting/control. If there is no corresponding
> control/setting for a widget ID, then an exception currently gets thrown
> when trying to open the Available Widgets Panel (in
> `wp.customize.Widgets.AvailableWidgetsPanelView.prototype.open()`) due to
> `control` being undefined:
>
> {{{#!js
> // Wide widget controls appear over the preview, and so they need to be
> collapsed when the panel opens
> _( this.currentSidebarControl.getWidgetFormControls() ).each( function(
> control ) {
>         if ( control.params.is_wide ) { // ERROR: control may be
> undefined
>                 control.collapseForm();
>         }
> } );
> }}}
>
> Current installs can be money patched to fix the problem via a plugin
> doing:
>
> {{{#!js
> var oldMethod =
> wp.customize.controlConstructor.sidebar_widgets.prototype.getWidgetFormControls;
> wp.customize.controlConstructor.sidebar_widgets.prototype.getWidgetFormControls
> = function () {
>         return _.filter(
>                 oldMethod.apply( this, arguments ),
>                 function ( control ) {
>                         return !! control;
>                 }
>         );
> };
> }}}

New description:

 Dynamically-created Customizer settings were introduced in #30936.
 Specifically for widgets in the Customizer, since the dynamic settings for
 widgets get set up before `widgets_init` so that any newly-created widget
 instances will get registered as widgets in `$wp_registered_widgets`, the
 `WP_Customize_Widgets::sanitize_sidebar_widgets()` method was changed in
 r31370 to remove the sanitizing check to ensure that all widget IDs in a
 given sidebar correspond to actually-registered widgets.

 The side-effect to the sanitization change is that a
 `sidebars_widgets[...]` Customizer setting may end up containing widget
 IDs that do not have corresponding `widget_{id_base}[{number}]` settings.
 This, in turn, causes a problem for
 `wp.customize.controlConstructor.sidebar_widgets.prototype.getWidgetFormControls()`
 which is currently incorrectly assuming that every widget ID in a sidebar
 has a corresponding widget setting/control. If there is no corresponding
 control/setting for a widget ID, then an exception currently gets thrown
 when trying to open the Available Widgets Panel (in
 `wp.customize.Widgets.AvailableWidgetsPanelView.prototype.open()`) due to
 `control` being undefined:

 {{{#!js
 // Wide widget controls appear over the preview, and so they need to be
 collapsed when the panel opens
 _( this.currentSidebarControl.getWidgetFormControls() ).each( function(
 control ) {
         if ( control.params.is_wide ) { // ERROR: control may be undefined
                 control.collapseForm();
         }
 } );
 }}}

 Current installs can be money patched to fix the problem via a plugin
 doing:

 {{{#!js
 var oldMethod =
 wp.customize.controlConstructor.sidebar_widgets.prototype.getWidgetFormControls;
 wp.customize.controlConstructor.sidebar_widgets.prototype.getWidgetFormControls
 = function () {
         return _.filter(
                 oldMethod.apply( this, arguments ),
                 function ( control ) {
                         return !! control;
                 }
         );
 };
 }}}

 The problem can be easily reproduced in JS by opening the console and
 entering:

 {{{#!js
 wp.customize('sidebars_widgets[sidebar-1]')(
 wp.customize('sidebars_widgets[sidebar-1]')().concat( 'foo-123' ) )
 }}}

 And then attempt to add a widget by opening the available widgets panel.

--

--
Ticket URL: <https://core.trac.wordpress.org/ticket/31465#comment:1>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list