Aggiungere nuovi campi all'utente in Plone 4.x

Come modificare la form di registrazione di Plone 4.x

Dalla versione 4.1 di Plone la form di registrazione plone è stata implementata attraverso z3c.form, quindi per aggiungere nuovi campi all'utente non è più possibile modificare i relativi template da portal_skins.

Il pacchetto che si occupa di gestire i dati dell'utente è plone.app.users. In esso è presente l'interfaccia che descrive lo schema della form di registrazione e la vista che si occupa di mostrare le informazioni personali dell'utente.

Vediamo nel dettaglio cosa bisogna fare per aggiungere nuovi campi all'utente:

Aggiunta dei nuovi campi all'interfaccia IUserDataSchema

 

from zope.interface import implements
from zope import schema
from plone.app.users.userdataschema import IUserDataSchemaProvider
from plone.app.users.userdataschema import IUserDataSchema
..
class UserDataSchemaProvider(object):
    implements(IUserDataSchemaProvider)
    def getSchema(self):
        return IEnhancedUserDataSchema
class IEnhancedUserDataSchema(IUserDataSchema):
    campo_aggiunto = schema.TextLine(
        title=_(u'label_campo_aggiunto', default=u'Nuovo campo'),
        required=False,
    )

Aggiunta dell'adattatore che si occuperà di aggiungere i metodi setter e getter del nuovo campo

 

from plone.app.users.browser.personalpreferences import UserDataPanelAdapter
class EnhancedUserDataPanelAdapter(UserDataPanelAdapter):
    def get_campo_aggiunto(self):
        return self.context.getProperty('campo_aggiunto', '')
    def set_campo_aggiunto(self, value):
        return self.context.setMemberProperties({'campo_aggiunto': value})
    campo_aggiunto = property(get_campo_aggiunto, set_campo_aggiunto)

Registrazione del  nuovo adapter: overrides.zcml

 

<configure
    xmlns="http://namespaces.zope.org/zope"
    i18n_domain="mio.pacchetto"
    xmlns:zcml="http://namespaces.zope.org/zcml">
  <adapter
    provides=".userdataschema.IEnhancedUserDataSchema"
    for="Products.CMFCore.interfaces.ISiteRoot"
    factory=".adapter.EnhancedUserDataPanelAdapter"
    zcml:condition="installed mio.pacchetto"
  />
</configure>

E' stato usato zcml:condition in modo da limitare la registrazione dell'adapter solo nel plone site dove è installato mio.pacchetto.

Registrazione profili

componentregistry.xml

<?xml version="1.0"?>
<componentregistry>
  <utilities>
    <utility
      interface="plone.app.users.userdataschema.IUserDataSchemaProvider"
      factory="afpols.policy.userdataschema.UserDataSchemaProvider"
    />
  </utilities>
</componentregistry>

memberdata_properties.xml

<?xml version="1.0"?>
<object name="portal_memberdata" meta_type="PlonePAS MemberData Tool">
  ...
 <property name="campo_aggiunto" type="string"></property>
</object>

propertiestool.xml

<?xml version="1.0"?>
<object name="portal_properties" meta_type="Plone Properties Tool">
 <object name="site_properties" meta_type="Plone Property Sheet">
  <!-- Fields that will be on the form after installation of the product -->
  <property name="user_registration_fields" type="lines" purge="False">
   <element value="campo_aggiunto" />
  </property>
 </object>
</object>

Per saperne di più

Share this on

Share |

On same topics

Commenti

comments powered by Disqus