PageRenderTime 33ms CodeModel.GetById 31ms RepoModel.GetById 1ms app.codeStats 0ms

/app/protected/extensions/yiibooster/widgets/TbBaseMenu.php

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