我有一个表单,其中包含一个带有集合的字段集,我想在我的字段集元素上应用过滤器。我曾经在我的实体中执行此操作,并且当我的元素不是集合时它可以正常工作。但是为了在我的控制器中发布我的集合元素,我使用了一个“虚拟”验证器,这不公平,因为我的集合元素没有被过滤和验证。我怎样才能实现它?这是我的代码:
我的 EcheancierForm:
<?php
/**
* @module Commun
* @subpackage Form\Admin\Parametrage
* @author Samuel NANGUI <nanguisamuel@gmail.com>
* @copyright Copyright (c) 2021 Nslabs
*/
namespace Admin\Form\Parametrage;
use Commun\Form\CustomElements\CommonForm;
class EchancierForm extends CommonForm
{
public function init() {
$this->setName('EchancierForm');
$this->setAttribute('class', 'form-saisie');
//$this->setAttribute('autocomplete', 'off');
$this->addFieldset(MainEcheancierFieldset::class,['use_as_base_fieldset' => true]);
$this->addSubmitButton('enregistrer', 'btn-enregistrer', 'Enregistrer', 'btn btn-default btn-vert w-100');
$this->addSubmitButton('annuler', 'btn-annuler', 'annuler', 'btn btn-default btn-gris w-100');
}
}
我的 MainEcheancierFieldset:
<?php
/**
* @module Admin
* @subpackage Form\Parametrage
* @author Samuel NANGUI <nanguisamuel@gmail.com>
* @copyright Copyright (c) 2021 Nslabs
*/
namespace Admin\Form\Parametrage;
use Commun\Model\Entity\PrestationClasse;
use Laminas\InputFilter\InputFilterProviderInterface;
use Laminas\Hydrator\ReflectionHydrator;
use Commun\Form\CustomElements\CommonFieldset;
class MainEcheancierFieldset extends CommonFieldset implements InputFilterProviderInterface
{
public function __construct()
{
parent::__construct('MainEcheancierForm');
$this->setHydrator(new ReflectionHydrator());
$this->setObject(new PrestationClasse());
}
public function init() {
parent::init();
$this->addCollection('echeances','', EcheancierFieldset::class,3);
}
/**
* @return array
*/
public function getInputFilterSpecification()
{
return [
];
}
}
我的 EcheancierFieldset:
<?php
/**
* @module Admin
* @subpackage Form\Parametrage
* @author Samuel NANGUI <nanguisamuel@gmail.com>
* @copyright Copyright (c) 2021 Nslabs
*/
namespace Admin\Form\Parametrage;
use Commun\Model\Entity\Echeancier;
use Laminas\InputFilter\InputFilterProviderInterface;
use Laminas\Hydrator\ReflectionHydrator;
use Commun\Form\CustomElements\CommonFieldset;
use Commun\Form\SelectList\GroupeClasseSelect;
class EcheancierFieldset extends CommonFieldset implements InputFilterProviderInterface
{
public function __construct()
{
parent::__construct('EcheancierForm');
$this->setHydrator(new ReflectionHydrator());
$this->setObject(new Echeancier());
}
public function init() {
parent::init();
$this->addText('intituleFr','libelle-echance-fr',['class' => 'form-control']);
$this->addText('intituleEn','libelle-echance-en',['class' => 'form-control']);
$this->addText('montant','montant-echance',['class' => 'form-control champ_montant montant_somme text-end']);
$this->addSelect('ordre','ordre', ClasseFieldset::setOrdre(),['class' => 'form-select']);
$this->addText('dateLimitePaiement','date-limite-paiement',['class' => 'form-control champ_date']);
$this->addButton('boutonDelete','-',['class' => 'btn btn-default btn-rouge btn-delete']);
}
/**
* @return array
*/
public function getInputFilterSpecification()
{
return [
'name' => 'intituleFr',
'required' => true,
'filters' => [
['name' => StripTags::class],
['name' => StringTrim::class],
],
];
}
}
我的 PrestationClasse 实体:
<?php
/**
* @module Commun
* @subpackage Model\Entity
* @author Allround automation by Nslabs Entity Creator
* @created on 13-12-2021 11:12:21
* @copyright Copyright (c) 2021 Nslabs by Samuel NANGUI <nanguisamuel@gmail.com>
*/
namespace Commun\Model\Entity;
use DomainException;
use Laminas\Filter\StringTrim;
use Laminas\Filter\StripTags;
use Laminas\InputFilter\InputFilter;
use Laminas\InputFilter\InputFilterAwareInterface;
use Laminas\InputFilter\InputFilterInterface;
use Commun\Model\EntityFilterValidator;
class PrestationClasse extends EntityFilterValidator implements InputFilterAwareInterface
{
private $idPrestationClasse;
private $montant;
private $dateSaisie;
private $idClasse;
private $idRefPrestation;
private $idRefUtilisateurSaisie;
private $dateModif;
private $idRefUtilisateurModif;
private $idRefAnnee;
private $annee;
private $echeances;
// Add this property:
private $inputFilter;
public function getIdPrestationClasse()
{
return $this->idPrestationClasse;
}
public function getMontant()
{
return $this->montant;
}
public function getDateSaisie()
{
return $this->dateSaisie;
}
public function getIdClasse()
{
return $this->idClasse;
}
public function getIdRefPrestation()
{
return $this->idRefPrestation;
}
public function getIdRefUtilisateurSaisie()
{
return $this->idRefUtilisateurSaisie;
}
public function getDateModif()
{
return $this->dateModif;
}
public function getIdRefUtilisateurModif()
{
return $this->idRefUtilisateurModif;
}
public function getIdRefAnnee()
{
return $this->idRefAnnee;
}
public function getAnnee()
{
return $this->annee;
}
public function getEcheances()
{
return $this->echeances;
}
public function __construct($idPrestationClasse=NULL, $montant=NULL, $dateSaisie=NULL, $idClasse=NULL, $idRefPrestation=NULL, $idRefUtilisateurSaisie=NULL, $dateModif=NULL, $idRefUtilisateurModif=NULL, $idRefAnnee=NULL, $annee=NULL,$echeances=NULL)
{
$this->idPrestationClasse = $idPrestationClasse;
$this->montant = $montant;
$this->dateSaisie = $dateSaisie;
$this->idClasse = $idClasse;
$this->idRefPrestation = $idRefPrestation;
$this->idRefUtilisateurSaisie = $idRefUtilisateurSaisie;
$this->dateModif = $dateModif;
$this->idRefUtilisateurModif = $idRefUtilisateurModif;
$this->idRefAnnee = $idRefAnnee;
$this->annee = $annee;
$this->echeances = $echeances;
}
public function getArrayCopy()
{
return [
'idPrestationClasse' => $this->getIdPrestationClasse(),
'montant' => $this->getMontant(),
'dateSaisie' => $this->getDateSaisie(),
'idClasse' => $this->getIdClasse(),
'idRefPrestation' => $this->getIdRefPrestation(),
'idRefUtilisateurSaisie' => $this->getIdRefUtilisateurSaisie(),
'dateModif' => $this->getDateModif(),
'idRefUtilisateurModif' => $this->getIdRefUtilisateurModif(),
'idRefAnnee' => $this->getIdRefAnnee(),
'annee' => $this->getAnnee(),
'echeances' => $this->getEcheances(),
];
}
public function setInputFilter(InputFilterInterface $inputFilter){
throw new DomainException('Cette classe ne supporte pas l\'ajout de filtre');
}
public function getInputFilter(){
if ($this->inputFilter) {
return $this->inputFilter;
}
$inputFilter = new InputFilter();
//Add Validator here
$inputFilter->add($this->setDefaultFilterWithoutValidator('echeances'));
//Add Validator here
$this->inputFilter = $inputFilter;
return $this->inputFilter;
}
}
当我有集合以外的元素时,这部分: $inputFilter->add($this->setDefaultFilterWithoutValidator('echeances')); 在我的验证器中调用正确的元素可以正常工作。在这里,我调用了我的集合(echeances),只是为了将我的元素发布在我的控制器中并且它可以工作,但元素没有被过滤或验证。
任何帮助将不胜感激。