webman用户模块,添加顶部菜单了,页面无法显示。 我开始 plugin/user/api/Template.php 的getNavData()方法加了 “问答中心”菜单,能正常显示。后面我想改这个菜单,无论怎么改都不会变了,奇怪,是哪里有缓存吗?
Event::emit('user.nav.render', $object); 还有加这个事件是啥作用,不加有什么问题吗?
user.nav.render 是渲染用户中心左侧菜单,见下面例子
不要在 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' : ''], ] ]; } }
结果类似如下
非常感谢大佬指点,明白了
如果我每个左侧边栏不一样该怎么办呢?我看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, ];
但是页面没有如期展示。
页面是通过<?=plugin\user\api\Template::sidebar()?>获取渲染菜单的,可以自定义一个TemplateSidebar类,view里根据需要调用自定义的TemplateSidebar类的对应方法
Event::emit('user.nav.render', $object);
还有加这个事件是啥作用,不加有什么问题吗?
user.nav.render 是渲染用户中心左侧菜单,见下面例子
不要在 plugin/user/api/Template.php 里改代码,在你的插件或者主项目/config/event.php配置中添加对应的菜单.
比如
plugin/nat/config/event.php中添加如下
plugin/nat/app/service/UserEvent.php
结果类似如下
非常感谢大佬指点,明白了
用户模块建议整个简单的文档,类似webman-admin
如果我每个左侧边栏不一样该怎么办呢?我看siderbar那段模板代码是公用的。但是我想在一些控制器里面设置不同的siderbar,我定义了event,也写了对应的代码,但是没有展示,是怎么回事呢?
event代码:
app\event\Teach代码:
然后我在控制器里面触发:
但是页面没有如期展示。
页面是通过<?=plugin\user\api\Template::sidebar()?>获取渲染菜单的,可以自定义一个TemplateSidebar类,view里根据需要调用自定义的TemplateSidebar类的对应方法