PageRenderTime 50ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/protected/extensions/bootstrap/widgets/TbBaseMenu.php

https://github.com/LosYear/FluentCMS
PHP | 189 lines | 124 code | 32 blank | 33 comment | 32 complexity | 394d39d30a2452ed0eb6faf1f8f7af0f MD5 | raw file
  1. <?php
  2. /**
  3. * TbBaseMenu class file.
  4. * @author Christoffer Niska <ChristofferNiska@gmail.com>
  5. * @copyright Copyright &copy; Christoffer Niska 2012-
  6. * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
  7. * @package bootstrap.widgets
  8. */
  9. Yii::import('zii.widgets.CMenu');
  10. abstract class TbBaseMenu extends CMenu
  11. {
  12. /**
  13. * Returns the divider css class.
  14. * @return string the class name
  15. */
  16. abstract public function getDividerCssClass();
  17. /**
  18. * Renders the menu items.
  19. * @param array $items menu items. Each menu item will be an array with at least two elements: 'label' and 'active'.
  20. * It may have three other optional elements: 'items', 'linkOptions' and 'itemOptions'.
  21. */
  22. protected function renderMenu($items)
  23. {
  24. $n = count($items);
  25. if($n > 0)
  26. {
  27. echo CHtml::openTag('ul', $this->htmlOptions);
  28. $count = 0;
  29. foreach ($items as $item)
  30. {
  31. $count++;
  32. if (isset($item['divider']))
  33. echo '<li class="'.$this->getDividerCssClass().'"></li>';
  34. else
  35. {
  36. $options = isset($item['itemOptions']) ? $item['itemOptions'] : array();
  37. $classes = array();
  38. if ($item['active'] && $this->activeCssClass != '')
  39. $classes[] = $this->activeCssClass;
  40. if ($count === 1 && $this->firstItemCssClass !== null)
  41. $classes[] = $this->firstItemCssClass;
  42. if ($count === $n && $this->lastItemCssClass !== null)
  43. $classes[] = $this->lastItemCssClass;
  44. if ($this->itemCssClass !== null)
  45. $classes[] = $this->itemCssClass;
  46. if (!empty($classes))
  47. {
  48. $classes = implode(' ', $classes);
  49. if (!empty($options['class']))
  50. $options['class'] .= ' '.$classes;
  51. else
  52. $options['class'] = $classes;
  53. }
  54. echo CHtml::openTag('li', $options);
  55. $menu = $this->renderMenuItem($item);
  56. if (isset($this->itemTemplate) || isset($item['template']))
  57. {
  58. $template = isset($item['template']) ? $item['template'] : $this->itemTemplate;
  59. echo strtr($template, array('{menu}' => $menu));
  60. }
  61. else
  62. echo $menu;
  63. if (isset($item['items']) && count($item['items']))
  64. {
  65. $this->controller->widget('bootstrap.widgets.TbDropdown', array(
  66. 'encodeLabel'=>$this->encodeLabel,
  67. 'items'=>$item['items'],
  68. 'htmlOptions'=>isset($item['submenuOptions']) ? $item['submenuOptions'] : $this->submenuHtmlOptions,
  69. ));
  70. }
  71. echo '</li>';
  72. }
  73. }
  74. echo '</ul>';
  75. }
  76. }
  77. /**
  78. * Renders the content of a menu item.
  79. * Note that the container and the sub-menus are not rendered here.
  80. * @param array $item the menu item to be rendered. Please see {@link items} on what data might be in the item.
  81. * @return string the rendered item
  82. */
  83. protected function renderMenuItem($item)
  84. {
  85. if (!isset($item['linkOptions']))
  86. $item['linkOptions'] = array();
  87. if (isset($item['icon']))
  88. {
  89. if (strpos($item['icon'], 'icon') === false)
  90. {
  91. $pieces = explode(' ', $item['icon']);
  92. $item['icon'] = 'glyphicon-'.implode(' icon-', $pieces);
  93. }
  94. $item['label'] = '<span class="glyphicon '.$item['icon'].'"></span> '.$item['label'];
  95. }
  96. if (isset($item['items']) && !empty($item['items']))
  97. {
  98. $item['url'] = '#';
  99. if (isset($item['linkOptions']['class']))
  100. $item['linkOptions']['class'] .= ' dropdown-toggle';
  101. else
  102. $item['linkOptions']['class'] = 'dropdown-toggle';
  103. $item['linkOptions']['data-toggle'] = 'dropdown';
  104. $item['label'] .= ' <b class="caret"></b>';
  105. }
  106. if (isset($item['url']))
  107. return CHtml::link($item['label'], $item['url'], $item['linkOptions']);
  108. else
  109. return $item['label'];
  110. }
  111. /**
  112. * Normalizes the {@link items} property so that the 'active' state is properly identified for every menu item.
  113. * @param array $items the items to be normalized.
  114. * @param string $route the route of the current request.
  115. * @param boolean $active whether there is an active child menu item.
  116. * @return array the normalized menu items
  117. */
  118. protected function normalizeItems($items, $route, &$active)
  119. {
  120. foreach ($items as $i => $item)
  121. {
  122. if (!is_array($item))
  123. $item = array('divider'=>true);
  124. else
  125. {
  126. if (!isset($item['itemOptions']))
  127. $item['itemOptions'] = array();
  128. $classes = array();
  129. if (!isset($item['url']) && $this->isVertical())
  130. {
  131. $item['header'] = true;
  132. $classes[] = 'dropdown-header';
  133. }
  134. if (isset($item['items']))
  135. $classes[] = 'dropdown';
  136. if (!empty($classes))
  137. {
  138. $classes = implode($classes, ' ');
  139. if (isset($item['itemOptions']['class']))
  140. $item['itemOptions']['class'] .= ' '.$classes;
  141. else
  142. $item['itemOptions']['class'] = $classes;
  143. }
  144. }
  145. $items[$i] = $item;
  146. }
  147. return parent::normalizeItems($items, $route, $active);
  148. }
  149. /**
  150. * Returns whether this is a vertical menu.
  151. * @return boolean the result
  152. */
  153. protected function isVertical()
  154. {
  155. return $this instanceof TbDropdown || $this instanceof TbMenu && $this->type === TbMenu::TYPE_LIST;
  156. }
  157. }