Plone 是一个强大的内容管理系统(CMS),基于 Python 和 Zope 应用服务器。在 Plone 中,内容类型(或称为内容对象)如“文件夹”和“事件”是其数据模型的核心组成部分。如果你希望一个内容类型像文件夹那样行为(即可以包含其他对象),而不是像事件那样(通常用于表示日程安排的单个项目),你可以通过几种方式来实现这一点。
1、问题背景:
一位用户在 Plone 网站中创建了一个新的内容类型 Multimedia,希望能基于事件类型,但他的代码却只作为文件夹类型工作。其代码如下:
from Products.Archetypes import atapi
from Products.CMFCore import utils
def initialize(context):
"""Initializer called when used as a package."""
content_types, constructors, ftis = atapi.process_types(
atapi.listTypes(PROJECTNAME),
PROJECTNAME
)
for atype, constructor in zip(content_types, constructors):
utils.ContentInit(
"%s: %s" % (PROJECTNAME, atype.portal_type),
content_types=(atype,),
permission=DEFAULT_ADD_CONTENT_PERMISSION,
extra_constructors=(constructor,),
).initialize(context)
2、解决方案:
由于无法直接扩展 ATEvent,因此建议使用 SchemaExtender 来实现该目标。
以下是如何使用 SchemaExtender 实现代码:
from Products.Archetypes.ExtensibleMetadata import SchemaExtender
from Products.ATContentTypes.content.event import ATEvent
class MultimediaSchemaExtender(SchemaExtender):
_constructors = (ATEvent,)
def __init__(self, context):
super().__init__(context)
self.schema = ATEvent.schema.copy()
def getSchema(self):
return self.schema
然后, 在 Products.Multimedia.content.multimedia
中注册 MultimediaSchemaExtender
:
from Products.CMFCore import utils
from Products.Multimedia.content.multimedia import MultimediaSchemaExtender
def initialize(context):
"""Initializer called when used as a package."""
content_types, constructors, ftis = atapi.process_types(
atapi.listTypes(PROJECTNAME),
PROJECTNAME
)
all_content_types = content_types + []
all_constructors = constructors + []
all_ftis = ftis + []
extender = MultimediaSchemaExtender(context)
all_content_types.append(extender)
all_constructors.append('addMultimedia')
all_ftis.append('Multimedia')
utils.ContentInit(
'%s: %s' % (PROJECTNAME, 'Multimedia'),
content_types=all_content_types,
permission=DEFAULT_ADD_CONTENT_PERMISSION,
extra_constructors=all_constructors,
fti=all_ftis,
).initialize(context)
最终,在configure.zcml
中注册该内容类型:
<adapter factory=".content.multimedia.MultimediaSchemaExtender"
for="Products.ATContentTypes.content.schemata.ATEventType"
/>
使用上述解决方案,即可将 Multimedia 内容类型设置为基于事件类型。
创建或修改内容类型在 Plone 中是相对高级的操作,通常需要对 Plone 的内部结构和开发实践有一定的了解。如果你是Plone的新手,参考 Plone 社区提供的官方文档和资源,或在 Plone 社区中寻求帮助会非常有用。在进行任何此类修改之前,在开发环境中进行测试以确保新的行为符合大家的期望是非常重要的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。