新(Plone 4) plone.app.users IUserDataSchema的展示。展示了如何扩展注册表单中可以选用的用户数据字段。
项目描述
简介
在Plone 5中,注册和个人信息表单是z3c.form表单。这些表单可以扩展以允许在表单中收集任何额外数据。
此产品旨在展示如何扩展或修改plone.app.users提供的默认模式,并向注册表单添加新字段。
如果您使用的是Plone 5之前的版本,则需要查看这里的较旧版本 collective.examples.userdata。
升级者注意
之前,您的 IEnhancedUserDataSchema 是通过在 componentregistry.xml 中注册的 IUserDataSchemaProvider 工具进行注册的。如果您进行了此操作,请确保在升级之前删除此工具。这里 wildcard.fixpersistentutilities 可能会帮到您。
添加自定义用户数据字段
以下代码是从包的源代码中摘录的片段。请查看那里以获取更多示例。
创建架构
我们以与其他架构相同的方式创建字段的架构
class IEnhancedUserDataSchema(model.Schema): country = schema.TextLine( title=_(u'label_country', default=u'Country'), description=_(u'help_country', default=u"Fill in the country you live in."), required=False, )
扩展用户数据表单
要将此架构添加到表单中,我们需要为 UserDataPanel 定义一个表单扩展器,这允许我们注册任何我们想要的新字段
class UserDataPanelExtender(extensible.FormExtender): adapts(Interface, IDefaultBrowserLayer, UserDataPanel) def update(self): fields = field.Fields(IEnhancedUserDataSchema) fields = fields.omit('accept') # Users have already accepted. self.add(fields)
并在 configure.zcml 中进行注册
<adapter factory=".userdataschema.UserDataPanelExtender" provides="plone.z3cform.fieldsets.interfaces.IFormExtender" />
存储/检索自定义字段
为了将值与默认字段一起存储,我们需要向 profiles/default/memberdata_properties.xml 中添加字段。例如
<?xml version="1.0"?> <object name="portal_memberdata" meta_type="Plone Memberdata Tool"> <property name="country" type="string"></property> </object>
我们在这里不定义“接受”字段,因为那只是用于注册。用户必须接受才能在系统中拥有用户。
在值可以通过表单读取和写入之前,需要一个数据管理器来检索值。默认管理器将读取/写入架构中定义的任何字段,因此大部分工作已经为您完成
from plone.app.users.browser.account import AccountPanelSchemaAdapter class EnhancedUserDataSchemaAdapter(AccountPanelSchemaAdapter): schema = IEnhancedUserDataSchema
如果您想做些不同的事情,为该字段添加一个属性以覆盖默认行为。源代码显示了 birthdate 字段的示例。
最后,在 ZCML 中注册数据管理器
<adapter provides=".userdataschema.IEnhancedUserDataSchema" for="plone.app.layout.navigation.interfaces.INavigationRoot" factory=".adapter.EnhancedUserDataSchemaAdapter" />
扩展注册表单
要扩展注册表单,您有两个选择。要么使用 @@member-registration 观来操作哪些默认字段可见,或者为了完全控制,您可以注册另一个表单扩展器。
定义注册字段表单扩展器
为 BaseRegistrationForm 注册扩展器将允许我们在任何位置向注册表单添加字段。这是以前的方式
class RegistrationPanelExtender(extensible.FormExtender): adapts(Interface, IDefaultBrowserLayer, BaseRegistrationForm) def update(self): fields = field.Fields(IEnhancedUserDataSchema) #NB: Not omitting the accept field this time, we want people to check it self.add(fields)
并在 configure.zcml 中进行注册
<adapter factory=".userdataschema.RegistrationPanelExtender" provides="plone.z3cform.fieldsets.interfaces.IFormExtender" />
数据管理器附加到架构,因此将与用户数据表单共享。如果我们使用了不同的架构,那么我们还需要定义另一个数据管理器。
各种其他字段示例
还有各种其他额外字段,可以扩展用户配置文件。在 userdataschema.py 中,您将找到以下示例
日期字段 (birthdate)
布尔字段 (newsletter)
选择字段 (gender)
“接受条款”字段
特殊情况是 accept 字段。这是一个布尔字段,对于注册是必需的。我们通过向架构添加一个 constraint 来实现它
def validateAccept(value): if not value == True: return False return True class IEnhancedUserDataSchema(IUserDataSchema): # ... accept = schema.Bool( title=_(u'label_accept', default=u'Accept terms of use'), description=_(u'help_accept', default=u"Tick this box to indicate that you have found," " read and accepted the terms of use for this site. "), required=True, constraint=validateAccept, )
因为这个字段在注册完成后可以忽略,所以我们没有将其添加到成员数据属性中。我们还将其从用户数据表单中隐藏。
变更日志
2.1 (2014-07-03)
修复损坏的 setup.py,以便生成文档并正确安装。 [lentinj]
2.0 (2014-07-03)
将 z3c.form-based plone.app.users 转换为自定义设置。 [lentinj, vipod, thet]
0.5 (未发布)
尚未更改。
0.4 (2013-12-18)
修复性别词汇表并正确翻译。 (thet)
不要覆盖现有的用户注册字段,只添加接受和国家。 (thet)
添加“出生年份”字段,适用于询问确切出生日期太多的情况。 (thet)
使用本地化目录而不是 i18n 并进行一般清理。 (thet)
迁移到 github (Kees Hink)
添加德语翻译 (Pavel Bogdanovic,2011-10-28).
0.3 (2010-09-26)
通过覆盖 componentregistry.xml 中的实用程序,使自定义字段仅在通过通用设置安装产品时可用 (Elizabeth Leddy)。
添加了包含配置版本信息的metadata.xml。
0.2 (2010-04-12)
覆盖了plone.app.users的适配器类,因此@@personal-information将显示本产品中定义的额外字段。这需要plone.app.users >= 1.0b7。
0.1 (2010-02-28)
初始版本
待办事项
卸载此产品目前会破坏网站。应添加卸载步骤,以将产品添加的字段从ZMI的用户属性中移除。
项目详情
collective.examples.userdata-2.1.zip的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 53bb69c9113547ab1f8d2ac592b7d9521e6fc9a6a8bc519493c63eecee39bce6 |
|
MD5 | ba1956a0eeb0fb30a9c84a1eadb91aec |
|
BLAKE2b-256 | 9934ad7ad2396623af74cc879262ab336a49884811e093e957ba0e3b0497a650 |