Plone 標準コンテンツ タイプ (Document、Folder、blabla) の古典的な「説明フィールド」の「ビュー」のみをオーバーライドしたいのですが、このフィールドのテキストを次のような構造化テキストで「構造化」する必要があるためです。
This is my description<br/>
with many lines<br/>
bla bla<br/>
Plone 標準コンテンツ タイプ (Document、Folder、blabla) の古典的な「説明フィールド」の「ビュー」のみをオーバーライドしたいのですが、このフィールドのテキストを次のような構造化テキストで「構造化」する必要があるためです。
This is my description<br/>
with many lines<br/>
bla bla<br/>
標準の説明フィールドをレンダリングするテンプレートを変更して、改行を改行に変換するのは難しくありませんが、セキュリティ ホールを作成しないように少し注意する必要があります。
テーマ製品またはカスタム フォルダーのスキン レイヤー kss_generic_macros.pt テンプレートをオーバーライドします。
次に、Products.PythonScripts.standard.newline_to_br を使用して、改行を改行に変換できます。ブレークのエスケープを防ぐために、変換されたテキストを「構造」で挿入する必要があります。
「構造」を使用するため、newline_to_br を適用する前に、説明を手動で html エスケープする (標準の html_quote を使用する) か、XSS 攻撃のベクトルを作成する必要があります。
マクロの重要なセクションは、修正されると次のようになります。
<div metal:define-macro="description-field-view"
id="parent-fieldname-description"
tal:define="kss_class python:getKssClasses('description',
templateId='kss_generic_macros', macro='description-field-view');
pps modules/Products.PythonScripts.standard"
tal:condition="context/Description"
tal:attributes="class string:documentDescription$kss_class;">
<span metal:define-slot="inside"
tal:replace="structure python:pps.newline_to_br(pps.html_quote(context.Description()))">Description</span>
</div>
すべてのコンテンツタイプの説明ウィジェットをカスタマイズする場合は、次のようにarchetypes.schemaextender(特にISchemaModifierインターフェイス)を使用してアダプターを作成できます。
from my.product.browser.interfaces import IMyProductLayer
from my.product.widgets import MyCustomWidget
from Products.ATContentTypes.interface.interfaces import IATContentType
from archetypes.schemaextender.interfaces import IBrowserLayerAwareExtender
from archetypes.schemaextender.interfaces import ISchemaModifier
class MyExtender(object):
# you could choose a more specific interface for a more fine grained override
adapts(IATContentType)
implements(IBrowserLayerAwareExtender, ISchemaModifier)
# this will limit out override to this browserlayer
layer = IMyProductLayer
def fiddle(self, schema):
# if you want to customize just the template of the original widget
# see links below
schema['description'].widget=MyCustomWidget(
label='...',
....
)
return schema
次に、次のように登録できます。
<adapter
factory=".extender.MyExtender"
provides="archetypes.schemaextender.interfaces.ISchemaModifier" />
ブラウザレイヤーIMyProductLayerを登録することを忘れないでください。登録しないと、このアダプターは使用されません。
より詳しい情報:
説明フィールドに HTML は必要ありません。このフィールドはさまざまな場所で使用され、プレーン テキストが必要です。
上記のアプローチを使用して、別の名前のフィールドを追加することをお勧めします。