自动设置活动项目

问题描述 投票:0回答:2

我的应用程序中有一个菜单:

<?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
键设置正确的值?或者也许我应该在模板内完成?

这是来自 PhpStrom 调试面板的

$menuItems
的内容,然后将其传递给
Nav::widget
:

这就是我现在的位置:

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
标志。现在我想知道如何将参数传递给回调函数。

php menu yii2 yii2-widget
2个回答
1
投票

尽管如果您提供

/controller/action
格式的完整 URL,它应该可以工作(如果仍然不起作用),那么您可以通过检查当前控制器、操作和 slug 来使用
active
item
选项

protected function constructMenu($categories) {

    $menu = [];
    $controller = Yii::$app->controller->id;
    $action = Yii::$app->controller->action->id;
    $slug = Yii::$app->request->get('slug');

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

    return $menu;
}

0
投票

试试这个:

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']
                ]),
                'active' => Yii::$app->controller->id == 'category' 
                     && Yii::$app->controller->action->id == 'view'
                     && Yii::$app->request->get('slug') == $category['slug']
            ];
            if (is_array($category['children']) && (count($category['children']) > 0)) {
                $menu[$key]['items'] = $this->constructMenu($category['children']);
            }
        }
    }

    return $menu;
}
© www.soinside.com 2019 - 2024. All rights reserved.