我想只删除Plone标准内容类型(Document,Folder,blabla)的经典“描述字段”的“视图”,因为我需要用结构化文本“结构化”这个字段的文本:
This is my description<br/>
with many lines<br/>
bla bla<br/>
答案 0 :(得分: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>
答案 1 :(得分: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" />
不要忘记register your browser layer IMyProductLayer或永远不会使用此适配器。
更多信息:
答案 2 :(得分:4)
您真的不希望HTML在说明字段中。此字段在许多地方使用,并且需要纯文本。
您最好使用上述方法添加具有不同名称的其他字段。