{name}{submenu}';
/**
* @var string li template
*/
public $liTemplate = '{lis}';
/**
* @var string ul template
*/
public $ulTemplate = '';
/** @var array level names */
private $_levelsName = ['2' => 'second', '3' => 'third', '4' => 'fourth', '5' => 'fifth', '6' => 'six'];
public function run()
{
$menus = $this->menus;
$lis = "";
foreach ($menus as $menu){
/** @var $menu \common\models\Menu */
if( intval($menu->parent_id) !== 0 ) continue;//parent_id equal 0 means first level menu
$url = $menu->getMenuUrl();
$arrow = '';
$class = "J_menuItem";
$submenu = $this->getSubMenu($menu['id']);//get sub menus(recursive sub menus)
if ($submenu) {//first level menu has sub menus
$arrow = ' arrow';//only has sub menus menu has a arrow icon
$class = '';
}
$lis .= str_replace(["{class}", "{url}", "{icon}", "{name}", "{arrow}", "{submenu}"], [$class, $url, $menu['icon'], Yii::t('menu', $menu['name']), $arrow, $submenu], $this->firstLevelLiTemplate);
}
return $lis;
}
/**
* get sub menu html
*
* @param $menuId
* @param int $level
* @return mixed|string
* @throws yii\base\Exception
*/
private function getSubMenu($menuId, $level=2)
{
if( !isset($this->_levelsName[$level]) ) throw new InvalidArgumentException("Backend menu support max 6 levels");
$levelName = $this->_levelsName[$level];
$collapse = '';
if ($level > 2) {
$collapse = "collapse";
}
$level++;
$lis = "";
$menus = $this->menus;
foreach ($menus as $menu) {
/** @var \common\models\Menu $menu */
if ($menu->parent_id != $menuId) {//find menu id sub menus(parent id equal menu id)
continue;//not the given menu's sub menu
}
$subSubmenu = $this->getSubMenu($menu->id, $level);//recursive get sub menus
$arrow = 'arrow';
$url = '';
if ($subSubmenu == '') {
$arrow = '';
$url = $menu->getMenuUrl();
}
$lis .= str_replace(['{url}', '{data-index}', '{name}', '{arrow}', "{lis}"], [$url, $this->id, Yii::t('menu', $menu['name']), $arrow, $subSubmenu], $this->liTemplate);
}
$subMenu = "";
if ($lis !== "") {
$subMenu = str_replace(["{level}", "{collapse}", "{lis}"], [$levelName, $collapse, $lis], $this->ulTemplate);
}
return $subMenu;
}
}