动态更改 Fieldset 字段的必需参数
Change Fieldset Fields' required parameter dynamically
我有一个 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,
],
}
它不起作用,因为 price 有 2 个字段,所以我怎么能说 price[amount] 和 price [货币] 是必需的吗?
您可以使用以下数组结构为嵌套字段集(在表单的上下文中)提供输入规范。
public function getInputFilterSpecification()
{
return [
// ...
'price' => [
'type' => 'Zend\InputFilter\InputFilter',
'amount' => [
'required' => true,
],
'currency' => [
'required' => true,
]
],
//...
];
}
如果您要动态修改输入过滤器的值,可能值得考虑使用服务工厂 class 创建验证器,然后使用对象 API 将其附加到表单,而不是数组。
正如我在@AlexP 的评论中所说,一个字段或一组字段声明为必需,如下所示:
function getInputFilterSpecification()
{
'price' => [
'required' => true,
'allow_empty' => false,
],
}
不意味着它将像这样打印 html :
<input type="text" required="required"/>
它只会检查您何时 $form->isValid()
如果您的字段为空且必填或进行其他检查。
要实现这一点,您只需设置您想要这些字段的属性。就像你已经做过的那样。与 class 属性一样,属性可以向输入添加 html 代码。
P.S : AlexP 的回答是最好的答案,我只是提供更多相关信息。
我有一个 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,
],
}
它不起作用,因为 price 有 2 个字段,所以我怎么能说 price[amount] 和 price [货币] 是必需的吗?
您可以使用以下数组结构为嵌套字段集(在表单的上下文中)提供输入规范。
public function getInputFilterSpecification()
{
return [
// ...
'price' => [
'type' => 'Zend\InputFilter\InputFilter',
'amount' => [
'required' => true,
],
'currency' => [
'required' => true,
]
],
//...
];
}
如果您要动态修改输入过滤器的值,可能值得考虑使用服务工厂 class 创建验证器,然后使用对象 API 将其附加到表单,而不是数组。
正如我在@AlexP 的评论中所说,一个字段或一组字段声明为必需,如下所示:
function getInputFilterSpecification()
{
'price' => [
'required' => true,
'allow_empty' => false,
],
}
不意味着它将像这样打印 html :
<input type="text" required="required"/>
它只会检查您何时 $form->isValid()
如果您的字段为空且必填或进行其他检查。
要实现这一点,您只需设置您想要这些字段的属性。就像你已经做过的那样。与 class 属性一样,属性可以向输入添加 html 代码。
P.S : AlexP 的回答是最好的答案,我只是提供更多相关信息。