Make WordPress Core


Ignore:
Timestamp:
03/13/2009 11:18:57 PM (17 years ago)
Author:
ryan
Message:

s/WP_Widgets/WP_Widget/ and move class to widgets.php

File:
1 edited

Legend:

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

    r10781 r10782  
    4242 */
    4343$wp_registered_widget_controls = array();
     44
     45/**
     46 * This class must be extended for each widget and WP_Widget::widget(), WP_Widget::update()
     47 * and WP_Widget::form() need to be over-ridden.
     48 *
     49 * @package WordPress
     50 * @subpackage Widgets
     51 * @since 2.8
     52 */
     53class WP_Widget {
     54
     55        var $id_base;           // Root id for all widgets of this type.
     56        var $name;                              // Name for this widget type.
     57        var $widget_options;    // Option array passed to wp_register_sidebar_widget()
     58        var $control_options;   // Option array passed to wp_register_widget_control()
     59
     60        var $number = false;    // Unique ID number of the current instance.
     61        var $id = false;                // Unique ID string of the current instance (id_base-number)
     62        var $updated = false;   // Set true when we update the data after a POST submit - makes sure we don't do it twice.
     63
     64        // Member functions that you must over-ride.
     65
     66        /** Echo the actual widget content. Subclasses should over-ride this function
     67         *      to generate their widget code. */
     68        function widget($args, $instance) {
     69                die('function WP_Widget::widget() must be over-ridden in a sub-class.');
     70        }
     71
     72        /** Update a particular instance.
     73         *      This function should check that $new_instance is set correctly.
     74         *      The newly calculated value of $instance should be returned. */
     75        function update($new_instance, $old_instance) {
     76                die('function WP_Widget::update() must be over-ridden in a sub-class.');
     77        }
     78
     79        /** Echo a control form for the current instance. */
     80        function form($instance) {
     81                die('function WP_Widget::form() must be over-ridden in a sub-class.');
     82        }
     83
     84        // Functions you'll need to call.
     85
     86        /**
     87         * PHP4 constructor
     88         */
     89        function WP_Widget( $id_base, $name, $widget_options = array(), $control_options = array() ) {
     90                $this->__construct( $id_base, $name, $widget_options, $control_options );
     91        }
     92
     93        /**
     94         * PHP5 constructor
     95         *       widget_options: passed to wp_register_sidebar_widget()
     96         *       - description
     97         *       - classname
     98         *       control_options: passed to wp_register_widget_control()
     99         *       - width
     100         *       - height
     101         */
     102        function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) {
     103                $this->id_base = $id_base;
     104                $this->name = $name;
     105                $this->option_name = 'widget_' . $id_base;
     106                $this->widget_options = wp_parse_args( $widget_options, array('classname' => $this->option_name) );
     107                $this->control_options = wp_parse_args( $control_options, array('id_base' => $this->id_base) );
     108
     109                add_action( 'widgets_init', array( &$this, 'register' ) );
     110        }
     111
     112        /** Helper function to be called by form().
     113         *      Returns an HTML name for the field. */
     114        function get_field_name($field_name) {
     115                return 'widget-' . $this->id_base . '[' . $this->number . '][' . $field_name . ']';
     116        }
     117
     118        /** Helper function to be called by form().
     119         *      Returns an HTML id for the field. */
     120        function get_field_id($field_name) {
     121                return 'widget-' . $this->id_base . '-' . $this->number . '-' . $field_name;
     122        }
     123
     124        /** Registers this widget-type.
     125         *      Called during the 'widgets_init' action. */
     126        function register() {
     127                $settings = $this->get_settings();
     128
     129                if ( empty($settings) ) {
     130                        // If there are none, we register the widget's existance with a
     131                        // generic template
     132                        $this->_set(1);
     133                        $this->_register_one();
     134                } elseif ( is_array($settings) ) {
     135                        foreach ( array_keys($settings) as $number ) {
     136                                if ( is_numeric($number) ) {
     137                                        $this->_set($number);
     138                                        $this->_register_one($number);
     139                                }
     140                        }
     141                }
     142        }
     143
     144        // Private Functions. Don't worry about these.
     145
     146        function _set($number) {
     147                $this->number = $number;
     148                $this->id = $this->id_base . '-' . $number;
     149        }
     150
     151        function _get_display_callback() {
     152                return array(&$this, 'display_callback');
     153        }
     154
     155        function _get_control_callback() {
     156                return array(&$this, 'control_callback');
     157        }
     158
     159        /** Generate the actual widget content.
     160         *      Just finds the instance and calls widget().
     161         *      Do NOT over-ride this function. */
     162        function display_callback( $args, $widget_args = 1 ) {
     163                if ( is_numeric($widget_args) )
     164                        $widget_args = array( 'number' => $widget_args );
     165
     166                $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
     167                $this->_set( $widget_args['number'] );
     168                $settings = $this->get_settings();
     169
     170                if ( array_key_exists( $this->number, $settings ) )
     171                        $this->widget($args, $settings[$this->number]);
     172        }
     173
     174        /** Deal with changed settings and generate the control form.
     175         *      Do NOT over-ride this function. */
     176        function control_callback( $widget_args = 1 ) {
     177                global $wp_registered_widgets;
     178
     179                if ( is_numeric($widget_args) )
     180                        $widget_args = array( 'number' => $widget_args );
     181
     182                $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
     183                $all_instances = $this->get_settings();
     184
     185                // We need to update the data
     186                if ( !$this->updated && !empty($_POST['sidebar']) ) {
     187
     188                        // Tells us what sidebar to put the data in
     189                        $sidebar = (string) $_POST['sidebar'];
     190
     191                        $sidebars_widgets = wp_get_sidebars_widgets();
     192                        if ( isset($sidebars_widgets[$sidebar]) )
     193                                $this_sidebar =& $sidebars_widgets[$sidebar];
     194                        else
     195                                $this_sidebar = array();
     196
     197                        foreach ( $this_sidebar as $_widget_id )        {
     198                                // Remove all widgets of this type from the sidebar. We'll add the
     199                                // new data in a second. This makes sure we don't get any duplicate
     200                                // data since widget ids aren't necessarily persistent across multiple
     201                                // updates
     202                                if ( $this->_get_display_callback() == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) {
     203                                        $number = $wp_registered_widgets[$_widget_id]['params'][0]['number'];
     204                                        if( !in_array( $this->id_base . '-' . $number, (array)$_POST['widget-id'] ) ) {
     205                                                // the widget has been removed.
     206                                                unset($all_instances[$number]);
     207                                        }
     208                                }
     209                        }
     210
     211                        foreach( (array) $_POST['widget-' . $this->id_base] as $number => $new_instance ) {
     212                                $this->_set($number);
     213                                if ( isset($all_instances[$number]) )
     214                                        $instance = $this->update($new_instance, $all_instances[$number]);
     215                                else
     216                                        $instance = $this->update($new_instance, array());
     217
     218                                if ( !empty($instance) )
     219                                        $all_instances[$number] = $instance;
     220                        }
     221
     222                        $this->save_settings($all_instances);
     223                        $this->updated = true;
     224                }
     225
     226                // Here we echo out the form
     227                if ( -1 == $widget_args['number'] ) {
     228                        // We echo out a form where 'number' can be set later via JS
     229                        $this->_set('%i%');
     230                        $instance = array();
     231                } else {
     232                        $this->_set($widget_args['number']);
     233                        $instance = $all_instances[ $widget_args['number'] ];
     234                }
     235
     236                $this->form($instance);
     237        }
     238
     239        /** Helper function: Registers a single instance. */
     240        function _register_one($number = -1) {
     241                wp_register_sidebar_widget(     $this->id, $this->name, $this->_get_display_callback(), $this->widget_options, array( 'number' => $number ) );
     242                wp_register_widget_control(     $this->id, $this->name, $this->_get_control_callback(), $this->control_options, array( 'number' => $number ) );
     243        }
     244       
     245        function save_settings($settings) {
     246                $settings['_multiwidget'] = 1;
     247                update_option( $this->option_name, $settings );
     248        }
     249
     250        function get_settings() {
     251                $settings = get_option($this->option_name);     
     252
     253                if ( !is_array($settings) )
     254                        return array();
     255
     256                if ( !array_key_exists('_multiwidget', $settings) ) {
     257                        // old format, conver if single widget
     258                        $settings = wp_convert_widget_settings($this->id_base, $this->option_name, $settings);
     259                }
     260
     261                unset($settings['_multiwidget']);
     262                return $settings;
     263        }
     264}
    44265
    45266/* Template tags & API functions */
     
    7851006 * @since 2.8.0
    7861007 */
    787 class WP_Widget_Links extends WP_Widgets {
     1008class WP_Widget_Links extends WP_Widget {
    7881009       
    7891010        function widget( $args, $instance ) {
Note: See TracChangeset for help on using the changeset viewer.