From 5fe6d9910f7bafad098d362f07498e1d3683d00a Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Tue, 28 May 2013 11:50:12 +0200 Subject: [PATCH] Added dropdown widget --- framework/yii/bootstrap/Dropdown.php | 116 +++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 framework/yii/bootstrap/Dropdown.php diff --git a/framework/yii/bootstrap/Dropdown.php b/framework/yii/bootstrap/Dropdown.php new file mode 100644 index 0000000..fa966d3 --- /dev/null +++ b/framework/yii/bootstrap/Dropdown.php @@ -0,0 +1,116 @@ + + * @since 2.0 + */ +class Dropdown extends Widget +{ + /** + * @var array list of menu items in the dropdown. Each array element represents a single + * menu with the following structure: + * + * ```php + * array( + * // required, the label of the item link + * 'label' => 'Menu label', + * // optional, url of the item link + * 'url' => '', + * // optional the HTML attributes of the item link + * 'urlOptions'=> array(...), + * // optional the HTML attributes of the item + * 'options'=> array(...), + * // optional, an array of items that configure a sub menu of the item + * // note: if `items` is set, then `url` of the parent item will be ignored and automatically set to "#" + * 'items'=> array(...) + * ) + * ``` + * If you wish to display a `divider`, use any string. The widget will render a bootstrap dropdown divider: + * + * ```html + *
  • + * ``` + */ + public $items = array(); + + + /** + * Initializes the widget. + * If you override this method, make sure you call the parent implementation first. + */ + public function init() + { + parent::init(); + $this->addCssClass($this->options, 'dropdown-menu'); + } + + /** + * Renders the widget. + */ + public function run() + { + echo Html::beginTag('ul', $this->options) . "\n"; + echo $this->renderContents() . "\n"; + echo Html::endTag('ul') . "\n"; + $this->registerPlugin('dropdown'); + } + + /** + * Renders dropdown contents as specified on [[items]]. + * @return string the rendering result. + * @throws InvalidConfigException + */ + protected function renderContents() + { + $contents = array(); + foreach ($this->items as $item) { + if (is_string($item)) { + $contents[] = Html::tag('li', '', array('class' => 'divider')); + continue; + } + if (!isset($item['label'])) { + throw new InvalidConfigException("The 'label' option is required."); + } + + $options = ArrayHelper::getValue($item, 'options', array()); + $urlOptions = ArrayHelper::getValue($item, 'urlOptions', array()); + $urlOptions['tabindex'] = '-1'; + + if (isset($item['items'])) { + $this->addCssClass($options, 'dropdown-submenu'); + $content = Html::a($item['label'], '#', $urlOptions) . $this->dropdown($item['items']); + } else { + $content = Html::a($item['label'], ArrayHelper::getValue($item, 'url', '#'), $urlOptions); + } + $contents[] = Html::tag('li', $content , $options); + } + + return implode("\n", $contents); + } + + /** + * Generates a dropdown menu. + * @param array $items the configuration of the dropdown items. See [[items]]. + * @return string the generated dropdown menu + * @see items + */ + protected function dropdown($items) + { + return Dropdown::widget(array('items' => $items, 'clientOptions' => false)); + } +} \ No newline at end of file