diff --git a/framework/yii/jui/Tabs.php b/framework/yii/jui/Tabs.php new file mode 100644 index 0000000..ca0b3da --- /dev/null +++ b/framework/yii/jui/Tabs.php @@ -0,0 +1,116 @@ + array( + * array( + * 'header' => 'One', + * 'content' => 'Mauris mauris ante, blandit et, ultrices a, suscipit eget...', + * ), + * array( + * 'header' => 'Two', + * 'headerOptions' => array(...), + * 'content' => 'Sed non urna. Phasellus eu ligula. Vestibulum sit amet purus...', + * 'options' => array(...), + * ), + * ), + * )); + * ``` + * + * @see http://api.jqueryui.com/tabs/ + * @author Alexander Kochetov + * @since 2.0 + */ +class Tabs extends Widget +{ + /** + * @var array list of tabs in the tabs widget. Each array element represents a single + * tab with the following structure: + * + * ```php + * array( + * // required, the header (HTML) of the tab + * 'header' => 'Tab label', + * // required, the content (HTML) of the tab + * 'content' => 'Mauris mauris ante, blandit et, ultrices a, suscipit eget...', + * // optional the HTML attributes of the tab content container + * 'options'=> array(...), + * // optional the HTML attributes of the tab header container + * 'headerOptions'=> array(...), + * ) + * ``` + */ + public $items = array(); + + + /** + * Renders the widget. + */ + public function run() + { + echo Html::beginTag('div', $this->options) . "\n"; + echo $this->renderHeaders() . "\n"; + echo $this->renderContents() . "\n"; + echo Html::endTag('div') . "\n"; + $this->registerWidget('tabs'); + } + + /** + * Renders tabs headers as specified on [[items]]. + * @return string the rendering result. + * @throws InvalidConfigException. + */ + protected function renderHeaders() + { + $headers = array(); + foreach ($this->items as $n => $item) { + if (!isset($item['header'])) { + throw new InvalidConfigException("The 'header' option is required."); + } + $options = ArrayHelper::getValue($item, 'options', array()); + $id = isset($options['id']) ? $options['id'] : $this->options['id'] . '-tab' . $n; + $headerOptions = ArrayHelper::getValue($item, 'headerOptions', array()); + $headers[] = Html::tag('li', Html::a($item['header'], "#$id"), $headerOptions); + } + + return Html::tag('ul', implode("\n", $headers)); + } + + /** + * Renders tabs contents as specified on [[items]]. + * @return string the rendering result. + * @throws InvalidConfigException. + */ + protected function renderContents() + { + $contents = array(); + foreach ($this->items as $n => $item) { + if (!isset($item['content'])) { + throw new InvalidConfigException("The 'content' option is required."); + } + $options = ArrayHelper::getValue($item, 'options', array()); + if (!isset($options['id'])) { + $options['id'] = $this->options['id'] . '-tab' . $n; + } + $contents[] = Html::tag('div', $item['content'], $options); + } + + return implode("\n", $contents); + } +}