【问题标题】:using Catalyst::Model::MenuGrinder使用 Catalyst::Model::MenuGrinder
【发布时间】:2025-12-05 12:00:01
【问题描述】:

我正在尝试使用 Catalyst::Model::MenuGrinder 向我的 WebApp 添加动态菜单 关于如何使用此模型配置通过角色访问的文档不是很清楚。 有没有人使用这个模型实现了动态菜单? 我在Catalyst Advent calendar 找到了这篇文章,并且设置正确,只是不知道如何配置它以根据角色限制菜单选项。

任何帮助将不胜感激 谢谢

【问题讨论】:

  • 您是否尝试过查看基类文档WWW::MenuGrinder。即使我没有使用它。

标签: perl catalyst


【解决方案1】:

RequirePrivilege 模块中所述,您可以通过添加need_privneed_user_in_realm 等键来限制基于权限的菜单条目。 MenuGrinder “权限”对应于 Catalyst 身份验证“角色”,因此如果您想要求用户在某个部分具有“管理员”角色,您只需这样做

<item>
    <label>Admin Section</label>
    <need_priv>admin</need_priv>
    <item>...</item>
    <item>...</item>
</item>

【讨论】:

    【解决方案2】:

    看看你的模板文件,它实际上生成了菜单。例如,假设“衣服”菜单应该只对管理员显示。 您可以编辑您的 xml 文件,例如:

    <item role="adminonly"><label>Clothes</label>...
    

    之后,如果用户具有所需的角色,您应该只签入 menuitem BLOCK:

    [% BLOCK menuitem %]
    <ul [%- IF menu.class %]class="[% menu.class %]"[% END %]>
    [% FOREACH item = menu.item %]
    [% IF item.role %]
        [% IF c.user_exists && c.check_user_roles( item.role ) %]
        <li [% IF item.active %]class="active"[% END %]>
          <a href="[% item.target %]">[% item.label %]</a>
          [% IF item.item %]
          [% PROCESS menuitem
             menu = item
          %]
        [% END %]
        </li>
        [% END %]
    [% END %]
    [% END %]
    </ul> 
    [% END %]
    
    [% PROCESS menuitem %]
    

    PS:没有测试过上面的代码

    【讨论】:

    • 谢谢 Dimitar 我得到了那件作品。他们是一个插件“RequirePrivilege”,它应该能够根据用户角色隐藏菜单选择等。如果作者提供了一些有意义的文档,这个模块将非常有用。感谢您的帮助
    • 不客气。如果他提供一些示例将非常有用