WordPress.org

Make WordPress Core


Ignore:
Timestamp:
04/11/2009 02:37:24 PM (11 years ago)
Author:
azaozz
Message:

Widgets page, first run, see #9511

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/widgets.php

    r10822 r10912  
    5050     * This function should check that $new_instance is set correctly.
    5151     * The newly calculated value of $instance should be returned.
     52     * If "false" is returned, the instance won't be saved/updated.
    5253     *
    5354     * @param array $new_instance New settings for this instance as input by the user via form()
    5455     * @param array $old_instance Old settings for this instance
    55      * @return array Settings to save
     56     * @return array Settings to save or bool false to cancel saving
    5657     */
    5758    function update($new_instance, $old_instance) {
     
    192193                $this_sidebar = array();
    193194
    194             foreach ( $this_sidebar as $_widget_id )    {
    195                 // Remove all widgets of this type from the sidebar. We'll add the
    196                 // new data in a second. This makes sure we don't get any duplicate
    197                 // data since widget ids aren't necessarily persistent across multiple
    198                 // updates
    199                 if ( $this->_get_display_callback() == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) {
    200                     $number = $wp_registered_widgets[$_widget_id]['params'][0]['number'];
    201                     if( !in_array( $this->id_base . '-' . $number, (array)$_POST['widget-id'] ) ) {
    202                         // the widget has been removed.
     195            if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) {
     196                // Delete the settings for this instance of the widget
     197                if ( isset($_POST['widget-id']) )
     198                    $del_id = $_POST['widget-id'];
     199                else
     200                    return;
     201
     202                if ( $this->_get_display_callback() == $wp_registered_widgets[$del_id]['callback'] && isset($wp_registered_widgets[$del_id]['params'][0]['number']) ) {
     203                    $number = $wp_registered_widgets[$del_id]['params'][0]['number'];
     204
     205                    if ( $this->id_base . '-' . $number == $del_id ) {
    203206                        unset($all_instances[$number]);
    204207                    }
    205208                }
    206             }
    207 
    208             foreach ( (array) $_POST['widget-' . $this->id_base] as $number => $new_instance ) {
    209                 $new_instance = stripslashes_deep($new_instance);
    210                 $this->_set($number);
    211 
    212                 if ( !isset($new_instance['submit']) )
    213                     continue;
    214 
    215                 if ( isset($all_instances[$number]) )
    216                     $instance = $this->update($new_instance, $all_instances[$number]);
    217                 else
    218                     $instance = $this->update($new_instance, array());
    219 
    220                 if ( !empty($instance) )
    221                     $all_instances[$number] = $instance;
     209            } else {
     210                foreach ( (array) $_POST['widget-' . $this->id_base] as $number => $new_instance ) {
     211                    $new_instance = stripslashes_deep($new_instance);
     212                    $this->_set($number);
     213
     214                    if ( isset($all_instances[$number]) )
     215                        $instance = $this->update($new_instance, $all_instances[$number]);
     216                    else
     217                        $instance = $this->update($new_instance, array());
     218
     219                    if ( false !== $instance )
     220                        $all_instances[$number] = $instance;
     221                }
    222222            }
    223223
     
    237237
    238238        if ( -1 == $widget_args['number'] ) {
    239             // We echo out a form where 'number' can be set later via JS
    240             $this->_set('%i%');
     239            // We echo out a form where 'number' can be set later
     240            $this->_set('__i__');
    241241            $instance = array();
    242242        } else {
     
    246246
    247247        $this->form($instance);
    248 ?>
    249         <input type="hidden" id="<?php echo $this->get_field_id('submit'); ?>" name="<?php echo $this->get_field_name('submit'); ?>" value="1" />
    250 <?php
    251248    }
    252249
     
    254251    function _register_one($number = -1) {
    255252        wp_register_sidebar_widget( $this->id, $this->name, $this->_get_display_callback(), $this->widget_options, array( 'number' => $number ) );
    256         _register_widget_update_callback(   $this->id, $this->name, $this->_get_update_callback(), $this->control_options, array( 'number' => $number ) );
     253        _register_widget_update_callback( $this->id_base, $this->_get_update_callback(), $this->control_options, array( 'number' => -1 ) );
    257254        _register_widget_form_callback( $this->id, $this->name, $this->_get_form_callback(), $this->control_options, array( 'number' => $number ) );
    258255    }
     
    580577
    581578    $id = strtolower($id);
     579    $update_id = preg_replace( '/-[0-9]+$/', '', $id );
    582580
    583581    if ( empty($control_callback) ) {
    584582        unset($wp_registered_widget_controls[$id]);
    585         unset($wp_registered_widget_updates[$id]);
     583        unset($wp_registered_widget_updates[$update_id]);
    586584        return;
    587585    }
     
    603601    $widget = array_merge($widget, $options);
    604602
    605     $wp_registered_widget_controls[$id] = $wp_registered_widget_updates[$id] = $widget;
    606 }
    607 
    608 function _register_widget_update_callback($id, $name, $update_callback, $options = array()) {
     603    $wp_registered_widget_controls[$id] = $widget;
     604
     605    if ( isset($wp_registered_widget_updates[$update_id]) )
     606        return;
     607
     608    if ( isset($widget['params'][0]['number']) )
     609        $widget['params'][0]['number'] = -1;
     610
     611    unset($widget['width'], $widget['height'], $widget['name'], $widget['id']);
     612    $wp_registered_widget_updates[$update_id] = $widget;
     613}
     614
     615function _register_widget_update_callback($id_base, $update_callback, $options = array()) {
    609616    global $wp_registered_widget_updates;
    610617
    611     $id = strtolower($id);
    612 
    613     if ( empty($update_callback) ) {
    614         unset($wp_registered_widget_updates[$id]);
     618    if ( isset($wp_registered_widget_updates[$id_base]) ) {
     619        if ( empty($update_callback) )
     620            unset($wp_registered_widget_updates[$id_base]);
    615621        return;
    616622    }
    617623
    618     if ( isset($wp_registered_widget_updates[$id]) && !did_action( 'widgets_init' ) )
    619         return;
    620 
    621     $defaults = array('width' => 250, 'height' => 200 ); // height is never used
    622     $options = wp_parse_args($options, $defaults);
    623     $options['width'] = (int) $options['width'];
    624     $options['height'] = (int) $options['height'];
    625 
    626624    $widget = array(
    627         'name' => $name,
    628         'id' => $id,
    629625        'callback' => $update_callback,
    630         'params' => array_slice(func_get_args(), 4)
     626        'params' => array_slice(func_get_args(), 3)
    631627    );
     628
    632629    $widget = array_merge($widget, $options);
    633 
    634     $wp_registered_widget_updates[$id] = $widget;
     630    $wp_registered_widget_updates[$id_base] = $widget;
    635631}
    636632
     
    648644        return;
    649645
    650     $defaults = array('width' => 250, 'height' => 200 ); // height is never used
     646    $defaults = array('width' => 250, 'height' => 200 );
    651647    $options = wp_parse_args($options, $defaults);
    652648    $options['width'] = (int) $options['width'];
Note: See TracChangeset for help on using the changeset viewer.