我正在使用Zend Framework 2,我需要一个Dependent Dropdown。当用户选择一个类别(我的示例中为cat_id)时,系统会使用正确的元素填充子类别(sca_id)。
我可以通过创建这样的应用程序来做到这一点:
我的表单如下:
$this->add(array(
'name' => 'cat_id',
'type' => 'Zend\Form\Element\Select',
'options' => array(
'label' => 'Categoria',
'value_options' => array(
'' => '',
),
),
));
$this->add(array(
'name' => 'sca_id',
'type' => 'Zend\Form\Element\Select',
'options' => array(
'label' => 'Sub Categoria',
'style' => 'display:none;', // Esse campo soh eh exibido qndo uma categoria for escolhida
'value_options' => array(
'' => '',
),
),
));
请注意,我没有在那里填写value_options,因为我选择在我的控制器中执行此操作,其中可以使用Service Manager:
$form = new ProdutoForm('frm');
$form->setAttribute('action', $this->url()->fromRoute('catalogo-admin', array( ... )));
// Alimenta as comboboxes...
$form->get('cat_id')->setValueOptions($this->getCategoriaService()->listarCategoriasSelect());
在cat_id的change事件中,我执行$.ajax
从Action中抓取元素并填充sca_id。
工作正常!
问题出在我的验证上:
$this->add(array(
'name' => 'cat_id',
'require' => true,
'filters' => array(
array('name' => 'Int'),
),
));
$this->add(array(
'name' => 'sca_id',
'require' => true,
'filters' => array(
array('name' => 'Int'),
),
));
当我提交表单时,它会一直说:The input was not found in the haystack
这两个下拉菜单......
我做错了什么?
额外问题:有更好的方法来填写我的下拉菜单吗?
Ps:我想这个问题Disable notInArray Validator Zend Framework 2提出的问题与我相似,但我想详细说明我的问题。
答案 0 :(得分:1)
好吧,我意识到我应该在验证我的表单之前填充我的select元素!
// SaveAction
$request = $this->getRequest();
if ($request->isPost())
{
$form = new ProdutoForm();
// Alimenta as comboboxes...
$form->get('cat_id')->setValueOptions($this->getCategoriaService()->listarCategoriasSelect());
$form->get('sca_id')->setValueOptions($this->getSubCategoriaService()->listarSubCategoriasSelect());
// If the form doesn't define an input filter by default, inject one.
$form->setInputFilter(new ProdutoFormFilter());
// Get the data.
$form->setData($request->getPost());
// Validate the form
if ($form->isValid())
{
// Valid!
}else{
// Invalid...
}
该代码效果很好。我的表单现在完美验证了!