function smarty_function_menu($params, &$smarty) { if (is_array($params['m'])) { $sal = $params['m']; //print_r($sal); $salida = "<ul class='submenu'>\n"; foreach ($sal as $s) { $salida .= "<li>"; if ($s["componente"] == "#") { $salida .= "<a href='#menuitem_id=" . $s['menuitem_id'] . "'>" . $s["nombre"] . "</a>"; } else { $salida .= "<a href='index.php?" . $s["componente"] . "&" . $s['parametros'] . "&menuitem_id=" . $s['menuitem_id'] . "'>" . $s["nombre"] . "</a>"; } if ($s['subitems'] != 0) { $salida .= smarty_function_menu(array("m" => $s['subitems']), &$smarty); } $salida .= "</li>\n"; } $salida .= "</ul>"; } return $salida; }
/** * Формирует меню * * @param $aParams * @param $oSmarty * * @internal param $sMenuId * @internal param bool $sMenuClass * @internal param string $sActiveClass * * @return string */ function smarty_function_menu($aParams, &$oSmarty = NULL) { // Меню нет - уходим if (!isset($aParams['id']) || !($aMenu = E::ModuleMenu()->GetPreparedMenu($aParams['id']))) { return ''; } if (!isset($aMenu['items'])) { return ''; } /** @var ModuleMenu_EntityItem[] $aMenuItems Элементы меню */ $aMenuItems = $aMenu['items']; /** @var string $sMenu Запрашиваемое меню */ $sMenu = ''; // Установим класс меню, если он задан /** @var string $sMenuClass Класс меню */ $sMenuClass = isset($aParams['class']) ? 'class="' . $aParams['class'] . '"' : ''; if (!$sMenuClass) { $sMenuClass = isset($aMenu['class']) ? 'class="' . $aMenu['class'] . '"' : ''; } // Открываем меню if (!isset($aParams['hideul'])) { $sMenu .= "<ul {$sMenuClass}>"; } // Меню пустое $bEmpty = TRUE; // Заполним меню его элементами foreach ($aMenuItems as $sItemMenuName => $oMenuItem) { // Вызовем хук if (is_string($oMenuItem)) { $sMenu .= smarty_function_hook(array_merge(array('run' => $sItemMenuName), isset($aParams[$oMenuItem]) ? $aParams[$oMenuItem] : array()), $oSmarty); continue; } if (!$oMenuItem->isEnabled(isset($aParams['type']) ? $aParams['type'] : false)) { continue; } // Сформируем подменю если нужно $oMenuItem->setMenuId($aParams['id']); if (strpos($oMenuItemHtml = $oMenuItem->getHtml(), "[[submenu_") !== FALSE) { $oMenuItemHtml = preg_replace_callback('~\\[\\[submenu_(\\S*)\\]\\]~', function ($sSubmenuId) { if (isset($sSubmenuId[1])) { $sSubmenuId = $sSubmenuId[1]; } else { return ''; } $aSettings = array('id' => $sSubmenuId); if (preg_match('~[a-f0-9]{10}~', $sSubmenuId)) { $aSettings = array_merge($aSettings, array('class' => Config::Get('menu.submenu.class'))); } if (!is_null($sSubmenuHtml = smarty_function_menu($aSettings))) { return $sSubmenuHtml; } return ''; }, $oMenuItemHtml); } // Добавим html в вывод $sMenu .= $oMenuItemHtml; $bEmpty = FALSE; } // Закрываем меню if (!isset($aParams['hideul'])) { $sMenu .= '</ul>'; } // Пустое меню не показываем, если не указано другое if (!isset($aParams['show_empty'])) { $aParams['show_empty'] = FALSE; } // Если меню не пустое, то покажем if (!($bEmpty && $aParams['show_empty'])) { return $sMenu; } return ''; }
public function testRender() { $html = new CM_Dom_NodeList(smarty_function_menu(['data' => $this->_menuData, 'activePage' => new CM_Page_Example(['foo' => 1])], $this->_template)); $this->assertContains('menu', $html->getAttribute('class')); $this->assertCount(2, $html->find('> li')); }