链接完整性检查引用?

时间:2012-09-06 13:16:58

标签: reference plone

我们自定义了新闻项类型,并用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中发生。

1 个答案:

答案 0 :(得分:4)

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

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

  1. 在您添加isReferencing关系时添加image关系,在image关系消失后,使用事件或扩展程序再次删除它们。然后链接完整性将开始。

  2. 跟踪删除image关系是否存在完整性违规行为。您需要检查是否正在删除引用对象。

    查看plone.app.linkintegrity包的handlers.py module。只要删除任何 Archetypes引用,就会调用referenceRemoved事件处理程序。它更新ILinkIntegrityInfo存储,添加isReferencing关系的源和目标,并在处理内容对象删除时查阅此存储。

    为您的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>