2016-10-25 1 views
2

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.

Répondre

3

Ok, enregistrez votre propre formulaire d'ajout et sous-classe du formulaire d'ajout de dextérité par défaut. Plus d'informations sur Validating in action handlers et Custom Add Forms

dans mon task.py (CONTENTTYPE et ainsi de suite ...):

# -*- coding: utf-8 -*- 
from zope.interface import implementer 
from zope.interface import Invalid 
from z3c.form import button 
from z3c.form import validator 
from z3c.form import util 
from z3c.form.interfaces import ActionExecutionError 
from z3c.form.interfaces import WidgetActionExecutionError 
from plone.dexterity.content import Item 
from plone.dexterity.browser import add 
from viisionar.training.interfaces import ITask 
from Products.statusmessages.interfaces import IStatusMessage 
from my.addon import _ 

@implementer(ITask) 
class Task(Item): 
    pass 

class AddForm(add.DefaultAddForm): 

    portal_type = 'Task' 

    def __init__(self, context, request, ti=None): 
     super(AddForm, self).__init__(context, request, ti=None) 

    @button.buttonAndHandler(_('Save'), name='save') 
    def handleAdd(self, action): 

     print "Handle Add" 
     data, errors = self.extractData() 

     if errors: 
      self.status = self.formErrorsMessage 
      return 

     # Your Custom validation 

     # Debug Do what yo want 

     print data 

     if error: 
      """ 
      # Global Portal Message 
      raise ActionExecutionError(Invalid(_(u"Please provide a valid end date"))) 

      # or 

      # Error Message in Widget 
      raise WidgetActionExecutionError('IEventBasic.end', Invalid(u"Please put the the right end date")) 
      """ 
     # /Your Custom validation 

     obj = self.createAndAdd(data) 

     if obj is not None: 
      # mark only as finished if we get the new object 
      self._finishedAdd = True 
      IStatusMessage(self.request).addStatusMessage(
       self.success_message, "info" 
      ) 

class AddView(add.DefaultAddView): 
    form = AddForm 

dans mon configure.zcml i enregistrer la commande Ajouter un formulaire

<adapter 
    for=" 
     Products.CMFCore.interfaces.IFolderish 
     zope.publisher.interfaces.browser.IDefaultBrowserLayer 
     plone.dexterity.interfaces.IDexterityFTI" 
    provides="zope.publisher.interfaces.browser.IBrowserPage" 
    factory="my.addon.task.AddView" 
    name="Task" /> 

<class class="my.addon.task.AddView"> 
    <require 
     permission="cmf.AddPortalContent" 
     interface="zope.publisher.interfaces.browser.IBrowserPage"/> 
</class> 

dans ma tâche. xml Définition:

<property name="factory">Task</property> 
<property name="schema">my.addon.interfaces.ITask</property> 
<property name="klass">my.addon.task.Task</property> 
<property name="behaviors"> 
    <element value="plone.app.content.interfaces.INameFromTitle" /> 
    <element value="plone.app.event.dx.behaviors.IEventBasic"/> 
</property> 
+0

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. –

+0

Veuillez vérifier ce qui se passe lorsque vous supprimez l'argument de contexte de WidgetValidatorDiscriminators. – 1letter

+0

J'ai supprimé le contexte de validator.WidgetValidatorDiscriminators, mais cela n'a aucun effet. –