#plone #archetypes #template-tal #zpt #template-metal
#plone #архетипы #шаблон-tal #zpt #шаблон-металл
Вопрос:
Я хотел бы переопределить только «представление» классического «поля описания» стандартного типа контента Plone (документ, папка, blabla), потому что мне нужно «структурировать» текст этого поля структурированным текстом, например:
This is my description<br/>
with many lines<br/>
bla bla<br/>
Ответ №1:
Изменить шаблон, который отображает стандартное поле описания, чтобы преобразовать новые строки в разрывы, не сложно, но потребуется немного осторожности, чтобы избежать создания дыры в безопасности.
Переопределить слой обложки kss_generic_macros.pt шаблон, либо в тематическом продукте, либо в пользовательской папке.
Затем вы можете использовать Продукты.PythonScripts.standard.newline_to_br для преобразования новых строк в разрывы. Вам нужно будет вставить преобразованный текст со словом «структура», чтобы предотвратить экранирование разрывов.
Поскольку вы будете использовать «структуру», вы обязательно должны вручную экранировать html-код описания (используйте html_quote из standard ) перед применением 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>
Комментарии:
1. Это изменит представление самого элемента, но не в списках папок. Для этого вам также необходимо настроить представление по умолчанию, например, для folder_summary_view это будет выглядеть так: PythonScripts.standard»> <span> описание <</span>/p>
2. Если вы также хотите удалить завершающие символы новой строки, используйте rstrip в вызове метода выше:
context.Description().rstrip()
3. Для удобства можно использовать:
<p tal:define="pps modules/Products.PythonScripts.standard; description python:pps.html_quote(context.description.strip()); description python:pps.newline_to_br(description)" tal:content="structure description" />
Ответ №2:
Вам действительно не нужен HTML в поле описания. Это поле используется в нескольких местах и ожидает обычного текста.
Лучше всего использовать описанный выше подход для добавления дополнительного поля с другим именем.
Ответ №3:
Если вы хотите настроить виджет описания для всех типов контента, вы можете создать адаптер, используя 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, иначе этот адаптер никогда не будет использоваться.
Подробная информация:
- http://pypi.python.org/pypi/archetypes.schemaextender
- http://weblion.psu.edu/services/documentation/developing-for-plone/fsd-extender/hiding-fields
- https://svn.plone.org/svn/archetypes/MoreFieldsAndWidgets/Products .MasterSelectWidget (пример пользовательского виджета)
- http://docs.plone.org/old-reference-manuals/plone_3_theming/buildingblocks/skin/templates/customizing-at-templates/customizing-widgets.html (настройте только шаблон виджета)