J'utilise 4.3 et je Plone avoir un plone.directives de form.SchemaForm ont une interface qui a un champ de départ de IEventBasic et un validateur:Plone - Comment puis-je demander à un validateur de valider un champ d'un comportement pour un type de contenu spécifique?
from datetime import timedelta
from plone.directives import form
from plone.app.contenttypes.interfaces import IEvent
from z3c.form import validator
from zope.component import provideAdapter
from zope.interface import Invalid
class IMyObject(form.SchemaForm)
my_field_a = schema.TextLine(title='a_field')
...
class MyObject(Item):
implements(IMyObject, IEvent)
class EndMyObjectValidator(validator.SimpleFieldValidator):
def validate(self,value):
#code for checking if end field is within a certain range from start field
if self.end > self.start + timedelta(days=6):
raise Invalid('The end date is not within range of the start date's week')
validator.WidgetValueDiscriminators(EndMyObjectValidator, field=IEventBasic['end'])
provideAdapter(EndMyObjectValidator)
Dans mon fichier de type (my.object.myobject.xml sous profiles/default/types), je place le comportement dans la section des comportements.
<behaviors>
<element value="plone.app.event.dx.behaviors.IEventBasic"/>
</behaviors>
Le problème est-il valide le champ final dans un objet de l'événement ou tout autre objet qui implémente l'interface IEventBasic/schéma.
Je pensais que depuis la documentation Plone dit que les paramètres de la vue »et 'contexte' de WidgetValueDiscriminators acceptent une interface, je pouvais faire soit:
validator.WidgetValidatorDiscriminators(EndMyObjectValidator, view=IMyObject, field=IEventBasic['end'])
ou
validator.WidgetValidatorDiscriminators(EndMyObjectValidator, context=IMyObject,field=IEventBasic['end']
Malheureusement , aucun de ceux-ci ne se déclenche du tout. Je suppose que je ne comprends pas ce que le contexte et les paramètres de vue font réellement. Comment puis-je faire en sorte que les validateurs soient spécifiquement destinés à traiter MyObject?
Source: http://docs.plone.org/develop/addons/schema-driven-forms/customising-form-behaviour/validation.html
Pour l'instant je fais:
...
from gpcl.container.my_container import MyContainer
...
class EndMyObjectValidator(validator.SimpleFieldValidator):
def validate(self,value):
if self.widgets.form.portal_type <> 'my.object.myobject':
return
...
validator.WidgetValueDiscriminators(EndMyObjectValidator, field=IEventBasic['end'])
provideAdapter(EndMyObjectValidator)
Mise à jour 2: J'ai retiré mon commentaire avant parce qu'il était un problème non lié. J'ai changé la façon dont je vérifiais le type.
Malheureusement, pas hing semble déclencher. J'ai fait une impression et rien imprimé. Je l'ai enregistré dans le configure et appelé WidgetValidatorDiscriminators comme vous l'avez montré. En outre, je ne l'ai pas mentionné, mais j'utilise un autre validateur pour le champ Début. Lorsque j'essaie d'ajouter un validateur pour le champ de démarrage en fonction de ce que vous avez montré dans votre réponse, je me retrouve avec un ConfigurationConflictError. –
Veuillez vérifier ce qui se passe lorsque vous supprimez l'argument de contexte de WidgetValidatorDiscriminators. – 1letter
J'ai supprimé le contexte de validator.WidgetValidatorDiscriminators, mais cela n'a aucun effet. –