我们的一位客户希望在添加表单之前添加每次用户添加某些特定内容类型时必须显示的服务条款页面。
有关如何实施此建议的任何建议?
答案 0 :(得分:2)
如果是敏捷内容类型,您可以这样做:
使用您的服务条款创建自定义表单。在表单的按钮处理程序中,重定向到添加表单:
self.request.response.redirect(self.context.absolute_url() + '/++add++name.of.content.type')
现在在portal_types的类型的工厂信息中,像这样设置add_view_expr:
<property name="add_view_expr">string:${folder_url}/@@terms-of-service</property>
所以当您单击工厂菜单中的类型而不是直接添加到表单时,它会转到自定义TOS表单。
(注意:这种方法的缺点是,如果用户直接输入添加表单的URL,他们可以绕过TOS表单。)
答案 1 :(得分:1)
一种可能的解决方案可能是使用cookie / session_data_manager / token / you-name - 它在该内容类型的自定义AddForm上检查是否存在。
如果它没有重定向到重定向到Addform的服务条款表格,现在它将接受继续,因为cookie / session_data_manager / token / you-name-它将在那里。
答案 2 :(得分:1)
一个想法:当你要添加新的内容类型(基于AT的内容类型,这不适用于敏捷的内容类型)时,你正在调用
http://something/createObject?type_name=Document
您可以将createObject
脚本转换为显示免责声明表单的视图,并在提交时进行验证。
当用户接受免责声明时,您会将使用重定向到
http://plone4.gest.unipd.it:8080/gest/it/realCreateObject?type_name=Document
其中realCreateObject
是原始Plone createObject
脚本的复制/粘贴。
但是:上面Mathias的建议非常好:只需添加一个假的复选框字段并进行验证。
答案 3 :(得分:1)
如问题评论中所述。我建议在内容中添加一个复选框。
对于AT内容,您可以添加BooleanField
...
atapi.BooleanField(
name='acceptConditions',
schemata='default',
required=False,
default=False,
validators=('acceptConditions', ),
widget=atapi.BooleanWidget(
label=_(u'label_accept_conditions', default='Conditions'),
description=_(
u'help_accept_conditions',
default='Please accept the <a target="_blank" '
'href="./conditions_view">'
'conditions<a/>.')
),
)
...
在窗口小部件上有一个条件(在这种情况下是一个浏览器视图,它检查布尔字段是否应该可见)。
YourSchema['acceptConditions'].widget.setCondition(
'python: here.restrictedTraverse("@@show_condition_field").show()')