Переопределить только поле «Описание» стандартного типа контента Plone - PullRequest
7 голосов
/ 22 октября 2011

Я хотел бы переопределить только «представление» классического «поля описания» стандартного типа контента Plone (Document, Folder, blabla), потому что мне нужно «структурировать» текст этого поля структурированным текстом, например :

This is my description<br/>
with many lines<br/>
bla bla<br/>

Ответы [ 3 ]

6 голосов
/ 23 октября 2011

Изменить шаблон, который отображает стандартное поле описания, чтобы преобразовать переводы строк в разрывы, не сложно, но потребуется немного осторожности, чтобы избежать создания дыры в безопасности.

Переопределить шаблон слоя кожи kss_generic_macros.pt, либо в тематическом продукте, либо в пользовательской папке.

Затем вы можете использовать Products.PythonScripts.standard.newline_to_br для преобразования новых строк в разрывы. Вам нужно будет вставить преобразованный текст со «структурой», чтобы избежать выхода из разрывов.

Поскольку вы будете использовать «структуру», вам также необходимо вручную html экранировать описание (используйте html_quote из стандарта) перед применением newline_to_br, или вы создадите вектор для атаки 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>
4 голосов
/ 22 октября 2011

Вы действительно не хотите HTML в поле описания.Это поле используется в нескольких местах и ​​ожидает простой текст.

Лучше всего использовать описанный выше подход, чтобы добавить дополнительное поле с другим именем.

4 голосов
/ 22 октября 2011

Если вы хотите настроить виджет описания для всех типов контента, вы можете создать адаптер, используя 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, иначе этот адаптер никогда не будет использоваться.

Дополнительная информация:

...