ZF2-如何在Zend Form上使用Ajax设置依赖下拉列表

时间:2013-08-06 09:23:01

标签: javascript ajax zend-framework2 zend-form

我正在使用Zend Framework2,我在Zend上设置2依赖下拉列表时遇到一些困难,所以当我选择一个类别时,系统会用适当的数据填充第二个select元素。我知道我们使用Ajax来做到这一点,但我不知道如何继续。

我的表单如下:

$this->add(array(
            'type' => 'Zend\Form\Element\Select',
            'name' => 'categ_event',
            'options' => array(
                    'label' => 'Event category ',
                    'style' => 'display:none;',
                    'value_options' => array(
                                                ),
            ),

    ));

    $this->add(array(
            'type' => 'Zend\Form\Element\Select',
            'name' => 'type_incident',
            'options' => array(
                    'label' => 'Incident type',
                    'style' => 'display:none;',
                    'value_options' => array(
                                                ),
            )));

请注意,我在控制器类上填充了我的元素。这是代码:

$form->get('categ_event')->setValueOptions(
                $this->getTableInstance('CategEventTable')
                ->getListCateg());
        $form->get('type_incident')->setValueOptions(
                $this->getTableInstance('TypeIncidentTable')
                ->getListTypeIncident());

那么我如何使用Ajax来填充categories_event的更改事件的第二个select元素。

谢谢!

1 个答案:

答案 0 :(得分:3)

我希望我理解你的关注:

  • 您有两个选择字段
  • 选择字段1包含多个类别
  • 选择字段2应包含数据,具体取决于SF1选择的内容

鉴于上述情况,我将向您提出我的解决方案。秘诀在于如何渲染选择元素,基本上您需要类似于此的输出:

<select id="category-list">
    <option value="1">Foo</option>
    <option value="2">Hello</option>
</select>

<select id="dependant-list">
    <option value="1" data-category="1">Bar</option>
    <option value="2" data-category="1">Baz</option>
    <option value="3" data-category="2">World</option>
    <option value="4" data-category="2">User</option>
</select>

你几乎手动渲染它们。然后是简单的JQuery东西:

var s1 = $('#category-list');
var s2 = $('#dependant-list');

//Hide all of Select List 2
var dependantOptions = s2.find('option');
    dependantOptions.css('visibility', 'hidden');

s1.on('change', function() {
    dependantOptions.css('visibility', 'hidden');
    s2.find("option[data-category='" + $(this).val() + "']").css('visibility', 'visible');
});

当您使用s2.find()时,最后一行dependantOptions可能会更加优化,但我不知道我现在最初会如何工作......

此外,您可能更喜欢使用visibility:hidden/visible

,而不是使用display:none/inline