3

我有一个表单类,它可以递归地动态创建带有元素/字段集的字段集。我这样做是为了settings[general][rpp][value]作为输入名称(例如)。由于设置是用户在 XML 文件中定义的,因此会生成这些字段。

字段集是这样创建的:

$fieldset = new Fieldset(...);
$fieldset->add(...);
$form->add($fieldset);

表格输出正确;一切正常。除了我需要验证。

我的目标是为这些嵌套元素定义验证器和过滤器。我真的很困惑它是如何工作的 - 但它看起来只是表单本身定义了一个 input_filtersetInputFilter(...)并且我不知道如何让它识别没有工厂和字段集的专有类而不是动态的递归。

我清楚了吗?

谢谢。

4

2 回答 2

12

我已经弄清楚如何使用验证和过滤器来完成这种高度动态的表单类型。我将在这里用这个假设的脚本进行解释:

// create a form instance and a filter instance
$form = new Form();
$filter = new InputFilter();

// create a fieldset instance and another filter instance
$fieldset_a = new Fieldset('general');
$fieldset_a_filter = new InputFilter();

// create element(s) to assign to fieldset
$setting_1 = new Element('setting_1');

// create another input filter for element defining filters and validators
$setting_1_filter = new InputFilter(array(
    'name' => 'setting_1',
    'required' => true,
    'validators' => array(), // ...
));

// add element to fieldset
$fieldset_a->add($setting_1);
// add fieldset to form
$form->add($fieldset_a);

// add element filter to fieldset filter
$fieldset_a_filter->add($setting_1_filter,'setting_1');
// add fieldset A filter to main input filter
$filter->add($fieldset_a_filter,'general');

$form->setInputFilter($filter);

因此,您可以看到您必须为每组元素和每个字段集创建输入过滤器,然后将它们相互添加,直到构建主输入过滤器并将其分配给表单实例。

然后,这将使用提供的具有输入名称的验证器,例如general[setting_1]在运行之后$form->setData($this->request->getPost())-$form->isValid()

此响应可能要详细 100 倍,但它比动态字段集验证主题中可用的更好。

于 2013-06-26T06:36:10.997 回答
1

在这里,在 ZF2 文档中也进行了解释http://framework.zend.com/manual/2.3/en/modules/zend.form.collections.html

于 2014-05-09T16:35:28.320 回答