7

我只想覆盖 Plone 标准内容类型(文档、文件夹、blabla)的经典“描述字段”的“视图”,因为我需要使用结构化文本“结构化”该字段的文本,例如:

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

3 回答 3

6

更改呈现标准描述字段以将换行符转换为换行符的模板并不难,但需要小心避免造成安全漏洞。

在主题产品或自定义文件夹中覆盖皮肤层 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>
于 2011-10-23T16:23:22.187 回答
4

如果您想为所有内容类型自定义描述小部件,您可以使用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 否则这个适配器将永远不会被使用。

更多信息:

于 2011-10-22T13:44:29.880 回答
4

您真的不希望在描述字段中出现 HTML。该字段在许多地方使用,并且需要纯文本。

您最好使用上述方法添加一个具有不同名称的附加字段。

于 2011-10-22T18:54:44.323 回答