Modifier les attributs du BaseSchema
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:
- Attention
- C'est très important d'utiliser MyBaseSchema = BaseSchema.copy()et non pasMyBaseSchema = BaseSchemaSi 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
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)
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'),
)
))
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'),
))







