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

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 19 января 2012

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

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

browser / 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.'
        ),
    )

browser / 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>

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

.
0 голосов
/ 17 января 2012

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

...