Программирование, веб-кодинг

Yii2: Создание своего виджета. Выделение активного пункта меню классом active

Создадим свой виджет меню наследуемый от стандартного Menu::widget

Стандартный виджет меню yii/widgets/Menu формирует меню в виде списка ul li. В этом случае он умеет определять активный пункт меню и добавляет к нему класс .active, но как только я захотел вместо списка ul li ваыводить меню в виде ссылок div a, то класс активного пункта слетает и вёрстка нарушается. Решаем вопрос.

Yii2: Создание своего виджета. Выделение активного пункта меню классом active

Нам нужно добавить класс active для ссылки пункта меню. Для этого создадим свой виджет MenuActive в папке components.

namespace app\components;

use yii\widgets\Menu;
use yii\helpers\ArrayHelper;
use yii\helpers\Url;
use yii\helpers\Html;

class MenuActive extends Menu
{
    public $linkTemplate = '<a {activeclass}="" href="{url}">{label}</a>';
    protected function renderItem($item)
    {
        if (isset($item['url'])) {
            $template = ArrayHelper::getValue($item, 'template', $this->linkTemplate);
            return strtr($template, [
                '{activeClass}'=> ($item['active']==1)? 'class="list-group-item active"':'class="list-group-item"',
                '{url}' => Html::encode(Url::to($item['url'])),
                '{label}' => $item['label'],
            ]);
        } else {
            $template = ArrayHelper::getValue($item, 'template', $this->labelTemplate);
            return strtr($template, [
                '{label}' => $item['label'],
            ]);
        }
    }
}

И теперь подключаем его вместо обычного виджета Menu

use app\components\MenuActive;
...

<!--?=
-->MenuActive::widget([
...