webman用户模块,添加顶部菜单了,页面无法显示

wadeYang

问题描述

webman用户模块,添加顶部菜单了,页面无法显示。
我开始 plugin/user/api/Template.php 的getNavData()方法加了 “问答中心”菜单,能正常显示。后面我想改这个菜单,无论怎么改都不会变了,奇怪,是哪里有缓存吗?



599 4 4
4个回答

wadeYang

Event::emit('user.nav.render', $object);
还有加这个事件是啥作用,不加有什么问题吗?

  • walkor 2023-04-24

    user.nav.render 是渲染用户中心左侧菜单,见下面例子

walkor

不要在 plugin/user/api/Template.php 里改代码,在你的插件或者主项目/config/event.php配置中添加对应的菜单.

比如
plugin/nat/config/event.php中添加如下

use plugin\foo\app\service\UserEvent;
return [
    // 当有用户注册时
    'user.register' => [
        [UserEvent::class, 'onUserRegister']
    ],
    // 当渲染用户端导航菜单时
    'user.nav.render' => [
        [UserEvent::class, 'onUserNavRender']
    ],
    // 当渲染用户中心左侧边栏时
    'user.sidebar.render' => [
        [UserEvent::class, 'onUserSidebarRender']
    ],
];

plugin/nat/app/service/UserEvent.php

<?php

namespace plugin\nat\app\service;

use plugin\nat\app\model\NatApp;
use plugin\user\app\model\User as UserModel;
use stdClass;

/**
 * 用户相关事件
 */
class UserEvent
{
    /**
     * 用户注册时
     * @return void
     */
    public function onUserRegister(UserModel $user)
    {
        $request = request();
        $host = $request->host(false);
        // 创建一个默认内网穿透应用
        if (!filter_var($host, FILTER_VALIDATE_IP)) {
            $username = $user->username;
            $domain = "$username.$host";
            if (!NatApp::where('domain', $domain)->first()) {
                $app = new NatApp;
                $app->user_id = $user->id;
                $app->name = '我的应用';
                $app->domain = $domain;
                $app->local_ip = '127.0.0.1';
                $app->local_port = 8787;
                $app->save();
            }
        }
    }

    /**
     * 当渲染用户端顶部导航菜单时
     * @param stdClass $object
     * @return void
     */
    public function onUserNavRender(stdClass $object)
    {
        $request = request();
        $path = $request ? $request->path() : '';
        // 添加内网穿透自己的导航栏菜单
        $object->navs[] = [
            'name' => '内网穿透',
            'items' => [
                ['name' => '顶部菜单1', 'url' => '/app/nat/apps', 'class' => $path === '/app/nat/apps' ? 'active' : ''],
                ['name' => '顶部菜单2', 'url' => '/app/nat/token', 'class' => $path === '/app/nat/token' ? 'active' : ''],
            ]
        ];
    }

    /**
     * 当渲染用户中心左侧菜单时
     * @param stdClass $object
     * @return void
     */
    public function onUserSidebarRender(stdClass $object)
    {
        $request = request();
        $path = $request ? $request->path() : '';
        // 添加内网穿透自己的左侧用户中心菜单
        $object->sidebars[] = [
            'name' => '内网穿透',
            'items' => [
                ['name' => '用户中心菜单1', 'url' => '/app/nat/apps', 'class' => $path === '/app/nat/apps' ? 'active' : ''],
                ['name' => '用户中心菜单2', 'url' => '/app/nat/token', 'class' => $path === '/app/nat/token' ? 'active' : ''],
            ]
        ];
    }
}

结果类似如下
截图

artisan

用户模块建议整个简单的文档,类似webman-admin

  • 暂无评论
zhezhebie

如果我每个左侧边栏不一样该怎么办呢?我看siderbar那段模板代码是公用的。但是我想在一些控制器里面设置不同的siderbar,我定义了event,也写了对应的代码,但是没有展示,是怎么回事呢?
event代码:

    // 当渲染教育中心左侧边栏时
    'teach.sidebar.render' => [
        [app\event\Teach::class, 'onTeachSidebarRender'],
    ],

app\event\Teach代码:

<?php

namespace app\event;

use stdClass;

class Teach
{
    public function onTeachSidebarRender(stdClass $object)
    {
        $request = request();
        $path = $request ? $request->path() : '';
        // 动态添加自己的导航栏菜单
        $object->sidebars[] = [
            'name' => '各种工具',
            'items' => [
                ['name' => '视频工具', 'url' => '/tool/video/index', 'class' => $path === '/tool/video/index' ? 'active' : ''],
                ['name' => '教育工具', 'url' => '/tool/teach/mathHomework', 'class' => $path === '/tool/teach/mathHomework' ? 'active' : ''],
            ],
        ];
        // 一个栏目一个数组,这样好管理
        $object->sidebars[] = [
            'name' => '测试多个菜单',
            'items' => [
                ['name' => '视频工具', 'url' => '/tool/video', 'class' => $path === '/tool/video' ? 'active' : ''],
                ['name' => '教育工具', 'url' => '/tool/teach', 'class' => $path === '/tool/teach' ? 'active' : ''],
            ],
        ];
    }

}

然后我在控制器里面触发:

        $object = new stdClass();
        $object->sidebars = [];
        Event::emit('teach.sidebar.render', $object);

        $vars = [
            'operators' => array_keys(self::OPERATORS),
            'need' => 100,
            'sidebars' => $object->sidebars,
        ];

但是页面没有如期展示。

  • artisan 2024-03-07

    页面是通过<?=plugin\user\api\Template::sidebar()?>获取渲染菜单的,可以自定义一个TemplateSidebar类,view里根据需要调用自定义的TemplateSidebar类的对应方法

年代过于久远,无法发表回答
🔝