我们自定义了新闻项类型,并用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中发生。
答案 0 :(得分:4)
链接完整性通过在对象之间添加名为isReferencing
的引用来工作,但只有在修改对象时,它才会对TextFields中的HTML链接执行此操作。
要支持单个参考字段,您有两个选项:
在您添加isReferencing
关系时添加image
关系,在image
关系消失后,使用事件或扩展程序再次删除它们。然后链接完整性将开始。
跟踪删除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>