如何在不使用工厂的情况下验证Zend Framework 2中的嵌套字段集

Eme*_*ing 3 php zend-framework2

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

Fieldsets的创建方式如下:

$fieldset = new Fieldset(...);
$fieldset->add(...);
$form->add($fieldset);
Run Code Online (Sandbox Code Playgroud)

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

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

我明白了吗?

谢谢.

Eme*_*ing 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);
Run Code Online (Sandbox Code Playgroud)

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

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

这个响应可能要详细100倍,但它比动态字段集验证的主题更好.