diff --git a/framework/yii/bootstrap/Carousel.php b/framework/yii/bootstrap/Carousel.php index 3d38b54..f8904fa 100644 --- a/framework/yii/bootstrap/Carousel.php +++ b/framework/yii/bootstrap/Carousel.php @@ -8,7 +8,7 @@ namespace yii\bootstrap; use yii\base\InvalidConfigException; -use yii\helpers\base\ArrayHelper; +use yii\helpers\ArrayHelper; use yii\helpers\Html; /** diff --git a/framework/yii/bootstrap/Collapse.php b/framework/yii/bootstrap/Collapse.php index d83df3c..a7929e3 100644 --- a/framework/yii/bootstrap/Collapse.php +++ b/framework/yii/bootstrap/Collapse.php @@ -8,7 +8,7 @@ namespace yii\bootstrap; use yii\base\InvalidConfigException; -use yii\helpers\base\ArrayHelper; +use yii\helpers\ArrayHelper; use yii\helpers\Html; /** diff --git a/framework/yii/bootstrap/Nav.php b/framework/yii/bootstrap/Nav.php new file mode 100644 index 0000000..7a29ecd --- /dev/null +++ b/framework/yii/bootstrap/Nav.php @@ -0,0 +1,143 @@ + array( + * array( + * 'label' => 'Home', + * 'url' => '/', + * 'linkOptions' => array(...), + * 'active' => true, + * ), + * array( + * 'label' => 'Dropdown', + * 'items' => array( + * array( + * 'label' => 'DropdownA', + * 'url' => '#', + * ), + * array( + * 'label' => 'DropdownB', + * 'url' => '#', + * ), + * ), + * ), + * ), + * )); + * ``` + * + * @see http://twitter.github.io/bootstrap/components.html#nav + * @author Antonio Ramirez + * @since 2.0 + */ +class Nav extends Widget +{ + /** + * @var array list of items in the nav widget. Each array element represents a single + * menu item with the following structure: + * + * - label: string, required, the nav item label. + * - url: optional, the item's URL. Defaults to "#". + * - linkOptions: array, optional, the HTML attributes of the item's link. + * - options: array, optional, the HTML attributes of the item container (LI). + * - active: boolean, optional, whether the item should be on active state or not. + * - items: array, optional, the configuration of specify the item's dropdown menu. You can optionally set this as + * a string (ie. `'items'=> Dropdown::widget(array(...))` + * - important: there is an issue with sub-dropdown menus, and as of 3.0, bootstrap won't support sub-dropdown. + * + * **Note:** Optionally, you can also use a plain string instead of an array element. + * + * @see https://github.com/twitter/bootstrap/issues/5050#issuecomment-11741727 + * @see [[Dropdown]] + */ + public $items = array(); + /** + * @var boolean whether the nav items labels should be HTML-encoded. + */ + public $encodeLabels = true; + + + /** + * Initializes the widget. + */ + public function init() + { + parent::init(); + $this->addCssClass($this->options, 'nav'); + } + + /** + * Renders the widget. + */ + public function run() + { + echo $this->renderItems(); + $this->getView()->registerAssetBundle('yii/bootstrap'); + } + + /** + * Renders widget items. + */ + public function renderItems() + { + $items = array(); + foreach ($this->items as $item) { + $items[] = $this->renderItem($item); + } + + return Html::tag('ul', implode("\n", $items), $this->options); + } + + /** + * Renders a widget's item. + * @param mixed $item the item to render. + * @return string the rendering result. + * @throws InvalidConfigException + */ + public function renderItem($item) + { + if (is_string($item)) { + return $item; + } + if (!isset($item['label'])) { + throw new InvalidConfigException("The 'label' option is required."); + } + $label = $this->encodeLabels ? Html::encode($item['label']) : $item['label']; + $options = ArrayHelper::getValue($item, 'options', array()); + $dropdown = ArrayHelper::getValue($item, 'items'); + $url = Html::url(ArrayHelper::getValue($item, 'url', '#')); + $linkOptions = ArrayHelper::getValue($item, 'linkOptions', array()); + + if(ArrayHelper::getValue($item, 'active')) { + $this->addCssClass($options, 'active'); + } + + if ($dropdown !== null) { + $linkOptions['data-toggle'] = 'dropdown'; + $this->addCssClass($options, 'dropdown'); + $this->addCssClass($urlOptions, 'dropdown-toggle'); + $label .= ' ' . Html::tag('b', '', array('class' => 'caret')); + $dropdown = is_string($dropdown) + ? $dropdown + : Dropdown::widget(array('items' => $item['items'], 'clientOptions' => false)); + } + + return Html::tag('li', Html::a($label, $url, $linkOptions) . $dropdown, $options); + } +} \ No newline at end of file diff --git a/framework/yii/bootstrap/NavBar.php b/framework/yii/bootstrap/NavBar.php new file mode 100644 index 0000000..cbcd2d3 --- /dev/null +++ b/framework/yii/bootstrap/NavBar.php @@ -0,0 +1,193 @@ + 'NavBar Test', + * 'items' => array( + * // a Nav widget + * array( + * // defaults to Nav anyway. + * 'class' => 'yii\bootstrap\Nav', + * // widget configuration + * 'options' => array( + * 'items' => array( + * array( + * 'label' => 'Home', + * 'url' => '/', + * 'options' => array('class' => 'active'), + * ), + * array( + * 'label' => 'Dropdown', + * 'content' => new Dropdown(array( + * 'items' => array( + * array( + * 'label' => 'DropdownA', + * 'url' => '#', + * ), + * array( + * 'label' => 'DropdownB', + * 'url' => '#' + * ), + * ) + * ), + * ), + * ) + * ), + * ), + * // you can also use strings + * '', + * ), + * )); + * ``` + * + * @see http://twitter.github.io/bootstrap/components.html#navbar + * @author Antonio Ramirez + * @since 2.0 + */ +class NavBar extends Widget +{ + /** + * @var string the text of the brand. + * @see http://twitter.github.io/bootstrap/components.html#navbar + */ + public $brandLabel; + /** + * @param array|string $url the URL for the brand's hyperlink tag. This parameter will be processed by [[Html::url()]] + * and will be used for the "href" attribute of the brand link. Defaults to site root. + */ + public $brandRoute = '/'; + /** + * @var array the HTML attributes of the brand link. + */ + public $brandOptions = array(); + /** + * @var array list of menu items in the navbar widget. Each array element represents a single + * menu item with the following structure: + * + * ```php + * array( + * // optional, the menu item class type of the widget to render. Defaults to "Nav" widget. + * 'class' => 'Menu item class type', + * // required, the configuration options of the widget. + * 'options'=> array(...), + * ), + * // optionally, you can pass a string + * '', + * ``` + * + * Optionally, you can also use a plain string instead of an array element. + */ + public $items = array(); + /** + * @var string the generated brand url if specified by [[brandLabel]] + */ + protected $brand; + + + /** + * Initializes the widget. + */ + public function init() + { + parent::init(); + $this->clientOptions = false; + $this->addCssClass($this->options, 'navbar'); + $this->addCssClass($this->brandOptions, 'brand'); + $this->brand = Html::a($this->brandLabel, $this->brandRoute, $this->brandOptions); + } + + /** + * Renders the widget. + */ + public function run() + { + echo Html::beginTag('div', $this->options); + echo $this->renderItems(); + echo Html::endTag('div'); + $this->getView()->registerAssetBundle('yii/bootstrap'); + } + + /** + * Renders the items. + * @return string the rendering items. + */ + protected function renderItems() + { + $items = array(); + foreach ($this->items as $item) { + $items[] = $this->renderItem($item); + } + $contents = implode("\n", $items); + if (self::$responsive === true) { + $this->getView()->registerAssetBundle('yii/bootstrap/collapse'); + $contents = + Html::tag('div', + $this->renderToggleButton() . + $this->brand . "\n" . + Html::tag('div', $contents, array('class' => 'nav-collapse collapse navbar-collapse')), + array('class' => 'container')); + + } else { + $contents = $this->brand . "\n" . $contents; + } + + return Html::tag('div', $contents, array('class' => 'navbar-inner')); + } + + /** + * Renders a item. The item can be a string, a custom class or a Nav widget (defaults if no class specified. + * @param mixed $item the item to render. If array, it is assumed the configuration of a widget being `class` + * required and if not specified, then defaults to `yii\bootstrap\Nav`. + * @return string the rendering result. + * @throws InvalidConfigException + */ + protected function renderItem($item) + { + if (is_string($item)) { + return $item; + } + $config = ArrayHelper::getValue($item, 'options', array()); + $config['clientOptions'] = false; + + $class = ArrayHelper::getValue($item, 'class', 'yii\bootstrap\Nav'); + + return $class::widget($config); + } + + /** + * Renders collapsible toggle button. + * @return string the rendering toggle button. + */ + protected function renderToggleButton() + { + $items = array(); + for ($i = 0; $i < 3; $i++) { + $items[] = Html::tag('span', '', array('class' => 'icon-bar')); + } + return Html::a(implode("\n", $items), null, array( + 'class' => 'btn btn-navbar', + 'data-toggle' => 'collapse', + 'data-target' => 'div.navbar-collapse', + )); + } +} \ No newline at end of file