php - mac - Agregar filtro de entrada a fieldset en ZF2
zend framework 2 install (1)
Fusionar InputFilters no está muy bien cubierto en el componente Zend/Form
. Alguien realmente debe refactorizar todo.
De todos modos, lo que funcionará y, por lo tanto, recomendaría en su situación, es agregar el validador después de que se haya creado todo el InputFilter anulando el método getInputFilter
en su Formulario.
class RegisterForm extends /Zend/Form/Form
{
public function __construct()
{
// add stuff
}
public function getInputFilter()
{
$formInputFilter = parent::getInputFilter();
$usernameInput = $formInputFilter->get(''profile'')->get(''account'')->get(''username'');
$myValidator = new Validator/SomeValidator();
$usernameInput->getValidatorChain()->addValidator($myValidator);
return $formInputFilter;
}
}
Como InputFilters
al margen, recomendaría definir InputFilters
por Form
y no por Fieldset
, ya que los elementos en un Fieldset
menudo tienen diferentes "requisitos de validación" en diferentes contextos (= Formulario). Pero tal vez eso sea más una preferencia personal.
Tengo un formulario Register
, que tiene un Profile
fieldset, que a su vez tiene una Account
fieldset. Los conjuntos de campos implementan InputFilterProviderInterface
y, por lo tanto, el método getInputFilterSpecification
. Aquí es donde he agregado validadores generales y filtros que se deben usar cada vez que se usan los conjuntos de campo.
Ahora, en mi formulario de registro, quiero validar que una cuenta con un nombre de usuario dado no existe. Por lo tanto, necesito agregar un validador para complementar los validadores que están definidos en el campo de la Account
. Aquí es donde me metí en problemas. Después de cavar un poco, encontré una forma de agregar filtros de entrada a conjuntos de campo . De esta forma, pensé, podría agregar un filtro de entrada adicional a mi campo de Account
.
class Register extends Zend/InputFilter/InputFilter
{
public function __construct()
{
$this->add(new RegisterProfileFilter(), ''profile'');
}
}
Con el código anterior, puedo agregar un filtro de entrada a mi campo de Profile
, y dentro de ese filtro de entrada, puedo hacer lo mismo para mi fieldset de account
. Sin embargo, parece que hay dos problemas con este enfoque:
- Parece como si tuviera que crear un filtro de entrada para cada uno de mis conjuntos de campos en la jerarquía; en este caso, tengo que crear un filtro de entrada para el campo de
Profile
modo que pueda agregar un filtro de entrada al conjunto de campos de laAccount
, incluso si no necesito agregar ningún validador o nada al conjunto de campos delProfile
. No funciona si trato de agregar el filtro al campo de laaccount
directamente - Parece como si al agregar un objeto de filtro de entrada a un conjunto de campo se elimina el filtro que he definido en el método getInputFilterSpecification del
getInputFilterSpecification
degetInputFilterSpecification
lugar de combinar los dos como quiero
¿Hay alguna manera de fusionar la especificación del filtro de entrada definida en mis conjuntos de campo con una especificación adicional (o instancia de Zend/InputFilter/InputFilter
tal que no tenga que copiar la especificación fieldset en mi clase de filtro de entrada? Eso sería código duplicado y no ser muy fácil de mantener. ¿O me perdí algo que me hizo estar en el camino equivocado?
A continuación está mi código si es útil de alguna manera.
// The code has been altered to be more self-explanatory and shorter
class RegisterForm extends /Zend/Form/Form
{
public function __construct()
{
parent::__construct(''register'');
// Elements are added here
$profileFieldset = new ProfileFieldset();
$profileFieldset->setUseAsBaseFieldset(true);
$this->add($profileFieldset);
}
}
class ProfileFieldset extends /Zend/Form/Fieldset implements InputFilterProviderInterface
{
public function __construct()
{
parent::__construct(''profile'');
// Elements are added here
$this->add(new AccountFieldset());
}
public function getInputFilterSpecification()
{
return array(
/***** The below is apparently cleared when adding an input filter to this fieldset *****/
''some_element1'' => array(
''required'' => false,
),
''some_element2'' => array(
''required'' => false,
),
);
}
}
class AccountFieldset extends /Zend/Form/Fieldset implements InputFilterProviderInterface
{
public function __construct()
{
parent::__construct(''account'');
// Elements are added here
}
public function getInputFilterSpecification()
{
return array(
/***** This is the element that I want to add an additional validator to in a specific context (form) *****/
''username'' => array(
''required'' => true,
''validators'' => array(
new Validator/StringLength(array(
''min'' => 4,
''max'' => 15,
)),
new I18nValidator/Alnum(false),
),
),
// Other elements here
);
}
}