Как добавить дополнительные поля (пользовательские капчи) в форму регистрации в Plone 4.1

Я пытаюсь добавить пользовательскую капчу в форму регистрации для моего сайта Plone. Я недавно обновил с 3.1.x до 4.1.3, и это сломало мои существующие настройки для шаблона join_form и сценария проверки.

Я пытался следовать примеруватаме collect.examples.userdata, чтобы выполнить настройку. Я думаю, что правильно следовал примеру, но новое поле не отображается в регистрационной форме.

Как выяснить, почему дополнительные поля не отображаются, и есть ли лучший способ добавить пользовательскую капчу в форму?

Обратите внимание, что я попробовал взглянуть на один из пакетов капчи для Plone 4, но те, на которые я смотрел, казались действительно сложными (в одном из них было разбросано по 3 пакета).

Обновление: по- видимому, использование стокового коллективного файла.examples.userdata также не работает для меня. Я добавлял коллективный файл.examples.userdata и не получаю никаких дополнительных полей в форме регистрации @@.

Кроме того, я использую старый запасной шаблон plone 3, если он имеет значение.

2 ответа

Решение

В этом примере используется отличный виджет http://pypi.python.org/pypi/quintagroup.formlib.captcha, но общий подход может применяться во многих других ситуациях.

По сути, вы не хотите определять поле капчи в вашей схеме пользовательских данных; скорее, вы хотите временно добавить его в схему формы при визуализации формы следующим образом:

браузер /interfaces.py

from zope.interface import Interface
from quintagroup.formlib.captcha import Captcha
from my.package import myMessageFactory as _


class IMyRegistrationForm(Interface):
    """Marker interface for my custom registration form
    """


class ICaptchaSchema(Interface):
    captcha = Captcha(
        title=_(u'Verification'),
        description=_(
            u'Type the code from the picture shown below.'
        ),
    )

браузер /forms.py

from zope.formlib import form
from plone.app.users.browser.register import RegistrationForm
from quintagroup.formlib.captcha import CaptchaWidget
from my.package.browser.interfaces import IMyRegistrationForm, ICaptchaSchema


class MyRegistrationForm(RegistrationForm):
    """ Subclass the standard registration form
    """

    implements(IMyRegistrationForm)

    @property
    def form_fields(self):
        # Get the fields so we can fiddle with them
        myfields = super(MyRegistrationForm, self).form_fields

        # Add a captcha field to the schema
        myfields += form.Fields(ICaptchaSchema)
        myfields['captcha'].custom_widget = CaptchaWidget

        # Perform any field shuffling here...

        # Return the fiddled fields
        return myfields

Наконец, зарегистрируйте свою пользовательскую форму регистрации в browser / configure.zcml:

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

  <browser:page
      name="register"
      for="Products.CMFPlone.Portal.PloneSite"
      class=".forms.MyRegistrationForm"
      permission="zope.Public"
      />  

</configure>

Протестировано с использованием colle.examples.userdata и Plone 4.1

Я не знаю лучшего ответа, но он обсуждался на http://comments.gmane.org/gmane.comp.web.zope.plone.user/115264 если вы этого еще не нашли.

Другие вопросы по тегам