Динамическое изменение обязательного параметра 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 - лучший ответ, я просто даю больше информации об этом.

Другие вопросы по тегам