0

Peut implémenter une validation dynamique au niveau de l'élément? J'ai utilisé l'exemple this pour implémenter la validation d'un élément dépendant de la valeur de l'autre élément. Mais à cette fin, je devrai l'implémenter pour chaque forme où j'utilise cet élément (commentaire) avec cette validation. J'ai beaucoup de formes comme ça. Est-il possible de faire ce qui suit:Peut implémenter une validation dynamique au niveau de l'élément?

pour amener cette logique de filtrage/validation au niveau de l'élément en utilisant une sorte d'attribut "data-comment-for" et en récupérant la valeur de l'élément dont elle dépend de la forme parente .

Ceci est mon code actuel (mais je dois avoir pour toute forme maintenant Il ne semble pas élégant du tout.):

class CompetencyAdvanceHumanRightsAndJusticeFormFilter extends InputFilter 
{ 
    public function isValid($context = null) 
    { 
     $figradeCommentName = 'applJusticeFIGrade'.'Comment'; 

     $forGrade = $this->get('applJusticeFIGrade'); 
     $gradeComment = $this->get($figradeCommentName); 

     $applJusticeFIGradeRawValue = $forGrade->getRawValue('applJusticeFIGrade'); 

     if(is_numeric($applJusticeFIGradeRawValue)){ 
      $gradeValue = intval($applJusticeFIGradeRawValue); 
     }else{ 
      $gradeValue = $applJusticeFIGradeRawValue; 
     } 

     if ($gradeValue != 'na' && $gradeValue > 0) { 
      $gradeComment->setRequired(true); 
      $validatorChain = new Validator\ValidatorChain(); 
      $validatorChain->attach(
       new Validator\NotEmpty(), 
       true 
      ); 
      $gradeComment->setValidatorChain($validatorChain); 
     } 

     return parent::isValid($context); 
    } 

    public function __construct(){ 
     $this->add(array(
      'name' => 'id', 
      'required' => true, 
      'filters' => array(
       array('name' => 'Int'), 
      ), 
     )); 

     $this->add(array(
      'name' => 'studEvalId', 
      'required' => true, 
      'filters' => array(
       array('name' => 'Int'), 
      ), 
     )); 
    } 
} 

EDIT:

J'ai ajouté le code pour la élément personnalisé à la question. Il y a quelques "restes" de mes tentatives pour placer cette logique au niveau de l'élément.

Commentaire Élément

class Comment extends Element implements InputProviderInterface 
{ 

    /** 
    * @var ValidatorInterface 
    */ 
    protected $validator; 

    // set its type 
    protected $attributes = array(
     'type' => 'comment' 
    ); 


    public function init() 
    { 

     if (null === $this->validator) { 

      $validator = new StringLength(); 
      $validator->setMax(10); 

      $validator->setMessage('The comment should not exceed 1000 letters!', StringLength::INVALID); 

      $this->validator = $validator; 
     } 


    } 


    /** 
    * Get a validator if none has been set. 
    * 
    * @return ValidatorInterface 
    */ 
    public function getValidator() 
    { 
     return $this->validator; 
    } 


    /** 
    * @param ValidatorInterface $validator 
    * @return $this 
    */ 
    public function setValidator(ValidatorInterface $validator) 
    { 
     $this->validator = $validator; 
     return $this; 
    } 


    /** 
    * remove require and validator defaults because we have none 
    * 
    * @return array 
    */ 
    public function getInputSpecification() 
    { 
//  return array(
//   'name' => $this->getName(), 
//   'required' => false, 
//   'validators' => array(
//    $this->getValidator(), 
//   ), 
//   'filters' => array(
//    new FIGradeCommentDynamicBufferFilter() 
//   ), 
//  ); 


     return array(
      'name' => $this->getName(), 
      'required' => false, 
      'filters' => array(
       array('name' => 'Zend\Filter\StringTrim'), 
      ), 
      'validators' => array(
       $this->getValidator(), 
      ), 

     ); 
    } 

    // tell it where to find its view helper, so formRow and the like work correctly 
    public function getViewHelperConfig() 
    { 
     return array('type' => '\OnlineFieldEvaluation\View\Helper\FormComment'); 
    } 

} 

Répondre

1

Vous pouvez faire une classe abstraite de base entrée-filtre et une interface et faire tous vos filtres de forme étendent la classe de base qui implémente l'interface avec les méthodes que vous attendez dans votre formulaire classes pour faire fonctionner la chose correctement.

Faire une interface avec les méthodes:

interface GradeCommentFormFilterInterface() 
{ 
    protected function getGradeInput(); 

    protected function getCommentInput(); 
} 

Ensuite, vous déplacez le code commun à votre classe de base:

abstract class BaseGradeCommentFormFilter extends InputFilter implements GradeCommentFormFilterInterface 
{ 
    protected function getGradeInput() 
    { 
     return $this->get(static::GRADE_NAME); 
    } 

    protected function getCommentInput() 
    { 
     return $this->get(static::GRADE_NAME . 'Comment'); 
    } 

    public function isValid($context = null) 
    { 
     $gradeInput = $this->getGradeInput(); 
     $commentInput = $this->getCommentInput(); 
     $rawValue = $this->getRawValue($gradeInput); 

     if(is_numeric($rawValue)) 
     { 
      $gradeValue = intval($rawValue); 
     } 
     else 
      $gradeValue = $rawValue; 

     if ($gradeValue != 'na' && $gradeValue > 0) { 
      $commentInput->setRequired(true); 
      $validatorChain = new Validator\ValidatorChain(); 
      $validatorChain->attach(
       new Validator\NotEmpty(), 
       true 
      ); 
      $commentInput->setValidatorChain($validatorChain); 
     } 
     return parent::isValid($context); 
    } 
} 

Maintenant, vous pouvez utiliser votre classe abstraite comme ceci:

class CompetencyAdvanceHumanRightsAndJusticeFormFilter extends BaseGradeCommentFormFilter 
{ 
    const GRADE_NAME = 'applJusticeFIGrade'; 

    //... other code 
} 

J'ai rapidement essayé de le faire fonctionner pour votre cas, mais ce n'est pas testé, et il y a probablement façons d'optimiser cela, mais cela vous donne une idée de ce que vous pouvez faire.

+0

Nice! Donc, mais vous ne pensez pas qu'il existe un moyen de le placer à l'intérieur de la spécification de l'élément de commentaire? – vlr

+0

J'ai ajouté du code pour l'élément personnalisé à la question. Il y a quelques "restes" de mes tentatives pour placer cette logique au niveau de l'élément. – vlr