2012-01-17 1 views
3

J'essaie d'ajouter un captcha personnalisé au formulaire d'inscription pour mon site Plone. J'ai récemment migré de la version 3.1.x vers la version 4.1.3, ce qui a brisé mes personnalisations existantes dans le modèle join_form et le script de validation.Comment ajouter des champs supplémentaires (captcha personnalisé) au formulaire d'inscription dans Plone 4.1

J'ai essayé de suivre l'exemple collective.examples.userdata pour faire ma personnalisation. Je pense que j'ai suivi l'exemple correctement mais le nouveau champ n'est pas rendu dans le formulaire d'inscription.

Comment puis-je comprendre pourquoi les champs supplémentaires n'apparaissent pas et y a-t-il un meilleur moyen d'ajouter un captcha personnalisé au formulaire?

Notez que j'ai essayé de regarder l'un des paquets captcha pour Plone 4 mais ceux que j'ai regardés semblaient vraiment compliqués (on avait des parties éparpillées sur 3 paquets).

Mise à jour: Apparemment, l'utilisation de l'action collective.examples.userdata ne fonctionne pas non plus pour moi. J'ajoute le collectif.examples.userdata et je n'obtiens aucun champ supplémentaire sur le formulaire de registre @@.

En outre, j'utilise l'ancien modèle de repli plone 3 s'il fait une différence.

+0

Pouvez-vous fournir des parties saillantes de code que vous avez écrit afin que nous puissions voir ce qu'il y a déjà et ce qui manque? –

+0

Giacomo Spettoli: Voir ma mise à jour sur le stock collective.examples.userdata ne fonctionne pas. – lambacck

Répondre

3

Cet exemple utilise l'excellent widget quintagroup.formlib.captcha, mais l'approche générale peut s'appliquer à de nombreuses autres situations. Fondamentalement, vous ne voulez pas définir un champ captcha dans votre schéma de données utilisateur; plutôt, vous voulez temporairement ajouter au schéma de formulaire lorsque vous rendre le formulaire, ainsi:

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

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

Enfin, enregistrez votre formulaire d'inscription personnalisé dans navigateur/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> 

testé à l'aide collective.examples.userdata et 4.1

Plone
+0

C'est le plus proche de ce que je voulais. Notez que j'ai dû ajouter la configuration à collective.examples.userdata/configure.zcml et non browser/configure.zcml pour que cela fonctionne. Il a également ajouté l'invite de mot de passe plutôt que d'envoyer l'email de confirmation en premier (ce que je veux). – lambacck

+0

Re mon dernier commentaire, en basculant le paramètre «Permettre aux utilisateurs de choisir leurs propres mots de passe» sur l'onglet de sécurité de @@ security-controlpanel ne change rien. Je suppose que je vais devoir faire autre chose pour garder ce réglage. – lambacck

+0

Ahh 'myfields = super (RegistrationForm, self) .form_fields' devrait être' myfields = super (MyRegistrationForm, self) .form_fields' dans le navigateur/forms.py – lambacck

0

Je ne connais pas la meilleure réponse, mais cela a été discuté au http://comments.gmane.org/gmane.comp.web.zope.plone.user/115264 si vous ne l'avez pas déjà trouvé.

+0

Merci, mais cela se concentre sur recaptcha. Je ne veux surtout pas utiliser recaptcha car ce n'est pas mieux que de ne pas avoir de captcha du tout. J'en ai un personnalisé que j'ai utilisé avant de passer à 4.1 que je voudrais adapter au site. Je pensais que depuis ce dont j'ai besoin est un champ de date supplémentaire que je pourrais utiliser un modified.examples.userdata modifié mais le champ supplémentaire n'apparaît pas sur le formulaire de registre. – lambacck

Questions connexes