在Plone 4.x安装上,可以
我的客户希望能够拥有只能由特定用户/群组查看的内容,但会在未登录时显示在菜单或搜索中。
实现此功能的最佳方法是什么?
答案 0 :(得分:7)
您必须自定义工作流程,如下所示:
完成! 现在,“预告片”状态中的所有内容都是可搜索的,但匿名用户无法查看。
注意:如果您选择创建新状态,正如我所建议的那样,请务必添加所有需要的转换。
修改强>:
不幸的是,我不知道在最近的Plone版本中,portal_catalog(allowedRolesAndUsers)中有一个新索引阻止上述过程像以前一样工作。上面的过程仍然是正确的,但您需要覆盖默认索引器。
首先create a new package with paster使用“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())
然后在同一级别添加一个文件overrides.zcml
:
<configure xmlns="http://namespaces.zope.org/zope">
<adapter factory=".indexers.allowedRolesAndUsers" name="allowedRolesAndUsers" />
</configure>
最后,您的产品树应该如下所示:
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
最后,您需要在buildout.cfg中包含新创建的egg:
eggs =
my.package
develop =
src/my.package
重新运行扩建。就是这样。