3

ニュース アイテム タイプをカスタマイズし、埋め込み画像を 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モジュールを見てください。Archetypes参照が削除されるplone.app.linkintegrityたびに、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 に答える