Make WordPress Core


Ignore:
Timestamp:
03/10/2009 07:42:22 PM (17 years ago)
Author:
azaozz
Message:

Add WP_Widget class, first run - only the Links widget is using it at the moment, see #8441

File:
1 edited

Legend:

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

    r10672 r10764  
    15911591}
    15921592
     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 */
     1600class 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
    15931807?>
Note: See TracChangeset for help on using the changeset viewer.