tabs.inc

Classes and theme functions for rendering javascript UI tabs.

File

includes/tabs.inc

View source
<?php


/**
 * @file
 *
 * Classes and theme functions for rendering javascript UI tabs.
 */

/**
 * Contain a set of tabs as well as the ability to render them.
 *
 * There are three 'areas' of a tabset.
 * - title: The clickable link to display the tab area. These are always visible.
 * - body: The actual HTML body of the tab. Only one body is visible at a time.
 * - extra: An optional decorative area around the tabs.
 */
class views_tabset {
    var $tabs = array();
    var $extra = '';
    var $selected = NULL;
    
    /**
     * Add a tab to the tabset.
     *
     * @param $name
     *   The name of the tab; this is the internal identifier and must be
     *   unique within the tabset.
     * @param $title
     *   If given, this will be the visible title of the tab. This can also
     *   be set via $tabset->set(). This will be the link to click on to
     *   view the tab.
     * @param $body
     *   If given, this is the body of the tab itself. It will display
     *   when the tab title is clicked on.
     */
    function add($name, $title = '', $body = '') {
        if (is_object($name) && is_subclass_of($name, 'views_tab')) {
            $this->add_tab($name);
        }
        elseif (is_array($name)) {
            foreach ($name as $real_tab) {
                $this->add($real_tab);
            }
        }
        else {
            $this->add_tab(new views_tab($name, $title, $body));
        }
    }
    
    /**
     * Add a fully realized tab object to the tabset.
     *
     * @param $tab
     *   A fully populated views_tab object.
     */
    function add_tab($tab) {
        $this->tabs[$tab->name] = $tab;
    }
    
    /**
     * Set the values of a tab.
     *
     * @param $name
     *   The unique identifier of the tab to set.
     * @param $title
     *   The title of the tab; this will be clickable.
     * @param $body
     *   The HTML body of the tab.
     */
    function set($name, $title, $body = NULL) {
        if (empty($this->tabs[$name])) {
            return $this->add($name, $title, $body);
        }
        $this->tabs[$name]->title = $title;
        if (isset($body)) {
            $this->tabs[$name]->body = $body;
        }
    }
    
    /**
     * Set the body of a tab.
     */
    function set_body($name, $body) {
        if (empty($this->tabs[$name])) {
            return $this->add($name, '', $body);
        }
        $this->tabs[$name]->body = $body;
    }
    
    /**
     * Add text to the 'extra' region of the tabset.
     */
    function add_extra($text) {
        $this->extra .= $text;
    }
    
    /**
     * Remove a tab.
     *
     * @param $tab
     *   May be the name of the tab or a views_tab object.
     */
    function remove($tab) {
        if (is_string($tab)) {
            unset($this->tabs[$tab]);
        }
        else {
            unset($this->tabs[$tab->name]);
        }
    }
    
    /**
     * Control which tab will be selected when it is rendered.
     */
    function set_selected($name) {
        $this->selected = $name;
    }
    
    /**
     * Output the HTML for the tabs.
     *
     * @return
     *   HTML representation of the tabs.
     */
    function render() {
        views_add_js('tabs');
        views_add_css('views-tabs');
        if (empty($this->selected)) {
            $keys = array_keys($this->tabs);
            $this->selected = array_shift($keys);
        }
        drupal_alter('views_tabset', $this);
        return theme('views_tabset', $this->tabs, $this->extra, $this->selected);
    }

}

/**
 * An object to represent an individual tab within a tabset.
 */
class views_tab {
    var $title;
    var $body;
    var $name;
    
    /**
     * Construct a new tab.
     */
    function views_tab($name, $title, $body = NULL) {
        $this->name = $name;
        $this->title = $title;
        $this->body = $body;
    }
    
    /**
     * Generate HTML output for a tab.
     */
    function render() {
        return theme('views_tab', $this->body);
    }

}

/**
 * Render a tabset.
 *
 * @todo Turn this into a template.
 */
function theme_views_tabset($tabs, $extra = NULL, $selected = NULL) {
    $link_output = "<div class=\"views-tabs\"><ul id=\"views-tabset\">\n";
    $tab_output = "<div class=\"views-tab-area\">\n";
    foreach ($tabs as $name => $tab) {
        $link_output .= '<li' . ($name == $selected ? ' class="active"' : '') . '><a href="#views-tab-' . $tab->name . '" id="views-tab-title-' . $tab->name . '">' . check_plain($tab->title) . '</a></li>' . "\n";
        $tab_output .= '<div id="views-tab-' . $tab->name . '" class="views-tab">' . $tab->render() . "</div>\n";
    }
    $link_output .= "</ul>\n";
    if ($extra) {
        $link_output .= "<div class=\"extra\">{$extra}</div>\n";
    }
    $link_output .= "</div>\n";
    $tab_output .= "</div>\n";
    return '<div class="views-tabset clear-block">' . $link_output . $tab_output . '</div>';
}

/**
 * Theme a simple tab.
 */
function theme_views_tab($body) {
    return $body;
}

Functions

Title Deprecated Summary
theme_views_tab Theme a simple tab.
theme_views_tabset Render a tabset.

Classes

Title Deprecated Summary
views_tab An object to represent an individual tab within a tabset.
views_tabset Contain a set of tabs as well as the ability to render them.