Plone 4:限制发布的内容

Ste*_*ran 6 workflow plone

在Plone 4.x安装上,也可以

  1. 发布的内容仅限于某个用户/组或
  2. 将私人内容显示在菜单中并搜索未登录的用户?

我的客户希望能够拥有只能由某个用户/组查看的内容,但会在未登录时显示在菜单或搜索中.

实现此功能的最佳方法是什么?

Gia*_*oli 7

您必须自定义工作流程,如下所示:

  • 转到Zope Management Interface-> portal_workflow
  • 创建一个新状态,让我们说"预告片"(这是可选的,您可以自定义现有状态......也许私有状态是处理特定用户/组限制的好选择)
  • 删除所有权限,但从该特定状态的匿名用户"访问内容信息"
  • 按"更新安全设置"按钮

完成!现在,"预告片"状态中的所有内容都是可搜索的,但匿名用户无法查看.

注意:如果您选择创建新状态,正如我建议的那样,请务必添加所有需要的转换.

编辑:

不幸的是,我不知道在最近的Plone版本中,portal_catalog(allowedRolesAndUsers)中有一个新索引阻止上述过程像以前一样工作.上面的过程仍然是正确的,但您需要覆盖默认索引器.首先使用"plone"模板创建一个带贴纸的新包.然后在包的主级别(例如my.package/my/package)中添加一个调用indexers.py此文件的文件:

from zope.interface import Interface
from plone.indexer.decorator import indexer
from AccessControl.PermissionRole import rolesForPermissionOn
from Products.CMFCore.utils import getToolByName
from Products.CMFCore.CatalogTool import _mergedLocalRoles

@indexer(Interface)
def allowedRolesAndUsers(obj):
    """Return a list of roles and users with View permission.

    Used by PortalCatalog to filter out items you're not allowed to see.
    """
    allowed = {}
    for r in rolesForPermissionOn('Access contents information', obj):
        allowed[r] = 1
    # shortcut roles and only index the most basic system role if the object
    # is viewable by either of those
    if 'Anonymous' in allowed:
        return ['Anonymous']
    elif 'Authenticated' in allowed:
        return ['Authenticated']
    localroles = {}
    try:
        acl_users = getToolByName(obj, 'acl_users', None)
        if acl_users is not None:
            localroles = acl_users._getAllLocalRoles(obj)
    except AttributeError:
        localroles = _mergedLocalRoles(obj)
    for user, roles in localroles.items():
        for role in roles:
            if role in allowed:
                allowed['user:' + user] = 1
    if 'Owner' in allowed:
        del allowed['Owner']
    return list(allowed.keys())
Run Code Online (Sandbox Code Playgroud)

然后在同一级别添加一个文件overrides.zcml:

<configure xmlns="http://namespaces.zope.org/zope">

    <adapter factory=".indexers.allowedRolesAndUsers" name="allowedRolesAndUsers" />

</configure>
Run Code Online (Sandbox Code Playgroud)

最后,您的产品树应如下所示:

my.package/
??? my
?   ??? __init__.py
?   ??? package
?       ??? configure.zcml
?       ??? overrides.zcml
?       ??? indexers.py
?       ??? __init__.py
?       ??? profiles
?       ?   ??? default
?       ?       ??? metadata.xml
?       ??? tests.py
??? README.txt
??? setup.cfg
??? setup.py
Run Code Online (Sandbox Code Playgroud)

最后,您需要在buildout.cfg中包含新创建的egg:

eggs =
        my.package

develop =
        src/my.package
Run Code Online (Sandbox Code Playgroud)

重新建立.就这样.