* @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2 * @author Icinga Development Team * */ // {{{ICINGA_LICENSE_HEADER}}} namespace Icinga\Web\Widget; use \Icinga\Exception\ProgrammingError; use \Icinga\Web\Widget\Tabextension\Tabextension; use \Zend_View_Abstract; use \Countable; /** * Navigation tab widget */ class Tabs implements Countable, Widget { /** * Template used for the base tabs * * @var string */ private $baseTpl = <<< 'EOT' EOT; /** * Template used for the tabs dropdown * * @var string */ private $dropdownTpl = <<< 'EOT' EOT; /** * This is where single tabs added to this container will be stored * * @var array */ private $tabs = array(); /** * The name of the currently activated tab * * @var string */ private $active; /** * Array of tab names which should be displayed in a dropdown * * @var array */ private $dropdownTabs = array(); /** * Activate the tab with the given name * * If another tab is currently active it will be deactivated * * @param string $name Name of the tab going to be activated * * @return self * * @throws ProgrammingError When the given tab name doesn't exist * */ public function activate($name) { if ($this->has($name)) { if ($this->active !== null) { $this->tabs[$this->active]->setActive(false); } $this->get($name)->setActive(); $this->active = $name; } return $this; } /** * Return the name of the active tab * * @return string */ public function getActiveName() { return $this->active; } /** * Set the CSS class name(s) for the <ul> element * * @param string $name CSS class name(s) * * @return self */ public function setClass($name) { $this->tab_class = $name; return $this; } /** * Whether the given tab name exists * * @param string $name Tab name * * @return bool */ public function has($name) { return array_key_exists($name, $this->tabs); } /** * Whether the given tab name exists * * @param string $name The tab you're interested in * * @return Tab * * @throws ProgrammingError When the given tab name doesn't exist */ public function get($name) { if (!$this->has($name)) { return null; } return $this->tabs[$name]; } /** * Add a new tab * * A unique tab name is required, the Tab itself can either be an array * with tab properties or an instance of an existing Tab * * @param string $name The new tab name * @param array|Tab $tab The tab itself of it's properties * * @return self * * @throws ProgrammingError When the tab name already exists */ public function add($name, $tab) { if ($this->has($name)) { throw new ProgrammingError( sprintf( 'Cannot add a tab named "%s" twice"', $name ) ); } return $this->set($name, $tab); } /** * Set a tab * * A unique tab name is required, will be replaced in case it already * exists. The tab can either be an array with tab properties or an instance * of an existing Tab * * @param string $name The new tab name * @param array|Tab $tab The tab itself of it's properties * * @return self */ public function set($name, $tab) { if ($tab instanceof Tab) { $this->tabs[$name] = $tab; } else { $this->tabs[$name] = new Tab($tab + array('name' => $name)); } return $this; } /** * Add a tab to the dropdown on the right side of the tab-bar. * * @param $name * @param $tab */ public function addAsDropdown($name, $tab) { $this->set($name, $tab); $this->dropdownTabs[] = $name; $this->dropdownTabs = array_unique($this->dropdownTabs); } /** * Render the dropdown area with it's tabs and return the resulting HTML * * @param Zend_View_Abstract $view The view used for rendering * * @return mixed|string */ private function renderDropdownTabs(Zend_View_Abstract $view) { if (empty($this->dropdownTabs)) { return ''; } $tabs = ''; foreach ($this->dropdownTabs as $tabname) { $tab = $this->get($tabname); if ($tab === null) { continue; } $tabs .= $tab->render($view); } return str_replace('{TABS}', $tabs, $this->dropdownTpl); } /** * Render all tabs, except the ones in dropdown area and return the resulting HTML * * @param Zend_View_Abstract $view The view used for rendering * * @return string */ private function renderTabs(Zend_View_Abstract $view) { $tabs = ''; foreach ($this->tabs as $name => $tab) { // ignore tabs added to dropdown if (in_array($name, $this->dropdownTabs)) { continue; } $tabs .= $tab->render($view); } return $tabs; } /** * Render to HTML * * @see Widget::render */ public function render(Zend_View_Abstract $view) { if (empty($this->tabs)) { return ''; } $html = $this->baseTpl; $html = str_replace('{TABS}', $this->renderTabs($view), $html); $html = str_replace('{DROPDOWN}', $this->renderDropdownTabs($view), $html); return $html; } /** * Return the number of tabs * * @return int * * @see Countable */ public function count() { return count($this->tabs); } /** * Return all tabs contained in this tab panel * * @return array */ public function getTabs() { return $this->tabs; } /** * Apply a Tabextension on this tabs object * * @param Tabextension $tabextension * * @return self */ public function extend(Tabextension $tabextension) { $tabextension->apply($this); return $this; } }