WordPress.org

Make WordPress Core

Ticket #12722: 12722.diff

File 12722.diff, 6.5 KB (added by wonderboymusic, 15 months ago)
  • wp-includes/widgets.php

     
    901901                do_action( 'dynamic_sidebar', $wp_registered_widgets[$id] ); 
    902902 
    903903                if ( is_callable($callback) ) { 
     904 
     905                        if ( wp_check_widget_lock( $id ) ) 
     906                                _admin_notice_widget_locked( $wp_registered_widgets[$id] ); 
     907 
    904908                        call_user_func_array($callback, $params); 
    905909                        $did_one = true; 
    906910                } 
     
    12681272 
    12691273        return $sidebars_widgets; 
    12701274} 
     1275 
     1276/** 
     1277 * Check to see if the post is currently being edited by another user. 
     1278 * 
     1279 * @since 3.6.0 
     1280 * 
     1281 * @param int $id Widget id 
     1282 * @return bool|int False: not locked or locked by current user. Int: user ID of user with lock. 
     1283 */ 
     1284function wp_check_widget_lock( $id ) { 
     1285        $locks = get_option( '_widgets_lock' ); 
     1286        if ( empty( $locks[$id] ) ) 
     1287                return; 
     1288 
     1289        $lasts = get_option( '_widgets_last' ); 
     1290        $last = $lasts[$id]; 
     1291 
     1292        $lock = explode( ':', $locks[$id] ); 
     1293        $time = $lock[0]; 
     1294        $user = isset( $lock[1] ) ? $lock[1] : $last; 
     1295 
     1296        $time_window = apply_filters( 'wp_check_widget_lock_window', AUTOSAVE_INTERVAL * 2 ); 
     1297 
     1298        if ( $time && $time > time() - $time_window && $user != get_current_user_id() ) 
     1299                return $user; 
     1300 
     1301        return false; 
     1302} 
     1303 
     1304/** 
     1305 * Mark the widget as currently being edited by the current user 
     1306 * 
     1307 * @since 3.6.0 
     1308 * 
     1309 * @param int $id ID of the widget to be locked 
     1310 * @return bool|array Returns false if there is no current user, or an array of the lock time and the user ID. 
     1311 */ 
     1312function wp_set_widget_lock( $id ) { 
     1313        if ( 0 == ( $user_id = get_current_user_id() ) ) 
     1314                return false; 
     1315 
     1316        $now = time(); 
     1317        $lock = "$now:$user_id"; 
     1318 
     1319        $locks = get_option( '_widgets_lock' ); 
     1320        $locks[$id] = $lock; 
     1321 
     1322        update_option( '_widgets_lock', $locks ); 
     1323        return array( $now, $user_id ); 
     1324} 
     1325 
     1326/** 
     1327 * Mark the widget's last editor as the current user 
     1328 * 
     1329 * @since 3.6.0 
     1330 * 
     1331 * @param string $id ID of the widget to being edited 
     1332 * @return bool|array Returns false if is no current user 
     1333 */ 
     1334function wp_set_widget_last( $id ) { 
     1335        if ( 0 == ( $user_id = get_current_user_id() ) ) 
     1336                return; 
     1337 
     1338        $lasts = get_option( '_widget_lasts' ); 
     1339 
     1340        if ( ! empty( $lasts[$id] ) && $lasts[$id] == get_current_user_id() ) 
     1341                return $lasts[$id]; 
     1342 
     1343        $lasts[$id] = $user_id; 
     1344        update_option( '_widget_lasts', $lasts ); 
     1345 
     1346        return $user_id; 
     1347} 
     1348 
     1349/** 
     1350 * Outputs the notice message to say that someone else is editing this post at the moment. 
     1351 * 
     1352 * @since 3.6.0 
     1353 * @return none 
     1354 */ 
     1355function _admin_notice_widget_locked( $widget ) { 
     1356        $locks = get_option( '_widgets_lock' ); 
     1357        $lasts = get_option( '_widgets_last' ); 
     1358 
     1359        $last = 0; 
     1360        if ( ! empty( $lasts ) ) 
     1361                $last = $lasts[$widget['id']]; 
     1362 
     1363        $lock = explode( ':', $locks[$widget['id']] ); 
     1364        $user = isset( $lock[1] ) ? $lock[1] : $last; 
     1365        if ( ! empty( $user ) ) { 
     1366                $last_user = get_userdata( $user ); 
     1367                $last_user_name = $last_user->display_name; 
     1368        } else { 
     1369                $last_user_name = __( 'Somebody' ); 
     1370        } 
     1371 
     1372        $message = sprintf( __( 'Warning: %s is currently editing the <strong>%s</strong> widget.' ), 
     1373                esc_html( $last_user_name ), 
     1374                esc_html( $widget['name'] ) 
     1375        ); 
     1376        printf( '<div class="widget-error" data-id="%s"><p>%s</p></div>', $widget['id'], $message ); 
     1377} 
     1378 No newline at end of file 
  • wp-admin/includes/ajax-actions.php

     
    15661566                } 
    15671567        } 
    15681568 
     1569        wp_set_widget_lock( $widget_id ); 
     1570        wp_set_widget_last( $widget_id ); 
     1571 
    15691572        if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) { 
    15701573                $sidebars[$sidebar_id] = $sidebar; 
    15711574                wp_set_sidebars_widgets($sidebars); 
  • wp-admin/js/widgets.js

     
    103103                                ui.item.css({margin:'', 'width':''}); 
    104104                        }, 
    105105                        stop: function(e,ui) { 
     106                                wpWidgets.fixErrors(ui.item.parent()); 
     107 
    106108                                if ( ui.item.hasClass('ui-draggable') && ui.item.data('draggable') ) 
    107109                                        ui.item.draggable('destroy'); 
    108110 
     
    174176                }); 
    175177        }, 
    176178 
     179        fixErrors : function (sb, del) { 
     180                sb.find('div.widget-error').hide().each(function (i, error) { 
     181                        error = $(error); 
     182 
     183                        var node = error.clone(), wdgt = error.parent().find('[id$="' + error.data('id') + '"]'); 
     184                        if ( error.remove() && wdgt.length && ( !del || ( del.prop('id') != wdgt.prop('id') ) ) ) 
     185                                wdgt.before(node.show()); 
     186 
     187                }); 
     188        }, 
     189 
    177190        saveOrder : function(sb) { 
    178191                if ( sb ) 
    179192                        $('#' + sb).closest('div.widgets-holder-wrap').find('.spinner').css('display', 'inline-block'); 
     
    197210        }, 
    198211 
    199212        save : function(widget, del, animate, order) { 
    200                 var sb = widget.closest('div.widgets-sortables').attr('id'), data = widget.find('form').serialize(), a; 
     213                var sortables = widget.closest('div.widgets-sortables'), 
     214                sb = sortables.attr('id'), 
     215                data = widget.find('form').serialize(), a; 
    201216                widget = $(widget); 
    202217                $('.spinner', widget).show(); 
    203218 
     
    234249                                        widget.remove(); 
    235250                                        wpWidgets.resize(); 
    236251                                } 
     252 
     253                                wpWidgets.fixErrors(sortables, widget); 
    237254                        } else { 
    238255                                $('.spinner').hide(); 
    239256                                if ( r && r.length > 2 ) { 
     
    241258                                        wpWidgets.appendTitle(widget); 
    242259                                        wpWidgets.fixLabels(widget); 
    243260                                } 
     261                                wpWidgets.fixErrors(sortables); 
    244262                        } 
    245263                        if ( order ) 
    246264                                wpWidgets.saveOrder(); 
  • wp-admin/css/colors-fresh.css

     
    275275} 
    276276 
    277277div.error, 
     278div.widget-error, 
    278279.login #login_error { 
    279280        background-color: #ffebe8; 
    280281        border-color: #c00; 
    281282} 
    282283 
    283 div.error a { 
     284div.error a, 
     285div.widget-error a { 
    284286        color: #c00; 
    285287} 
    286288 
  • wp-admin/css/wp-admin.css

     
    498498.widefat, 
    499499div.updated, 
    500500div.error, 
     501div.widget-error, 
    501502.wrap .add-new-h2, 
    502503textarea, 
    503504input[type="text"], 
     
    651652} 
    652653 
    653654div.updated, 
    654 div.error { 
     655div.error, 
     656div.widget-error { 
    655657        padding: 0 0.6em; 
    656658        margin: 5px 15px 2px; 
    657659} 
    658660 
    659661div.updated p, 
    660 div.error p { 
     662div.error p, 
     663div.widget-error p { 
    661664        margin: 0.5em 0; 
    662665        padding: 2px; 
    663666} 
     
    80718074        padding: 15px 0 0; 
    80728075} 
    80738076 
     8077div.widget-error { 
     8078        margin-bottom: 15px; 
     8079} 
     8080 
    80748081#available-widgets .widget-holder { 
    80758082        padding: 7px 5px 0; 
    80768083}