Plone:为用户(成员)添加额外的注册字段

Plone: Add additional registration fields to users (members)

我的组对象有两个附加字段(如 here 所述)。 现在我的成员对象也需要(其他)附加字段(短字符串)。我已经在 portal_memberdata/manage_propertiesForm 中创建了它们,但我仍然不能 select 它们用于注册表单使用 (@@member-registration)。

我需要两个新的注册字段,至少其中一个是必填的。我怎样才能做到这一点?谢谢!

更新: 我找到 plone.app.users.userdataschema 并将我的字段添加到界面 IUserDataSchema;此外,我 monkeypatched plone.app.users.browser.personalpreferences.UserDataPanelAdapter。似乎仍然缺少一些东西(@@member-registration 中没有可见的变化)。

我的自定义代码如下所示:

from plone.app.users.userdataschema import IUserDataSchema
from zope import schema
from Products.CMFPlone import PloneMessageFactory as _

IUserDataSchema.custom1 = schema.ASCIILine(
        title=_(u'label_custom1',
                default=u'Custom1 member id'),
        description=_(u'help_custom1_creation',
                      default=u'Custom1 membership is required; '
                      u'please enter your member id'),
        required=True)

from plone.app.users.browser.personalpreferences import UserDataPanelAdapter

def set_custom1(self, value):
    if value is None:
        value = ''
    return self.context.setMemberProperties({'custom1': value})

def get_custom1(self):
    return self._getProperty('custom1')

UserDataPanelAdapter.custom1 = property(get_custom1, set_custom1)

我用monkeypatched原版接口的时候没用class; 但它 确实 可以将 UserDataSchemaProvider monkeypatch 到 return 子 class:

from plone.app.users.userdataschema import IUserDataSchema
from plone.app.users.userdataschema import UserDataSchemaProvider
from zope import schema
from Products.CMFPlone import PloneMessageFactory as _


class IUserDataSchemaExtended(IUserDataSchema):
    """
    Extends the userdata schema
    by a mandatory field
    """
    customField1 = schema.ASCIILine(
        title=_(u'label_customField1',
                default=u'CustomField1 member id'),
        description=_(u'help_customField1_creation',
                      default=u'CustomField1 membership is required; '
                      u'please enter your member id'),
        required=True)

def getExtendedSchema(self):
    return IUserDataSchemaExtended

UserDataSchemaProvider.getSchema = getExtendedSchema

from plone.app.users.browser.personalpreferences import UserDataPanelAdapter

def set_customField1(self, value):
    if value is None:
        value = ''
    return self.context.setMemberProperties({'customField1': value})

def get_customField1(self):
    return self._getProperty('customField1')

UserDataPanelAdapter.customField1 = property(get_customField1, set_customField1)

备注:

  • 当注册页面为 quickedit 时,简单地使用 customField1 作为可翻译标题而不是 label_customField 作为字段使用的名称可能更好埃德

  • 对于 Plone 5,显然可以通过 XML

  • 配置额外的用户数据字段