3

我们自定义了 News Item-type 并将嵌入的图像替换为 ExtendedReferenceField(我们使用中央图像存储库)。

有没有办法在该字段上激活链接完整性检查,以便在尝试删除图像时触发警告?

(是的,在@@editing-controlpanel 中启用了链接完整性检查,当我在内容正文中插入链接和图像时工作得很好)。

使用的 schemaextender 字段的精简代码:

from zope.interface import implements
from archetypes.schemaextender.interfaces import ISchemaExtender
from archetypes.schemaextender.interfaces import IBrowserLayerAwareExtender
from archetypes.schemaextender.field import ExtensionField
from Products.Archetypes import atapi
from archetypes.referencebrowserwidget.widget import ReferenceBrowserWidget

class ExtendedReferenceField(ExtensionField, atapi.ReferenceField):
    """ Extention reference field. """

class ImageReferenceExtender(object):
    implements(ISchemaExtender, IBrowserLayerAwareExtender)

    layer = IPackageSpecific

    fields = [
        ExtendedReferenceField(
            name= 'imageref',
            required = False,
            multiValued=False,
            allowed_types=('Image', ),
            relationship='image',
            keepReferencesOnCopy=True,
            widget = ReferenceBrowserWidget(
                ...
                )),
    ]

    def __init__(self, context):
        self.context = context

    def getFields(self):
        return self.fields

这发生在 Plone 版本 3.3.6 和 4.1.6 中。

4

1 回答 1

4

链接完整性通过isReferencing在对象之间添加命名的引用来工作,但它只对 TextFields 中的 HTML 链接执行此操作,只要修改了对象。

要支持单个参考字段,您有 2 个选项:

  1. isReferencing每当您添加关系时添加关系,当关系消失image时再次删除它们,使用事件或扩展器。image链接完整性将启动。

  2. image将关系的删除作为完整性破坏进行跟踪。您需要检查是否正在删除引用对象。

    看一下包的handlers.py模块plone.app.linkintegrity。每当删除任何Archetypes 引用时,referenceRemoved都会调用事件处理程序。它更新存储,添加关系的源和目标,并在处理内容对象删除时参考此存储。ILinkIntegrityInfoisReferencing

    为您的参考创建一个新的事件处理程序image,它将以相同的方式处理;删除引用的图像,将引发链接完整性警告:

    from plone.app.linkintegrity.interfaces import ILinkIntegrityInfo
    from Products.Archetypes.interfaces import IReference
    from Acquisition import aq_get
    
    def imageReferenceRemoved(obj, event):
        assert IReference.providedBy(obj)
        assert obj is event.object # just making sure...
        if not obj.relationship == 'image':
            return
        # if the object the event was fired on doesn't have a `REQUEST` attribute
        # we can safely assume no direct user action was involved and therefore
        # never raise a link integrity exception...
        request = aq_get(obj, 'REQUEST', None)
        if not request:
            return
        storage = ILinkIntegrityInfo(request)
        storage.addBreach(obj.getSourceObject(), obj.getTargetObject())
    

    在 ZCML 注册:

     <configure xmlns="http://namespaces.zope.org/zope">
     <subscriber
         for="Products.Archetypes.interfaces.IReference
              zope.lifecycleevent.interfaces.IObjectRemovedEvent"
         handler=".events.imageReferenceRemoved"
         />
     </configure>
    
于 2012-09-07T09:28:51.397 回答