首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Plone:(原型)使新闻项目和事件变得愚蠢

Plone:(原型)使新闻项目和事件变得愚蠢
EN

Stack Overflow用户
提问于 2017-11-22 16:11:02
回答 2查看 110关注 0票数 1

我看到我可以使用collective.folderishtypes来添加新类型(folderish)来代替默认的新闻项目和事件。但我想把现有的新闻项目和事件转换成粗俗的内容类型,并尽量保持它的简单性。有可能覆盖(猴子补丁)吗?默认类型以一种简单的方式(结果是现有对象具有折叠式行为)?

或者,解决这个问题的好办法是什么?我只需要解决现有的对象,也没有混淆的重复内容类型,如:添加新的新闻项目,新闻项目文件夹.等,如果可能的话,保持现有的列表(如最新事件)的工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-24 09:40:06

我没有使用collective.folderish的经验,这种描述听起来很有希望,可惜它似乎不适合你。

如果我需要解决这个问题,而且不需要保留历史记录(工作流-&内容-历史记录),我会创建一个具有相同字段的新类型,为每个事件和新闻创建一个新类型的实例,并复制该字段的值。

这将改变修改日期,但可以通过将mod-date复制到发布日期字段(如果没有使用)并执行“最新新闻/事件”列表(包括按发布日期排序的集合)来克服。

但是,如果您希望保留历史记录并保留mod-日期不变,您可以为每个新闻/事件项目创建一个文件夹,将项目放入文件夹中,将项目设置为文件夹的默认视图,并将文件夹重命名为与项目相同的id。这将使文件夹和项在UI中显示为一个项,并且指向该项的链接不会中断,因为该文件夹位于目的地。

我用浏览器视图脚本测试了这个。唉,添加一个文件夹并在一个脚本运行中移动项目,因为我无法在短时间内找到的原因而无法工作。因此,我们需要调用浏览器视图三次:

代码语言:javascript
运行
复制
from Acquisition import aq_parent, aq_inner
from Products.Five.browser import BrowserView


class View(BrowserView):

    report = ''

    def __call__(self):
        portal = self.context
        catalog = portal.portal_catalog
        news_items = catalog.searchResults(portal_type='News Item')
        event_items = catalog.searchResults(portal_type='Event')
        items = news_items + event_items
        for i, item in enumerate(items):
            self.processItem(item, i, len(items))
        return self.report


    def processItem(self, item, i, itemsAmount):
        item      = item.getObject()
        item_id   = item.id
        parent    = aq_parent(aq_inner(item))
        folder = None
        folder_id = item_id + '-container'


        if item_id == parent.id:

            if i == itemsAmount-1: self.report += '\
Nothing to do, all ' +  str(itemsAmount) + ' items have the same id as their parent.'


        else:
            if parent.id == folder_id:
                parent = getParent(parent)
                folder = parent[folder_id]
                folder.setDefaultPage(item_id)
                parent.manage_renameObject(folder.id, item_id)
                if i == itemsAmount-1: self.report += '\
Step 3/3: Renamed ' +  str(itemsAmount) + ' folder-ids.'

            else:
                try:
                    folder = addFolder(parent, folder_id)
                    if i == itemsAmount-1: self.report += '\
Step 1/3: Added ' +  str(itemsAmount) + ' folders.'

                    folder.setTitle(item_id) # set same title as item has
                    folder.reindexObject()
                except:
                    folder = parent[folder_id]
                try:
                    cutAndPaste(item, folder)
                    if i == itemsAmount-1: self.report += '\
Step 2/3: Moved ' +  str(itemsAmount) + ' items into folders.'
                except:
                    pass

def addFolder(parent, folder_id):
    parent.invokeFactory('Folder', folder_id)
    folder = parent[folder_id]
    folder.setTitle(folder_id)
    folder.reindexObject()
    return folder

def cutAndPaste(item, folder):
    """ Move item into folder. """
    parent = aq_parent(aq_inner(item))
    clipboard = parent.manage_cutObjects([item.id])
    folder.manage_pasteObjects(clipboard)
    folder.reindexObject()

def getParent(item):
    return aq_parent(aq_inner(item))

免责声明:

  1. 每次使用事件侦听器创建新的事件/新闻项时,都需要执行此过程。
  2. 最好为流程的每一步创建新的事件侦听器,并在前一步结束时启动下一步。
  3. 文件夹的临时id(由item-id和任意后缀“-container”组成)假定在项的父项中不存在。尽管这种情况不太可能发生,但您可能也希望在脚本中获取该异常。
票数 2
EN

Stack Overflow用户

发布于 2017-11-23 11:15:21

我还没有测试过这一点,但是基于collective.folderishtypes 文档 (“如何将非折叠类型迁移到折叠式类型”),您应该能够调用Plone站点根目录上的@@migrate-btrees视图来将非折叠式内容类型迁移到folderish。

警告:在尝试迁移之前对数据库进行备份,并在应用于生产数据之前先在开发环境中进行测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47439248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档