PageRenderTime 36ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

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

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