Accueil » Modifier les attributs du BaseSchema

Modifier les attributs du BaseSchema

Document Actions

Par davconvent le 01/07/2005 00:27

Lorsqu'on crée un type de contenu avec Archetypes, on part souvent d'un schema de base que l'on étend. Il peut arriver que l'on veuille modifier légèrement les champs de base. Si on redéfini ces champs dans le nouveau schema, on s'expose à des effets de bord. Il vaut mieux redéfinir les attributs de ces champs dans une copie du schema de base.

Catégories : Plone

Cas concret:
Je crée un type de contenu pour Plone avec Archetypes, que j'appelle MonContenu. Rien de bien compliqué, j'utilise le BaseSchema auquel je rajoute un champ. Mais je veux que le champ 'title' soit absent des pages 'view' et 'edit' de mon contenu.
Au départ, mon code devrait ressembler à peut près à ça:
from Products.Archetypes.public import registerType, Schema, BaseSchema, BaseContent
from config import PROJECTNAME   # fichier config.py de mon package

MonSchema = BaseSchema + Schema((
    
StringField('unChamp'),
    
))

class MonContenu(BaseContent):
    
"""Type de contenu tout simple"""
    
archetypes_name = 'Mon Contenu'
    
    
schema = MonSchema

registerType(MonContenu, PROJECTNAME)

Maintenant comment virer le 'title' des page 'view' et 'edit' ?

Une solution possible est de redéfinir le champ 'title' de mon schema:
from Products.Archetypes.public import registerType, Schema, BaseSchema, BaseContent
from config import PROJECTNAME   # fichier config.py de mon package

MonSchema = BaseSchema + Schema((

    
StringField('title',
        
widget=StringWidget(visible={'edit': 'visible', 'view': 'visible'},),

    
StringField('unChamp'),
        
)
    
))

Il faut alors impérativement redéfinir la méthode Title() de l'objet pour être à nouveau compatible avec le DublinCore:

class MonContenu(BaseContent):
    
"""Type de contenu tout simple"""
    
archetypes_name = 'Mon Contenu'
    
    
schema = MonSchema
    
    
def Title(self):
        
return self.getTitle()

Ça a l'avantage de fonctionner, mais c'est pas très pratique.
De manière générale, je préfère ne pas redéfinir dans mon nouveau schema des champs qui existent déjà dans le BaseSchema, car je risque de transformer le comportement de l'objet lorque les accessors, edit_accessors et mutators sont générés automatiquement par Archetypes.

Ma solution est de partir d'une copie du BaseSchema, de la modifier selon mes besoins et de l'utiliser comme schema de base pour mon MonSchema:

from Products.Archetypes.public import registerType, Schema, BaseSchema, BaseContent
from config import PROJECTNAME   # fichier config.py de mon package

INVISIBLE = {'edit': 'invisible', 'view': 'invisible'}

MyBaseSchema = BaseSchema.copy()
MyBaseSchema['title'].widget.visible = INVISIBLE

MonSchema = MyBaseSchema + Schema((
    
StringField('unChamp'),
    
))

Attention
C'est très important d'utiliser
MyBaseSchema = BaseSchema.copy()
et non pas
MyBaseSchema = BaseSchema
Si vous utilisez la deuxième formule, vous modifierez le BaseSchema pour tous les objets qui l'utilisent (en l'occurence, plus aucun objet Archetypes n'affichera son champ 'title'). Ceci dit ça peut devenir utile dans certains cas, je l'explique dans cet autre tutoriel
Aidez l'AfPy

Rechercher
Dernières news AFPY
Les 6 dernières news
PyCon FR - 17-18 mai - Paris
07/05/2008 07:05
AFPyro d'Avril
24/04/2008 00:00