您现在的位置是:首页 > 编程 > 

Plone内容类型如何作为文件夹而不是事件工作

2025-07-25 10:13:21
Plone内容类型如何作为文件夹而不是事件工作 Plone 是一个强大的内容管理系统(CMS),基于 Python 和 Zope 应用服务器。在 Plone 中,内容类型(或称为内容对象)如“文件夹”和“事件”是其数据模型的核心组成部分。如果你希望一个内容类型像文件夹那样行为(即可以包含其他对象),而不是像事件那样(通常用于表示日程安排的单个项目),你可以通过几种方式来实现这一点。1、问题背景:一

Plone内容类型如何作为文件夹而不是事件工作

Plone 是一个强大的内容管理系统(CMS),基于 Python 和 Zope 应用服务器。在 Plone 中,内容类型(或称为内容对象)如“文件夹”和“事件”是其数据模型的核心组成部分。如果你希望一个内容类型像文件夹那样行为(即可以包含其他对象),而不是像事件那样(通常用于表示日程安排的单个项目),你可以通过几种方式来实现这一点。

1、问题背景:

一位用户在 Plone 网站中创建了一个新的内容类型 Multimedia,希望能基于事件类型,但他的代码却只作为文件夹类型工作。其代码如下:

代码语言:javascript代码运行次数:0运行复制
from Products.Archetypes import atapi
from Products.CMFCore import utils
​
def initialize(context):
    """Initializer called when used as a package."""
​
    content_types, ctructors, ftis = atapi.process_types(
        atapi.listTypes(PROJECTAME),
        PROJECTAME
    )
​
    for atype, ctructor in zip(content_types, ctructors):
        utils.ContentInit(
            "%s: %s" % (PROJECTAME, atype.portal_type),
            content_types=(atype,),
            permission=DEFAULT_ADD_COTET_PERMISSIO,
            extra_ctructors=(ctructor,),
        ).initialize(context)                                              

2、解决方案:

由于无法直接扩展 ATEvent,因此建议使用 SchemaExtender 来实现该目标。

以下是如何使用 SchemaExtender 实现代码:

代码语言:javascript代码运行次数:0运行复制
from Products.Archetypes.ExtensibleMetadata import SchemaExtender
from Products. import ATEvent
​
class MultimediaSchemaExtender(SchemaExtender):
    _ctructors = (ATEvent,)
    
    def __init__(self, context):
        super().__init__(context)
        self.schema = ATEvent.()
        
    def getSchema(self):
        return self.schema

然后, 在 Products. 中注册 MultimediaSchemaExtender:

代码语言:javascript代码运行次数:0运行复制
from Products.CMFCore import utils
from Products. import MultimediaSchemaExtender
​
def initialize(context):
    """Initializer called when used as a package."""
    
    content_types, ctructors, ftis = atapi.process_types(
        atapi.listTypes(PROJECTAME),
        PROJECTAME
    )
    
    all_content_types = content_types + []
    all_ctructors = ctructors + []
    all_ftis = ftis + []
    
    extender = MultimediaSchemaExtender(context)
    all_content_types.append(extender)
    all_ctructors.append('addMultimedia')
    all_ftis.append('Multimedia')
    
    utils.ContentInit(
        '%s: %s' % (PROJECTAME, 'Multimedia'),
        content_types=all_content_types,
        permission=DEFAULT_ADD_COTET_PERMISSIO,
        extra_ctructors=all_ctructors,
        fti=all_ftis,
    ).initialize(context)

最终,在configure.zcml 中注册该内容类型:

代码语言:javascript代码运行次数:0运行复制
<adapter factory=".MultimediaSchemaExtender"
             for="Products.schemata.ATEventType"
             />

使用上述解决方案,即可将 Multimedia 内容类型设置为基于事件类型。

创建或修改内容类型在 Plone 中是相对高级的操作,通常需要对 Plone 的内部结构和开发实践有一定的了解。如果你是Plone的新手,参考 Plone 社区提供的官方文档和资源,或在 Plone 社区中寻求帮助会非常有用。在进行任何此类修改之前,在开发环境中进行测试以确保新的行为符合大家的期望是非常重要的。

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1193329.html

相关标签:无
上传时间: 2025-07-23 02:23:21
留言与评论(共有 13 条评论)
本站网友 深度水解奶粉
15分钟前 发表
ctructor in zip(content_types
本站网友 房产中介怎么做
2分钟前 发表
PROJECTAME ) all_content_types = content_types + [] all_ctructors = ctructors + [] all_ftis = ftis + [] extender = MultimediaSchemaExtender(context) all_content_types.append(extender) all_ctructors.append('addMultimedia') all_ftis.append('Multimedia') utils.ContentInit( '%s
本站网友 广州治疗尖锐湿疣
26分钟前 发表
content_types=(atype
本站网友 qq临时会话软件
22分钟前 发表
permission=DEFAULT_ADD_COTET_PERMISSIO
本站网友 七叶神安滴丸多少钱一盒
0秒前 发表
创建或修改内容类型在 Plone 中是相对高级的操作
本站网友 地址转换
2分钟前 发表
通常需要对 Plone 的内部结构和开发实践有一定的了解
本站网友 鸡骨草的作用
16分钟前 发表
).initialize(context) 2
本站网友 中南
21分钟前 发表
super().__init__(context) self.schema = ATEvent.() def getSchema(self)
本站网友 城际轨道交通
10分钟前 发表
因此建议使用 SchemaExtender 来实现该目标
本站网友 西安小吃攻略
11分钟前 发表
extra_ctructors=all_ctructors
本站网友 东方之珠ktv
13分钟前 发表
因此建议使用 SchemaExtender 来实现该目标
本站网友 行房
8分钟前 发表
以下是如何使用 SchemaExtender 实现代码