7

私が取り組んでいるプロジェクトでは、Plone の素晴らしい Dexterity プラグインを使用しています。いくつかのカスタム コンテンツ タイプには、計算する必要がある非常に具体的な名前があります。私が以前にこれを達成した方法は、マニュアルの指示に従って、オブジェクトの一般的なセットアップ エントリの動作としてplone.app.content.interfaces.INameFromTitleを追加することでした。

<?xml version="1.0"?>
<object name="avrc.aeh.cycle" meta_type="Dexterity FTI">
  ...
  <property name="schema">myproject.mytype.IMyType</property> 
  <property name="klass">plone.dexterity.content.Item</property>
  ...
  <property name="behaviors">
    <element value="plone.app.content.interfaces.INameFromTitle" />
  </property>
  ...
</object>

次に、INameFromTitle を提供するアダプターを作成しました。

from five import grok
from zope.interface import Interface
import zope.schema
from plone.app.content.interfaces import INameFromTitle

class IMyType(Interface):

    foo = zope.schema.TextLine(
        title=u'Foo'
        )

class NameForMyType(grok.Adapter):
    grok.context(IMyType)
    grok.provides(INameFromTitle)

    @property
    def title(self):
        return u'Custom Title %s' % self.context.foo

この方法は、このブログ投稿で提案されている方法と非常によく似ています。

http://davidjb.com/blog/2010/04/plone-and-dexterity-working-with-computed-fields

残念ながら、この方法は plone.app.dexterity ベータ版以降は機能しなくなり、コンテンツ アイテムに適切な名前が割り当てられなくなりました。

Dexterity の INameFromTitle 動作を非常に具体的なネーミングのユースケースに拡張する方法を知っている人はいますか?

あなたの助けは大歓迎です、ありがとう!

4

2 に答える 2

4

以下を試すことができます。

interfaces.py

from plone.app.content.interfaces import INameFromTitle

class INameForMyType(INameFromTitle):

    def title():
        """Return a custom title"""

behaviors.py

from myproject.mytype.interfaces import INameForMyType

class NameForMyType(object):
    implements(INameForMyType)

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

    @property
    def title(self):
        return u"Custom Title %s" % self.context.foo

私は通常、ZCML を使用してアダプターを定義することを好みます。configure.zcml

<adapter for="myproject.mytype.IMyType"
         factory=".behaviors.NameForMyType"
         provides=".behaviors.INameForMyType"
         />

しかし、おそらく grok.global_adapter も使用できます。

于 2012-01-05T09:39:46.400 に答える
3

INameFromTitle に適応することで、動作でそれを行いました

behaviors.py

class INameFromBrandAndModel(Interface):
    """ Interface to adapt to INameFromTitle """

class NameFromBrandAndModel(object):
    """ Adapter to INameFromTitle """
    implements(INameFromTitle)
    adapts(INameFromBrandAndModel)

    def __init__(self, context):
        pass

    def __new__(cls, context):
        brand = context.brand
        model = context.modeltype    
        title = u'%s %s' % (brand,model)
        inst = super(NameFromBrandAndModel, cls).__new__(cls)

        inst.title = title
        context.setTitle(title)

        return inst

behaviors.zcmlまたはconfigure.zcml

<plone:behavior

    title="Name from brand and model"
    description="generates a name from brand and model attributes"
    for="plone.dexterity.interfaces.IDexterityContent"
    provides=".behavios.INameFromBrandAndModel"
    />

<adapter factory=".behaviors.NameFromBrandAndModel" />

次に、 で INameFromTitle の動作を無効にしprofiles/types/your.contenttype.xmlます。

出来上がり。これは非常にうまく統合されており、デフォルトのビューとナビゲーションに適切なタイトルが表示されます。アダプターから削除context.setTitle(title) すると、適切な ID だけが残りますが、タイトルは設定されません。

これは、編集後に勝手にタイトルを変更するものではありません。これまでのところ、klassコンテンツ タイプのプロパティをオーバーライドすることに成功していません。

titleスキーマで属性を定義すると、次のようになります。

class IBike(form.Schema):
    """A bike
    """

    title = schema.TextLine(
        title = _(u'Title'),
        required = False,
    )

タイトルは後で簡単に変更できます。誤解を避けるために、addForm のタイトル フィールドを非表示にする必要があります。

于 2012-10-13T17:44:15.980 に答える