4

我正在尝试制作一个附加组件,其中包括向个人偏好页面添加另一个选项。我试图从松散相关主题的各种指南中拼凑出如何正确地做到这一点,但我没有运气。我刚刚进入 Plone 开发,其中很多对我来说有些陌生,所以请善待:)

我在 Plone 4.3 中做这一切

当我在网站上启用插件时,它不会给我任何错误,但额外字段不包含在首选项页面中。

到目前为止,我有这样的东西,忽略奇怪的命名方案。同样,这是从其他指南拼凑而成的,我想在重构之前让它工作。

用户数据架构.py

from plone.app.users.browser.personalpreferences import IPersonalPreferences
from zope.interface import Interface
from zope import schema


class IEnhancedUserDataSchema(IPersonalPreferences):
    """ Use all the fields from the default user data schema, and add various
    extra fields.
    """

    buttonsEnabled = schema.Bool(title=u'Transition button widget.', 
                                default=True,
                                description=u'Uncheck to remove the transition button box from ALL pages.',
                                required=False
                                )  

适配器.py:

from plone.app.users.browser.personalpreferences import PersonalPreferencesPanelAdapter
from app.statebuttons.userdataschema import IEnhancedUserDataSchema
from zope.interface import implements

class EnhancedUserDataPanelAdapter(PersonalPreferencesPanelAdapter):
    """
    """
    implements(IEnhancedUserDataSchema)

    def get_buttonEnabled(self):
        return self.context.getProperty('buttonsEnabled', '')
    def set_buttonsEnabled(self, value):
        return self.context.setMemberProperties({'buttonsEnabled': value})
    buttonsEnabled = property(get_buttonEnabled, set_buttonsEnabled)

覆盖.zcml:

<configure
    xmlns="http://namespaces.zope.org/zope"
    i18n_domain="collective.examples.userdata">

  <adapter 
    provides=".userdataschema.IEnhancedUserDataSchema"
    for="Products.CMFCore.interfaces.ISiteRoot"
    factory=".adapter.EnhancedUserDataPanelAdapter"
    />

</configure>

如果有人能给我一些关于我做错了什么的意见,那就太棒了。如果我离题了,我会很感激一些关于下一步去哪里的意见。

4

2 回答 2

3

您可以@@personal-preferences通过将其添加到现有代码中来显示新字段:

浏览器/configure.zcml

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser">

    <browser:page
      for="plone.app.layout.navigation.interfaces.INavigationRoot"
      name="personal-preferences"
      class=".personalpreferences.CustomPersonalPreferencesPanel"
      permission="cmf.SetOwnProperties"
      layer="..interfaces.IAppThemeLayer"
      />

</configure>

浏览器/personalpreferences.py

from plone.app.users.browser.personalpreferences import PersonalPreferencesPanel
from plone.app.users.browser.personalpreferences import LanguageWidget
from plone.app.users.browser.personalpreferences import WysiwygEditorWidget
from zope.formlib import form
from app.statebuttons.userdataschema import IEnhancedUserDataSchema

class CustomPersonalPreferencesPanel(PersonalPreferencesPanel):

    form_fields = form.FormFields(IEnhancedUserDataSchema)
    # Apply same widget overrides as in the base class
    form_fields['language'].custom_widget = LanguageWidget
    form_fields['wysiwyg_editor'].custom_widget = WysiwygEditorWidget

请注意,您需要在profiles/default/browserlayer.xml 中注册一个浏览器层IAppThemeLayer并在profiles /default/memberdata_properties.xml中为您的字段定义存储。

您可以在plone.app.users.browser.personalpreferences. IPersonalPreferences查找如下:

class PersonalPreferencesPanel(AccountPanelForm):

    ...
    form_fields = form.FormFields(IPersonalPreferences)
    ...

模式绑定到IPersonalPreferences接口。您必须更改控制面板才能更改查找的架构。

相反,您可以使用https://pypi.python.org/pypi/collective.examples.userdataIUserDataSchema中描述的方法,但正如您所见,为了覆盖您需要使用if-all-else-fails 类型在第三方附加组件中不是一个非常受欢迎的公民。@@personal-informationoverrides.zcml

其他人可能不同意,但我个人的偏好(我应该说我的IPersonalPreference吗?)对于这种问题是为设置创建一个专用表单并从例如个人工具菜单链接到它。

于 2013-11-14T21:42:22.720 回答
3

不需要覆盖个人偏好。只需遵循https://pypi.python.org/pypi/plone.app.users上的文档

看来你失踪了:

  • 用户数据便宜的提供者

    从 plone.app.users.userdataschema 导入 IUserDataSchemaProvider 类 UserDataSchemaProvider(object): implements(IUserDataSchemaProvider)

    def getSchema(self):
        """
        """
        return IEnhancedUserDataSchema
    
  • componentregistry.xml 中的 GS 配置:

  • 在 GS properties.xml 中注册您的新字段,以使该字段显示在注册页面上(可选)

    <object name="site_properties" meta_type="Plone Property Sheet">
    
        <property name="user_registration_fields" type="lines" purge="False">
            <element value="yourfield" />
        </property>
    
    </object>
    

要使您的字段显示在个人偏好中,请遵循https://pypi.python.org/pypi/plone.app.users/1.1.5 部分“如何更新个人信息表”中的文档

于 2013-11-15T10:23:54.227 回答