На сайте есть главное меню. В меню есть ссылки. Вроде бы все просто, ведь так у всех.
Для подстветки активного пункта меню используется проверка:
$liCssClass = Yii::$app->controller->id == 'news' ? 'menu-item-active' : 'menu-item';
И далее:
<li class="<?php echo $liCssClass ?>">Новости</li>
Для общего случая мне необходимо хранить пункты меню в базе и при запросе парсить url ссылки и подсвечивать активный пункт меню автоматом.
Для этого пишу код:
$currentController = \Yii::$app->controller;
$currentAction = $currentController->action;
foreach($links as $link){
list($controller, $actionId) = \Yii::$app->createController($link->url);
if ($controller && $actionId) {
if ($currentController->id == $controller && $actionId == $currentAction->id){
$cssClass = 'menu-item-active';
}
else {
$cssClass = 'menu-item';
}
$ul[] = Html::tag('li', $link->title, ['class' => $cssClass]);
}
}
Загвоздка в том, что
$controller
может вернуться false, а
$actionId
может отсутствовать в
$controller
(ведь ссылки берутся из базы, а там можно ошибиться, и вставить битую ссылку).
Как это проверить? Достаточно ли такого кода:
$controller->hasMethod('action'.$actionId)
, или это говнокод?