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');
}
}
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
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