Changeset 10764 for trunk/wp-includes/classes.php
- Timestamp:
- 03/10/2009 07:42:22 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/wp-includes/classes.php
r10672 r10764 1591 1591 } 1592 1592 1593 /** 1594 * This class must be extended for each widget and WP_Widgets::widget(), WP_Widgets::update() 1595 * and WP_Widgets::form() need to be over-ridden. 1596 * 1597 * @package WordPress 1598 * @since 2.8 1599 */ 1600 class WP_Widgets { 1601 1602 var $id_base; // Root id for all widgets of this type. 1603 var $name; // Name for this widget type. 1604 var $widget_options; // Option array passed to wp_register_sidebar_widget() 1605 var $control_options; // Option array passed to wp_register_widget_control() 1606 1607 var $number = false; // Unique ID number of the current instance. 1608 var $id = false; // Unique ID string of the current instance (id_base-number) 1609 var $updated = false; // Set true when we update the data after a POST submit - makes sure we don't do it twice. 1610 1611 // Member functions that you must over-ride. 1612 1613 /** Echo the actual widget content. Subclasses should over-ride this function 1614 * to generate their widget code. */ 1615 function widget($args, $instance) { 1616 die('function WP_Widgets::widget() must be over-ridden in a sub-class.'); 1617 } 1618 1619 /** Update a particular instance. 1620 * This function should check that $new_instance is set correctly. 1621 * The newly calculated value of $instance should be returned. */ 1622 function update($new_instance, $old_instance) { 1623 die('function WP_Widgets::update() must be over-ridden in a sub-class.'); 1624 } 1625 1626 /** Echo a control form for the current instance. */ 1627 function form($instance) { 1628 die('function WP_Widgets::form() must be over-ridden in a sub-class.'); 1629 } 1630 1631 // Functions you'll need to call. 1632 1633 /** 1634 * PHP4 constructor 1635 */ 1636 function WP_Widgets( $id_base, $name, $widget_options = array(), $control_options = array() ) { 1637 $this->__construct( $id_base, $name, $widget_options, $control_options ); 1638 } 1639 1640 /** 1641 * PHP5 constructor 1642 * widget_options: passed to wp_register_sidebar_widget() 1643 * - description 1644 * - classname 1645 * control_options: passed to wp_register_widget_control() 1646 * - width 1647 * - height 1648 */ 1649 function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) { 1650 $this->id_base = $id_base; 1651 $this->name = $name; 1652 $this->option_name = 'wp_widget_' . $id_base; 1653 $this->widget_options = wp_parse_args( $widget_options, array('classname' => $this->option_name) ); 1654 $this->control_options = wp_parse_args( $control_options, array('id_base' => $this->id_base) ); 1655 1656 //add_action( 'widgets_init', array( &$this, 'register' ) ); 1657 } 1658 1659 /** Helper function to be called by form(). 1660 * Returns an HTML name for the field. */ 1661 function get_field_name($field_name) { 1662 return 'widget-' . $this->id_base . '[' . $this->number . '][' . $field_name . ']'; 1663 } 1664 1665 /** Helper function to be called by form(). 1666 * Returns an HTML id for the field. */ 1667 function get_field_id($field_name) { 1668 return 'widget-' . $this->id_base . '-' . $this->number . '-' . $field_name; 1669 } 1670 1671 /** Registers this widget-type. 1672 * Called during the 'widgets_init' action. */ 1673 function register() { 1674 if ( ! $all_instances = get_option($this->option_name) ) 1675 $all_instances = array(); 1676 1677 $registered = false; 1678 foreach( array_keys($all_instances) as $number ) { 1679 // Old widgets can have null values for some reason 1680 if ( !isset($all_instances[$number]['_multiwidget']) ) 1681 continue; 1682 1683 $this->_set($number); 1684 $registered = true; 1685 $this->_register_one($number); 1686 } 1687 1688 // If there are none, we register the widget's existance with a 1689 // generic template 1690 if ( !$registered ) { 1691 $this->_set(1); 1692 $this->_register_one(); 1693 } 1694 } 1695 1696 // Private Functions. Don't worry about these. 1697 1698 function _set($number) { 1699 $this->number = $number; 1700 $this->id = $this->id_base . '-' . $number; 1701 } 1702 1703 function _get_display_callback() { 1704 return array(&$this, 'display_callback'); 1705 } 1706 1707 function _get_control_callback() { 1708 return array(&$this, 'control_callback'); 1709 } 1710 1711 /** Generate the actual widget content. 1712 * Just finds the instance and calls widget(). 1713 * Do NOT over-ride this function. */ 1714 function display_callback( $args, $widget_args = 1 ) { 1715 if ( is_numeric($widget_args) ) 1716 $widget_args = array( 'number' => $widget_args ); 1717 1718 $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); 1719 $this->_set( $widget_args['number'] ); 1720 1721 // Data is stored as array: 1722 // array( number => data for that instance of the widget, ... ) 1723 $all_instances = get_option($this->option_name); 1724 if ( isset($all_instances[$this->number]) ) 1725 $this->widget($args, $all_instances[$this->number]); 1726 } 1727 1728 /** Deal with changed settings and generate the control form. 1729 * Do NOT over-ride this function. */ 1730 function control_callback( $widget_args = 1 ) { 1731 global $wp_registered_widgets; 1732 1733 if ( is_numeric($widget_args) ) 1734 $widget_args = array( 'number' => $widget_args ); 1735 1736 $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); 1737 1738 // Data is stored as array: 1739 // array( number => data for that instance of the widget, ... ) 1740 $all_instances = get_option($this->option_name); 1741 if ( !is_array($all_instances) ) 1742 $all_instances = array(); 1743 1744 // We need to update the data 1745 if ( !$this->updated && !empty($_POST['sidebar']) ) { 1746 // Tells us what sidebar to put the data in 1747 $sidebar = (string) $_POST['sidebar']; 1748 1749 $sidebars_widgets = wp_get_sidebars_widgets(); 1750 if ( isset($sidebars_widgets[$sidebar]) ) 1751 $this_sidebar =& $sidebars_widgets[$sidebar]; 1752 else 1753 $this_sidebar = array(); 1754 1755 foreach ( $this_sidebar as $_widget_id ) { 1756 // Remove all widgets of this type from the sidebar. We'll add the 1757 // new data in a second. This makes sure we don't get any duplicate 1758 // data since widget ids aren't necessarily persistent across multiple 1759 // updates 1760 if ( $this->_get_display_callback() == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) { 1761 $number = $wp_registered_widgets[$_widget_id]['params'][0]['number']; 1762 if( !in_array( $this->id_base . '-' . $number, (array)$_POST['widget-id'] ) ) { 1763 // the widget has been removed. 1764 unset($all_instances[$number]); 1765 } 1766 } 1767 } 1768 1769 foreach( (array) $_POST['widget-' . $this->id_base] as $number => $new_instance ) { 1770 $this->_set($number); 1771 if ( isset($all_instances[$number]) ) 1772 $instance = $this->update($new_instance, $all_instances[$number]); 1773 else 1774 $instance = $this->update($new_instance, array()); 1775 1776 if ( !empty($instance) ) { 1777 $instance['_multiwidget'] = $number; 1778 $all_instances[$number] = $instance; 1779 } 1780 } 1781 1782 update_option($this->option_name, $all_instances); 1783 $this->updated = true; // So that we don't go through this more than once 1784 } 1785 1786 // Here we echo out the form 1787 if ( -1 == $widget_args['number'] ) { 1788 // We echo out a template for a form which can be converted to a 1789 // specific form later via JS 1790 $this->_set('%i%'); 1791 $instance = array(); 1792 } else { 1793 $this->_set($widget_args['number']); 1794 $instance = $all_instances[ $widget_args['number'] ]; 1795 } 1796 $this->form($instance); 1797 } 1798 1799 /** Helper function: Registers a single instance. */ 1800 function _register_one($number = -1) { 1801 wp_register_sidebar_widget( $this->id, $this->name, $this->_get_display_callback(), $this->widget_options, array( 'number' => $number ) ); 1802 wp_register_widget_control( $this->id, $this->name, $this->_get_control_callback(), $this->control_options, array( 'number' => $number ) ); 1803 } 1804 1805 } 1806 1593 1807 ?>
Note: See TracChangeset
for help on using the changeset viewer.