From 0f6a7080971566e268c593ea2005ca02af4e2d15 Mon Sep 17 00:00:00 2001 From: Alexander Kochetov Date: Thu, 23 May 2013 22:34:07 +0400 Subject: [PATCH 1/5] jQuery Tabs widget raw --- framework/yii/jui/Tabs.php | 85 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 framework/yii/jui/Tabs.php diff --git a/framework/yii/jui/Tabs.php b/framework/yii/jui/Tabs.php new file mode 100644 index 0000000..314aa25 --- /dev/null +++ b/framework/yii/jui/Tabs.php @@ -0,0 +1,85 @@ + array( + * 'One' => array( + * 'content' => 'Mauris mauris ante, blandit et, ultrices a, suscipit eget...', + * 'contentOptions' => array(...), + * ), + * 'Two' => array( + * 'content' => 'Sed non urna. Phasellus eu ligula. Vestibulum sit amet purus...', + * 'headerOptions' => 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 + * // item key is the actual tab header label + * 'Tab header label' => array( + * // 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 + * 'contentOptions'=> 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"; + $headers = array(); + $contents = array(); + $index = 0; + foreach ($this->items as $header => $item) { + $id = $this->options['id'] . '-tab' . ++$index; + $headerOptions = ArrayHelper::getValue($item, 'headerOptions', array()); + $headers[] = Html::tag('li', Html::tag('a', $header, array('href' => "#$id")), $headerOptions); + if (isset($item['content'])) { + $contentOptions = ArrayHelper::getValue($item, 'contentOptions', array()); + $contentOptions['id'] = $id; + $contents[] = Html::tag('div', $item['content'], $contentOptions); + } else { + throw new InvalidConfigException("The 'content' option is required."); + } + } + echo Html::tag('ul', implode("\n", $headers)) . "\n"; + echo implode("\n", $contents) . "\n"; + echo Html::endTag('div') . "\n"; + $this->registerWidget('tabs'); + } +} From 646161e01ce38876f7290e5589c8bdeeb62d9bd7 Mon Sep 17 00:00:00 2001 From: Alexander Kochetov Date: Fri, 24 May 2013 00:02:40 +0400 Subject: [PATCH 2/5] Refactoring --- framework/yii/jui/Tabs.php | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/framework/yii/jui/Tabs.php b/framework/yii/jui/Tabs.php index 314aa25..258a3a4 100644 --- a/framework/yii/jui/Tabs.php +++ b/framework/yii/jui/Tabs.php @@ -12,7 +12,7 @@ use yii\helpers\base\ArrayHelper; use yii\helpers\Html; /** - * Tabs renders an tabs jQuery UI widget. + * Tabs renders a tabs jQuery UI widget. * * For example: * @@ -62,24 +62,49 @@ class Tabs extends Widget public function run() { echo Html::beginTag('div', $this->options) . "\n"; + echo $this->renderHeaders() . "\n"; + echo $this->renderItems() . "\n"; + echo Html::endTag('div') . "\n"; + $this->registerWidget('tabs'); + } + + /** + * Renders tabs headers as specified on [[items]]. + * @return string the rendering result. + */ + protected function renderHeaders() + { $headers = array(); - $contents = array(); $index = 0; foreach ($this->items as $header => $item) { $id = $this->options['id'] . '-tab' . ++$index; $headerOptions = ArrayHelper::getValue($item, 'headerOptions', array()); - $headers[] = Html::tag('li', Html::tag('a', $header, array('href' => "#$id")), $headerOptions); + $headers[] = Html::tag('li', Html::a($header, "#$id"), $headerOptions); + } + + return Html::tag('ul', implode("\n", $headers)); + } + + /** + * Renders tabs items as specified on [[items]]. + * @return string the rendering result. + * @throws InvalidConfigException. + */ + protected function renderItems() + { + $items = array(); + $index = 0; + foreach ($this->items as $item) { + $id = $this->options['id'] . '-tab' . ++$index; if (isset($item['content'])) { $contentOptions = ArrayHelper::getValue($item, 'contentOptions', array()); $contentOptions['id'] = $id; - $contents[] = Html::tag('div', $item['content'], $contentOptions); + $items[] = Html::tag('div', $item['content'], $contentOptions); } else { throw new InvalidConfigException("The 'content' option is required."); } } - echo Html::tag('ul', implode("\n", $headers)) . "\n"; - echo implode("\n", $contents) . "\n"; - echo Html::endTag('div') . "\n"; - $this->registerWidget('tabs'); + + return implode("\n", $items); } } From f50e8f6bfced26f2d9dfaf5d71d7b6e45d8b56ce Mon Sep 17 00:00:00 2001 From: Alexander Kochetov Date: Fri, 24 May 2013 00:34:56 +0400 Subject: [PATCH 3/5] Final --- framework/yii/jui/Tabs.php | 55 +++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/framework/yii/jui/Tabs.php b/framework/yii/jui/Tabs.php index 258a3a4..4007d4b 100644 --- a/framework/yii/jui/Tabs.php +++ b/framework/yii/jui/Tabs.php @@ -19,13 +19,15 @@ use yii\helpers\Html; * ```php * echo Tabs::widget(array( * 'items' => array( - * 'One' => array( + * array( + * 'header' => 'One', * 'content' => 'Mauris mauris ante, blandit et, ultrices a, suscipit eget...', - * 'contentOptions' => array(...), * ), - * 'Two' => array( - * 'content' => 'Sed non urna. Phasellus eu ligula. Vestibulum sit amet purus...', + * array( + * 'header' => 'Two', * 'headerOptions' => array(...), + * 'content' => 'Sed non urna. Phasellus eu ligula. Vestibulum sit amet purus...', + * 'options' => array(...), * ), * ), * )); @@ -42,12 +44,13 @@ class Tabs extends Widget * tab with the following structure: * * ```php - * // item key is the actual tab header label - * 'Tab header label' => array( + * 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 - * 'contentOptions'=> array(...), + * 'options'=> array(...), * // optional the HTML attributes of the tab header container * 'headerOptions'=> array(...), * ) @@ -63,7 +66,7 @@ class Tabs extends Widget { echo Html::beginTag('div', $this->options) . "\n"; echo $this->renderHeaders() . "\n"; - echo $this->renderItems() . "\n"; + echo $this->renderContents() . "\n"; echo Html::endTag('div') . "\n"; $this->registerWidget('tabs'); } @@ -71,40 +74,46 @@ class Tabs extends Widget /** * Renders tabs headers as specified on [[items]]. * @return string the rendering result. + * @throws InvalidConfigException. */ protected function renderHeaders() { $headers = array(); - $index = 0; - foreach ($this->items as $header => $item) { - $id = $this->options['id'] . '-tab' . ++$index; - $headerOptions = ArrayHelper::getValue($item, 'headerOptions', array()); - $headers[] = Html::tag('li', Html::a($header, "#$id"), $headerOptions); + foreach ($this->items as $n => $item) { + $options = ArrayHelper::getValue($item, 'options', array()); + $id = isset($options['id']) ? $options['id'] : $this->options['id'] . '-tab' . $n; + if (isset($item['header'])) { + $headerOptions = ArrayHelper::getValue($item, 'headerOptions', array()); + $headers[] = Html::tag('li', Html::a($item['header'], "#$id"), $headerOptions); + } else { + throw new InvalidConfigException("The 'header' option is required."); + } } return Html::tag('ul', implode("\n", $headers)); } /** - * Renders tabs items as specified on [[items]]. + * Renders tabs contents as specified on [[items]]. * @return string the rendering result. * @throws InvalidConfigException. */ - protected function renderItems() + protected function renderContents() { - $items = array(); - $index = 0; - foreach ($this->items as $item) { - $id = $this->options['id'] . '-tab' . ++$index; + $contents = array(); + foreach ($this->items as $n => $item) { + $id = $this->options['id'] . '-tab' . $n; if (isset($item['content'])) { - $contentOptions = ArrayHelper::getValue($item, 'contentOptions', array()); - $contentOptions['id'] = $id; - $items[] = Html::tag('div', $item['content'], $contentOptions); + $options = ArrayHelper::getValue($item, 'options', array()); + if (!isset($options['id'])) { + $options['id'] = $id; + } + $contents[] = Html::tag('div', $item['content'], $options); } else { throw new InvalidConfigException("The 'content' option is required."); } } - return implode("\n", $items); + return implode("\n", $contents); } } From cc5981e2e2ddd4c4783081bcf5aa823c07773e69 Mon Sep 17 00:00:00 2001 From: Alexander Kochetov Date: Fri, 24 May 2013 00:38:37 +0400 Subject: [PATCH 4/5] Post final ;) --- framework/yii/jui/Tabs.php | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/framework/yii/jui/Tabs.php b/framework/yii/jui/Tabs.php index 4007d4b..171b7fe 100644 --- a/framework/yii/jui/Tabs.php +++ b/framework/yii/jui/Tabs.php @@ -80,14 +80,13 @@ class Tabs extends Widget { $headers = array(); foreach ($this->items as $n => $item) { - $options = ArrayHelper::getValue($item, 'options', array()); - $id = isset($options['id']) ? $options['id'] : $this->options['id'] . '-tab' . $n; - if (isset($item['header'])) { - $headerOptions = ArrayHelper::getValue($item, 'headerOptions', array()); - $headers[] = Html::tag('li', Html::a($item['header'], "#$id"), $headerOptions); - } else { + 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)); @@ -102,16 +101,15 @@ class Tabs extends Widget { $contents = array(); foreach ($this->items as $n => $item) { - $id = $this->options['id'] . '-tab' . $n; - if (isset($item['content'])) { - $options = ArrayHelper::getValue($item, 'options', array()); - if (!isset($options['id'])) { - $options['id'] = $id; - } - $contents[] = Html::tag('div', $item['content'], $options); - } else { + if (!isset($item['content'])) { throw new InvalidConfigException("The 'content' option is required."); } + $id = $this->options['id'] . '-tab' . $n; + $options = ArrayHelper::getValue($item, 'options', array()); + if (!isset($options['id'])) { + $options['id'] = $id; + } + $contents[] = Html::tag('div', $item['content'], $options); } return implode("\n", $contents); From 7724b5f5e4faa0fb8a6c78d5f4d7dc3f3a10b968 Mon Sep 17 00:00:00 2001 From: Alexander Kochetov Date: Fri, 24 May 2013 00:44:36 +0400 Subject: [PATCH 5/5] Cosmetic change --- framework/yii/jui/Tabs.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/yii/jui/Tabs.php b/framework/yii/jui/Tabs.php index 171b7fe..ca0b3da 100644 --- a/framework/yii/jui/Tabs.php +++ b/framework/yii/jui/Tabs.php @@ -104,10 +104,9 @@ class Tabs extends Widget if (!isset($item['content'])) { throw new InvalidConfigException("The 'content' option is required."); } - $id = $this->options['id'] . '-tab' . $n; $options = ArrayHelper::getValue($item, 'options', array()); if (!isset($options['id'])) { - $options['id'] = $id; + $options['id'] = $this->options['id'] . '-tab' . $n; } $contents[] = Html::tag('div', $item['content'], $options); }