在Plone 4.x安装上,也可以
我的客户希望能够拥有只能由某个用户/组查看的内容,但会在未登录时显示在菜单或搜索中.
实现此功能的最佳方法是什么?
您必须自定义工作流程,如下所示:
完成!现在,"预告片"状态中的所有内容都是可搜索的,但匿名用户无法查看.
注意:如果您选择创建新状态,正如我建议的那样,请务必添加所有需要的转换.
编辑:
不幸的是,我不知道在最近的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)
重新建立.就这样.
| 归档时间: |
|
| 查看次数: |
1242 次 |
| 最近记录: |