更改字段集字段'动态所需参数

时间:2015-12-25 09:31:22

标签: php zend-framework2 zend-form

我有一个带有2个字段,金额和货币的 moneyFieldset

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个字段,所以我怎么能说价格[金额] 价格[curreny] 是必需的吗?

2 个答案:

答案 0 :(得分:4)

您可以使用以下数组结构提供嵌套字段集的输入规范(在表单的上下文中)。

public function getInputFilterSpecification()
{
    return [
        // ...
        'price' => [
            'type' => 'Zend\InputFilter\InputFilter',
            'amount' => [
                'required' => true,
            ],
            'currency' => [
                'required' => true,
            ]
        ],
        //...
    ];
}

如果要动态修改输入过滤器的值,可能需要考虑使用服务工厂类创建验证器,然后使用对象API而不是数组将其附加到表单。

答案 1 :(得分:3)

正如我在@ AlexP的评论中所说,一个字段或一组声明为必需的字段,如下所示:

function getInputFilterSpecification()
    {
        'price' => [
            'required'    => true,
            'allow_empty' => false,
        ],
     }

并不意味着它会打印出这样的HTML:

<input type="text" required="required"/>

如果您的字段为空且需要或其他检查,则只检查您何时执行$form->isValid()。 要实现这一点,您只需设置要求这些字段的属性。就像你已经做的那样。属性可以将类属性,html代码添加到输入中。

P.S:AlexP的答案是最好的答案,我只是提供更多信息。