Menu.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. /**
  3. * Author: lf
  4. * Blog: https://blog.feehi.com
  5. * Email: job@feehi.com
  6. * Created at: 2019-05-07 11:21
  7. */
  8. namespace backend\widgets;
  9. use Yii;
  10. use yii\base\InvalidArgumentException;
  11. class Menu extends \yii\base\Widget
  12. {
  13. /**
  14. * @var array menus
  15. */
  16. public $menus;
  17. /**
  18. * @var string first level li template
  19. */
  20. public $firstLevelLiTemplate = '<li><a class="{class}" href="{url}"><i class="fa {icon}"></i><span class="nav-label">{name}</span><span class="fa {arrow}"></span></a>{submenu}</li>';
  21. /**
  22. * @var string li template
  23. */
  24. public $liTemplate = '<li><a class="J_menuItem" href="{url}" data-index="{data-index}">{name}<span class="fa {arrow}"></span></a>{lis}</li>';
  25. /**
  26. * @var string ul template
  27. */
  28. public $ulTemplate = '<ul class="nav nav-{level}-level {collapse}">{lis}</ul>';
  29. /** @var array level names */
  30. private $_levelsName = ['2' => 'second', '3' => 'third', '4' => 'fourth', '5' => 'fifth', '6' => 'six'];
  31. public function run()
  32. {
  33. $menus = $this->menus;
  34. $lis = "";
  35. foreach ($menus as $menu){
  36. /** @var $menu \common\models\Menu */
  37. if( intval($menu->parent_id) !== 0 ) continue;//parent_id equal 0 means first level menu
  38. $url = $menu->getMenuUrl();
  39. $arrow = '';
  40. $class = "J_menuItem";
  41. $submenu = $this->getSubMenu($menu['id']);//get sub menus(recursive sub menus)
  42. if ($submenu) {//first level menu has sub menus
  43. $arrow = ' arrow';//only has sub menus menu has a arrow icon
  44. $class = '';
  45. }
  46. $lis .= str_replace(["{class}", "{url}", "{icon}", "{name}", "{arrow}", "{submenu}"], [$class, $url, $menu['icon'], Yii::t('menu', $menu['name']), $arrow, $submenu], $this->firstLevelLiTemplate);
  47. }
  48. return $lis;
  49. }
  50. /**
  51. * get sub menu html
  52. *
  53. * @param $menuId
  54. * @param int $level
  55. * @return mixed|string
  56. * @throws yii\base\Exception
  57. */
  58. private function getSubMenu($menuId, $level=2)
  59. {
  60. if( !isset($this->_levelsName[$level]) ) throw new InvalidArgumentException("Backend menu support max 6 levels");
  61. $levelName = $this->_levelsName[$level];
  62. $collapse = '';
  63. if ($level > 2) {
  64. $collapse = "collapse";
  65. }
  66. $level++;
  67. $lis = "";
  68. $menus = $this->menus;
  69. foreach ($menus as $menu) {
  70. /** @var \common\models\Menu $menu */
  71. if ($menu->parent_id != $menuId) {//find menu id sub menus(parent id equal menu id)
  72. continue;//not the given menu's sub menu
  73. }
  74. $subSubmenu = $this->getSubMenu($menu->id, $level);//recursive get sub menus
  75. $arrow = 'arrow';
  76. $url = '';
  77. if ($subSubmenu == '') {
  78. $arrow = '';
  79. $url = $menu->getMenuUrl();
  80. }
  81. $lis .= str_replace(['{url}', '{data-index}', '{name}', '{arrow}', "{lis}"], [$url, $this->id, Yii::t('menu', $menu['name']), $arrow, $subSubmenu], $this->liTemplate);
  82. }
  83. $subMenu = "";
  84. if ($lis !== "") {
  85. $subMenu = str_replace(["{level}", "{collapse}", "{lis}"], [$levelName, $collapse, $lis], $this->ulTemplate);
  86. }
  87. return $subMenu;
  88. }
  89. }