动态下拉列入zf2?

时间:2013-03-13 11:33:56

标签: zend-framework2

我想在我的zf2项目中放一个下拉列表...我整天都浪费了但是我只有一个静态下拉列表,而不是动态。任何人都可以帮我解决这个问题吗?

UserForm.php

$this->add(array(
            'name' => 'group_name',
            'type' => 'select',  
            'attributes' => array(
                'id'=>'group_name',
                'class'=>'large',
                'options' => array('1=>php','2'=>'java'),
            ),
            'options' => array(
                'label' => '',
            ),
        ));

提前感谢您的重要回答。

5 个答案:

答案 0 :(得分:0)

试试这个:

$this->add(array(
    'name' => 'group_name',
    'type' => 'select',  
    'attributes' => array(
        'id'=>'group_name',
        'class'=>'large',
    ),
    'options' => array(
        'label' => '',
        'value_options' => array(
            '1' => 'php', 
            '2' => 'java'
        ),
    ),
));

答案 1 :(得分:0)

这就是我所做的:

在我的表单构造函数中

    $this->add(array(
        'type' => 'Zend\Form\Element\Select',
        'name' => 'color',
        'options' => array(
            'empty_option' => 'Select a Color',
            'value_options' => self::getColors(),
            'label' => 'Color',
        ),
    ));

在表单类中,我创建了这个方法:

public static function getColors() {
    // access database here
    //example return
    return array(
        'blue' => 'Blue',
        'red'  => 'Red',
    );
}

在我的视图脚本中:

    <div class="form_element">
        <?php $element = $form->get('color'); ?>
        <label>
            <?php echo $element->getOption('label'); ?>
        </label>
        <?php echo $this->formSelect($element); ?>
    </div>

答案 2 :(得分:0)

从抽象层面考虑它。

  • 您有一个表格
  • 表单需要来自外部的数据

所以最终你的表格有Dependency。由于我们已从official docs了解到,因此Dependency-Injection又称DI两种类型。 Setter-Injection和构造函数注入。就个人而言(!)我在这些情况下使用其中一种:

构造函数注入如果依赖项是功能工作的绝对要求

Setter-Injection 如果依赖项或多或少是可选的,以扩展已经工作的东西

对于Form,它是一个必需的依赖项(因为没有它,没有填充的Select-Element),因此我将给你一个构造函数注入的例子。

您的控制器的某些操作:

$sl   = $this->getServiceLocator();
$dbA  = $sl->get('Zend\Db\Adapter\Adapter');
$form = new SomeForm($dbA);

表格的全部内容。人口现在发生在你的表格内。这只是一个例子,可能需要一些微调,但你会得到这个想法:

class SomeForm extends \Zend\Form
{
    public function __construct(\Zend\Db\Adapter\Adapter $dbA)
    {
        parent::__construct('my-form-name');

        // Create all the form elements and stuff

        // Get Population data
        $popData = array();
        $result = $dbA->query('SELECT id, title FROM Categories', $dbA::QUERY_MODE_EXECUTE)->toArray();
        foreach ($result as $cat) {
            $popData[$cat['id'] = $cat['title'];
        }

        $selectElement = $this->getElement('select-element-name');
        $selectElement->setValueOptions($popData);
    }   
}

重要:我对Zend\Db没有任何反对意见上述代码仅适用于我认为the docs的工作方式!这是可能需要进行一些优化的部分。但总而言之,您将了解它是如何完成的。

答案 3 :(得分:0)

在您的控制器中,您可以执行以下操作;

在我的第一个例子中,假设你有一个组表。然后我们将fetch所有组表中的数据; 我们需要在选择选项中显示ID和名称;

public function indexAction()
{
    $groupTable = new GroupTable();
    $groupList = $groupTable->fetchAll();

    $groups = array();
    foreach ($groupList as $list) {
        $groups[$list->getId()] = $list->getName();
    }    

    $form = new UserForm();
    $form->get('group_name')->setAttributes(array(
        'options' => $groups,   
    )); 
}

OR

在此示例中,组列表是硬编码的;

public function indexAction()
{
    $groupList = array('1' => 'PHP', '2' => 'JAVA', '3' => 'C#');

    $groups = array();
    foreach ($groupList as $id => $list) {
        $groups[$id] = $list;
    }    

    $form = new UserForm();
    $form->get('group_name')->setAttributes(array(
        'options' => $groups,   
    )); 
}

然后在你的视图脚本中;

<?php 
    $form = $this->form;
    echo $this->formRow($form->get('group_name')); 
?>

或者你可以找一个控制器助手,你可以查看这个链接http://www.resourcemode.com/me/?p=327

答案 4 :(得分:0)

刚遇到同样的问题,不得不看看zf2源码。 这是一个更多的OOP解决方案:

表单构造函数内部:

        $this->add(array(
        'name' => 'customer',
        'type' => 'Zend\Form\Element\Select',
        'attributes' => array(
            'options' => array(
                0 => 'Kunde',
            )
        ),
        'options' => array(
                'label' => 'Kunde'
    )));

控制器内部:

    $view->form = new SearchForm();
    $customers = $view->form->get('customer')->getValueOptions();
    $customers[] = 'Kunde1';
    $customers[] = 'Kunde2';
    $customers[] = 'Kunde3';
    $customers[] = 'Kunde4';
    $view->form->get('customer')->setValueOptions($customers);