0

我正在使用 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,因为我选择在我的控制器中执行此操作,其中服务管理器可用:

    $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 的更改事件中,我$.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问的问题与我类似,但我想详细说明我的问题。

4

1 回答 1

1

好吧,我意识到我应该在验证表单之前填充我的选择元素!

// 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...
    }

该代码工作得很好。我的表格现在完美验证!

于 2012-11-06T10:41:01.130 回答