【问题标题】:Disable "Advanced ..." in workflow status menu in Plone在 Plone 的工作流状态菜单中禁用“高级...”
【发布时间】:2012-08-11 01:40:39
【问题描述】:

我想为除经理和站点管理员之外的其他角色禁用工作流状态菜单中的“高级...”(content_status_history) 链接。是否有我可以用来执行此操作的权限?还是这个链接的权限加上转换的存在?

【问题讨论】:

    标签: plone


    【解决方案1】:

    链接的存在与工作流转换相关联。它链接到的表单提供了额外的选项来设置当前对象上可用的转换。没有权限控制它的存在;菜单项是硬编​​码的。

    来自plone.app.contentmenu.menu source

        if len(results) > 0:
            results.append({ 'title'        : _(u'label_advanced', default=u'Advanced...'),
                             'description'  : '',
                             'action'       : url + '/content_status_history',
                             'selected'     : False,
                             'icon'         : None,
                             'extra'        : {'id': 'advanced', 'separator': 'actionSeparator', 'class': 'kssIgnore'},
                             'submenu'      : None,
                            })
    

    要提供您自己的实现(如果满足某些条件,可能会使用一个删除最后一个选项的子类),您必须使用override 重新定义browser:menu 注册.

    在您的 overrides.zcml 中,您必须使用以下 browser:menu 声明指向您自己的实现:

      <browser:menu
        id="plone_contentmenu_workflow"
        title="The 'workflow' menu - allows the user to execute workflow transitions"
        class=".yourmodule.YourWorkflowMenu"
        />
    

    然后在yourmodule.py 创建一个YourWorkflowMenu 类,类似于:

    from plone.app.contentmenu.menu import WorkflowMenu
    
    class YourWorkflowMenu(WorkflowMenu):
        def getMenuItems(self, context, request):
            results = super(YourWorkflowMenu, self).getMenuItems(context, request)
            if len(results) > 0 and someothercondition:
                # Remove status history menu item ('Advanced...')
                results = [r for r in results
                    if not r['action'].endswith('/content_status_history')]
            return results
    

    【讨论】:

    • 我期待一种更短的方法来获得权限。但这行得通。
    • 很棒的答案,就像 Plone 4.2 上的魅力一样。如果可以的话,我会 +100。
    【解决方案2】:

    你应该可以通过添加隐藏菜单项

    a#advanced {
       display: none;
    }
    

    你的风格。

    与之前臃肿的干净解决方案相比,这是一个务实的解决方案。

    【讨论】:

    • 这会隐藏菜单,但不会对可以观察或猜测其 URL 的人禁用它。这是否是一个问题取决于具体情况。
    • 对...但是底层安全机制仍然适用于此。
    • 这个建议对我来说已经很明显了。但我不仅想隐藏它,还想禁用它。还是谢谢。
    • 有什么区别。即使您删除了菜单项,执行操作的视图仍然存在。这是最简单、最好的解决方案。
    • 此外,如果您通过“内容”选项卡,标记一篇文章并点击“更改状态”按钮,也会显示该表单。要真正为除经理以外的所有人禁用它,您还必须至少自定义 content_status_history-template。我不明白用例,因为这是一个批处理功能,而不是访问问题,不是吗?
    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多