我有一个表单类,可以递归地动态创建带元素/字段集的字段集。我这样做是为了将settings[general][rpp][value]
作为输入名称(例如)。生成字段是因为设置是在XML文件中用户定义的。
现场集的创建方式如下:
$fieldset = new Fieldset(...);
$fieldset->add(...);
$form->add($fieldset);
正确输出表格;一切正常。除了我需要验证。
我的目标是为这些嵌套元素定义验证器和过滤器。我真的很困惑它是如何工作的 - 但它看起来只是表单本身定义了一个input_filter setInputFilter(...)
而我不知道如何让它识别递归而不用工厂和专有类来代替字段集充满活力。
我清楚了吗?
感谢。
答案 0 :(得分: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);
因此,您可以看到必须为每组元素和每个字段集创建输入过滤器,然后向后工作,将它们相互添加,直到构建主输入过滤器,然后将其分配给表单实例。 / p>
然后,在运行general[setting_1]
- $form->setData($this->request->getPost())
$form->isValid()
等输入名称
这个响应可能要详细100倍,但它比动态字段集验证主题更好。
答案 1 :(得分:1)