前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Plone内容类型如何作为文件夹而不是事件工作

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

原创
作者头像
华科云商小徐
发布2025-01-07 10:29:32
发布2025-01-07 10:29:32
3900
代码可运行
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫
运行总次数:0
代码可运行

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, 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 实现代码:

代码语言:javascript
代码运行次数:0
运行
复制
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:

代码语言:javascript
代码运行次数:0
运行
复制
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 中注册该内容类型:

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

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档