标题更改后自动重命名

时间:2012-03-20 04:51:58

标签: plone archetypes

实现

功能的最佳方法是什么?
  • 所有商品都会获得新的ID,不会自动编辑标题,也不需要手动重命名

  • 这将使用默认情况下Plone使用的id规范化+计数器格式

  • 可以为所有Archetypes内容类型全局启用

3 个答案:

答案 0 :(得分:7)

Yuri在正确的轨道上 - 快速而且非常脏,我相信这会奏效:

context.setTitle('lorem ipsum')
context.unmarkCreationFlag()
context.processForm()

严格来说,这不是文档所说的 - 因为它不应该重命名,如果它没有门户工厂中生成的临时ID,但是当我修改了仍有的对象的标题时,我正在重命名CreationFlag标记为

答案 1 :(得分:3)

除了这是一个坏主意(每次编辑标题时所有网址都中断),我会使用自定义事件执行此操作。您必须复制在创建时重命名对象时使用的Archetypes内置的一些功能,因为您不希望每次编辑时都重命名:

from Products.Archetypes.interfaces import (
    IBaseObject,
    IObjectEditedEvent,
)
import re
from zope.component import adapter


endsWithNumber = re.compile('-\d+$')


@adapter(IBaseObject, IObjectEditedEvent)
def renameOnEdit(obj, event):
    old_id = obj.getId()
    without_number = endsWithNumber.sub('', old_id)

    # New id based on Title
    new_id = obj.generateNewId()
    if new_id == old_id or new_id == without_number:
        # No change
        return

    new_id = obj._findUniqueId(new_id)
    if new_id is None:
        # Couldn't find a new unique id (out of sequence numbers?)
        return

    obj.setId(new_id)

答案 2 :(得分:0)

我认为archetypes内置了这个:

http://plone.org/documentation/kb/richdocument/controlling-creation

如果您需要对标题的生成方式进行更细粒度的控制,可以从“Archetypes / BaseObject.py”重新定义_renameAfterCreation()方法

所以重新定义它应该是方式。