Динамическое изменение обязательного параметра Fieldset Fields
У меня есть moneyFieldset с 2 полями, сумма и валюта.
class MoneyFieldset ...
{
public function __construct($name = null, $options = array())
{
parent::__construct($name, $options);
$this->setHydrator(...);
$this->add(array(
'name' => 'currency',
'type' => 'select',
'options' => array(
'value_options' => \Core\Service\Money::getAvailableCurrencies(true),
),
'attributes' => array(
'value' => \Core\Service\Money::DEFAULT_CURRENCY,
),
));
$this->add(array(
'name' => 'amount',
'type' => 'text',
));
}
}
public function getInputFilterSpecification()
{
$default = [
'amount' => [
'required' => false,
'allow_empty' => true,
'filters' => [
['name' => AmountFilter::class]
],
'validators' => [
]
],
'currency' => [
'required' => false,
'allow_empty' => true,
'filters' => [
['name' => StringToUpper::class]
],
'validators' => [
]
]
];
return \Zend\Stdlib\ArrayUtils::merge($default, $this->filterSpec, true);
}
Я использую moneyFieldset в других моих наборах полей следующим образом:
// Price Field
$this->add(array(
'name' => 'price',
'type' => 'form.fieldset.moneyFieldset',
'attributes' => array(
'required' => true,
'invalidText' => 'Please type an amount'
),
'options' => array(
...
),
));
Когда я устанавливаю фильтр следующим образом:
function getInputFilterSpecification()
{
'price' => [
'required' => true,
'allow_empty' => false,
],
}
Это не работает, потому что цена имеет 2 поля, так как я могу сказать, что требуется цена [сумма] и цена [валюта]?
2 ответа
Вы можете предоставить входные спецификации для вложенного набора полей (в контексте формы), используя следующую структуру массива.
public function getInputFilterSpecification()
{
return [
// ...
'price' => [
'type' => 'Zend\InputFilter\InputFilter',
'amount' => [
'required' => true,
],
'currency' => [
'required' => true,
]
],
//...
];
}
Если вы динамически изменяете значения входного фильтра, возможно, стоит подумать о создании валидатора с использованием класса фабрики сервисов и последующем присоединении его к форме с использованием объектного API, а не массивов.
Как я сказал в комментарии @AlexP, поле или группа полей, объявленные как Обязательные, выглядят так:
function getInputFilterSpecification()
{
'price' => [
'required' => true,
'allow_empty' => false,
],
}
Не означает, что он будет печатать HTML, как это:
<input type="text" required="required"/>
Это просто проверить, когда вы будете делать $form->isValid()
если ваши поля пустые и обязательные или другие проверки. Чтобы достичь этого, вам просто нужно установить атрибуты, которые вы хотите, чтобы эти поля. Как вы уже сделали. Атрибуты могут добавить, как и атрибут класса, HTML-код для входа.
PS: ответ AlexP - лучший ответ, я просто даю больше информации об этом.