Changeset 10782 for trunk/wp-includes/widgets.php
- Timestamp:
- 03/13/2009 11:18:57 PM (17 years ago)
- File:
-
- 1 edited
-
trunk/wp-includes/widgets.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/wp-includes/widgets.php
r10781 r10782 42 42 */ 43 43 $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 */ 53 class 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 } 44 265 45 266 /* Template tags & API functions */ … … 785 1006 * @since 2.8.0 786 1007 */ 787 class WP_Widget_Links extends WP_Widget s{1008 class WP_Widget_Links extends WP_Widget { 788 1009 789 1010 function widget( $args, $instance ) {
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)