Make WordPress Core

Changeset 38513


Ignore:
Timestamp:
09/02/2016 10:34:48 PM (10 years ago)
Author:
westonruter
Message:

Customize: Fix php warning due to WP_Customize_Manager::prepare_setting_validity_for_js() incorrectly assuming that WP_Error will only ever have arrays in its $error_data.

  • Eliminates the server mutating the a WP_Error's $error_data to merge-in a $from_server flag (since it may not be an array to begin with). Instead it defers to the client to add a fromServer param on any Notification instances created from server-sent errors.
  • Ensures that notifications will be re-rendered if a notification's message changes but the data and type remain the same.
  • Adds explicit support for the Notification class to have a setting property, ensuring that the property is set whereas previously it was dropped.

Fixes #37890.
Props westonruter, dlh.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/js/customize-controls.js

    r38492 r38513  
    34623462                                if ( _.isObject( validity ) ) {
    34633463                                        _.each( validity, function( params, code ) {
    3464                                                 var notification = new api.Notification( code, params ), existingNotification, needsReplacement = false;
     3464                                                var notification, existingNotification, needsReplacement = false;
     3465                                                notification = new api.Notification( code, _.extend( { fromServer: true }, params ) );
    34653466
    34663467                                                // Remove existing notification if already exists for code but differs in parameters.
    34673468                                                existingNotification = setting.notifications( notification.code );
    34683469                                                if ( existingNotification ) {
    3469                                                         needsReplacement = ( notification.type !== existingNotification.type ) || ! _.isEqual( notification.data, existingNotification.data );
     3470                                                        needsReplacement = notification.type !== existingNotification.type || notification.message !== existingNotification.message || ! _.isEqual( notification.data, existingNotification.data );
    34703471                                                }
    34713472                                                if ( needsReplacement ) {
     
    37163717                                        api.each( function( setting ) {
    37173718                                                setting.notifications.each( function( notification ) {
    3718                                                         if ( 'error' === notification.type && ( ! notification.data || ! notification.data.from_server ) ) {
     3719                                                        if ( 'error' === notification.type && ! notification.fromServer ) {
    37193720                                                                invalidSettings.push( setting.id );
    37203721                                                        }
  • trunk/src/wp-includes/class-wp-customize-manager.php

    r38470 r38513  
    10471047                        $notification = array();
    10481048                        foreach ( $validity->errors as $error_code => $error_messages ) {
    1049                                 $error_data = $validity->get_error_data( $error_code );
    1050                                 if ( is_null( $error_data ) ) {
    1051                                         $error_data = array();
    1052                                 }
    1053                                 $error_data = array_merge(
    1054                                         $error_data,
    1055                                         array( 'from_server' => true )
    1056                                 );
    10571049                                $notification[ $error_code ] = array(
    10581050                                        'message' => join( ' ', $error_messages ),
    1059                                         'data' => $error_data,
     1051                                        'data' => $validity->get_error_data( $error_code ),
    10601052                                );
    10611053                        }
  • trunk/src/wp-includes/js/customize-base.js

    r37476 r38513  
    763763         * @since 4.6.0
    764764         *
    765          * @param {string} code                The error code.
    766          * @param {object} params              Params.
    767          * @param {string} params.message      The error message.
    768          * @param {string} [params.type=error] The notification type.
    769          * @param {*}      [params.data]       Any additional data.
     765         * @param {string}  code - The error code.
     766         * @param {object}  params - Params.
     767         * @param {string}  params.message=null - The error message.
     768         * @param {string}  [params.type=error] - The notification type.
     769         * @param {boolean} [params.fromServer=false] - Whether the notification was server-sent.
     770         * @param {string}  [params.setting=null] - The setting ID that the notification is related to.
     771         * @param {*}       [params.data=null] - Any additional data.
    770772         */
    771773        api.Notification = api.Class.extend({
    772774                initialize: function( code, params ) {
     775                        var _params;
    773776                        this.code = code;
    774                         this.message = params.message;
    775                         this.type = params.type || 'error';
    776                         this.data = params.data || null;
     777                        _params = _.extend(
     778                                {
     779                                        message: null,
     780                                        type: 'error',
     781                                        fromServer: false,
     782                                        data: null,
     783                                        setting: null
     784                                },
     785                                params
     786                        );
     787                        delete _params.code;
     788                        _.extend( this, _params );
    777789                }
    778790        });
  • trunk/tests/phpunit/tests/customize/manager.php

    r37942 r38513  
    304304                $this->assertTrue( $this->manager->prepare_setting_validity_for_js( true ) );
    305305                $error = new WP_Error();
    306                 $error->add( 'bad_letter', 'Bad letter' );
    307                 $error->add( 'bad_letter', 'Bad letra' );
     306                $error->add( 'bad_letter', 'Bad letter', 'A' );
     307                $error->add( 'bad_letter', 'Bad letra', 123 );
    308308                $error->add( 'bad_number', 'Bad number', array( 'number' => 123 ) );
    309309                $validity = $this->manager->prepare_setting_validity_for_js( $error );
     
    314314                        $this->assertEquals( join( ' ', $messages ), $validity[ $code ]['message'] );
    315315                        $this->assertArrayHasKey( 'data', $validity[ $code ] );
    316                         $this->assertArrayHasKey( 'from_server', $validity[ $code ]['data'] );
     316                        $this->assertEquals( $validity[ $code ]['data'], $error->get_error_data( $code ) );
    317317                }
    318318                $this->assertArrayHasKey( 'number', $validity['bad_number']['data'] );
  • trunk/tests/qunit/wp-admin/js/customize-base.js

    r37476 r38513  
    165165                        'message': 'Hello World',
    166166                        'type': 'update',
     167                        'setting': 'blogname',
     168                        'fromServer': true,
    167169                        'data': { 'foo': 'bar' }
    168170                } );
     
    171173                assert.equal( 'Hello World', notification.message );
    172174                assert.equal( 'update', notification.type );
     175                assert.equal( 'blogname', notification.setting );
     176                assert.equal( true, notification.fromServer );
    173177                assert.deepEqual( { 'foo': 'bar' }, notification.data );
    174178
Note: See TracChangeset for help on using the changeset viewer.