0

アプリにメニューがあります:

<?php
NavBar::begin([
    'brandLabel' => Html::img('@web/images/logo-top.png', ['id' => 'logo']),
    'brandUrl' => Yii::$app->homeUrl,
    'options' => [
        'class' => 'navbar-inverse navbar-static-top',
    ],
]);

if (count($menuItems)) {
    echo Nav::widget([
        'options' => ['class' => 'navbar-nav'],
        'items' => $menuItems,
    ]);
}
?>

<?php NavBar::end(); ?>

$menuItemsコントローラー内で生成されます。

private function constructMenu($categories) {
    $menu = [];

    if (is_array($categories) && (count($categories) > 0)) {
        foreach($categories as $key => $category) {
            $menu[$key] = [
                'label' => $category['name'],
                'url' => Url::to([
                    'category/view',
                    'slug' => $category['slug']
                ]),
            ];
            if (is_array($category['children']) && (count($category['children']) > 0)) {
                $menu[$key]['items'] = $this->constructMenu($category['children']);
            }
        }
    }

    return $menu;
}

また、urlManager 構成があります。

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'category/<slug:[\w_-]+>' => 'category/view',
        'item/<slug:[\w_-]+>' => 'item/view',
        'cart/remove/<item_id:\d+>' => 'cart/remove',
        'cart/add/<item_id:\d+>' => 'cart/add',
    ],
],

したがって、唯一の問題は、メニュー項目が常にactive = false. キーconstructMenuに適切な値を設定するには、メソッドをどのように変更すればよいですか? activeまたは、テンプレート内で行う必要がありますか?

$menuItemsに渡される直前の PhpStrom デバッグ パネルの内容は次のNav::widgetとおりです。

$menuItems 変数の内容

これが私が今いる場所です:

NavBar::begin([
    'brandLabel' => Html::img('@web/images/logo-top.png',
        ['id' => 'logo', 'style' => 'height: 40px; filter: invert(100%);']),
    'brandUrl' => Yii::$app->homeUrl,
    'options' => [
        'class' => 'navbar-inverse navbar-static-top',
    ],
]);

$controllerAndSlug = $this->context->id . '/' . $this->context->actionParams['slug'];
$menuItems = array_map(
    function($item) use ($controllerAndSlug) {
        $item['active'] = strpos($item['url'], $controllerAndSlug) !== false;
        return $item;
    },
    $menuItems
);

if (count($menuItems)) {
    echo Nav::widget([
        'options' => ['class' => 'navbar-nav'],
        'items' => $menuItems,
    ]);
}
NavBar::end();

active正常に動作しますが、最上位のメニュー項目にのみフラグを設定します。今、コールバック関数にパラメーターを渡す方法について疑問に思います。

4

2 に答える 2