在 Zend 2 相册示例中填充数据库中的可选字段


Populate selectable field from DB in Zend 2 Album example

我开始使用Zend编程,我正在使用他们提供的默认专辑示例作为"入门"指南。

我想在表单中有一个选择下拉字段,但我找不到像现在的代码那样简单的方法

这就是我的做法,而无需从我的用户表单咨询数据库.php

$this->add(array(
    'type' => 'Zend'Form'Element'Select',
    'name' => 'level',
    'options' => array(
        'label' => 'User level',
        'value_options' => array(
                    '1' => 'admin',
                    '2' => 'boss',
                    '3' => 'assistent',
                    '4' => 'client',
        ),
    ),
));

更新

好的,所以在使用 TableGateway 的教程之后,我设法有一个可选的,但正在从"项目"表中获取数据,因为我的其余字段需要该表,但我需要从"用户"表中获取该可选表。

我的模块.php如下所示:

public function getServiceConfig()
{
    return array(
        'invokables' => array(),
        'factories' => array(
            'Project'Model'ProjectTable' =>  function($sm) {
                $projectTableGateway = $sm->get('ProjectTableGateway');
                $usersTableGateway = $sm->get('UsersTableGateway');
                $table = new ProjectTable($projectTableGateway, $usersTableGateway);
                return $table;
            },
            'project-model-selectable' =>  function($sm) {
                $tableGateway = $sm->get('selecttable-gateway');
                $table = new SelectTable($projectTableGateway, $usersTableGateway);
                return $table;
            },
            'ProjectTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('Zend'Db'Adapter'Adapter');
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Project());
                return new TableGateway('project', $dbAdapter, null, $resultSetPrototype);
            },
            'UsersTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('Zend'Db'Adapter'Adapter');
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Users());
                return new TableGateway('user', $dbAdapter, null, $resultSetPrototype);
            },
            'selecttable-gateway' => function ($sm) {
                $dbAdapter          = $sm->get('Zend'Db'Adapter'Adapter');
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new SelectOption());
                return new TableGateway('user', $dbAdapter, null, $resultSetPrototype);
            },
        ),
    );
}

以及我在ProjectTable中的getProject函数.php:

public function getProject($id)
    {
        $id  = (int) $id;
        $rowset = $this->projectTableGateway->select(array('id' => $id));
        $row = $rowset->current();
        if (!$row) {
            throw new 'Exception("Could not find row $id");
        }
        return $row;
    }

我在项目控制器中的addAction.php

public function addAction()
    {
        $tableGateway = $this->getServiceLocator()->get('Project'Model'ProjectTable');
        $form = new ProjectForm($tableGateway);
        $form->get('submit')->setValue('Nuevo');
        $request = $this->getRequest();
        if ($request->isPost()) {
            $project = new ProjectForm($tableGateway);
            $form->setInputFilter($project->getInputFilter());
            $form->setData($request->getPost());
            if ($form->isValid()) {
                $project->exchangeArray($form->getData());
                $this->getProjectTable()->saveProject($project);
                // Redirect to list of projects
                return $this->redirect()->toRoute('project');
            }
        }
        return array('form' => $form);
    }

谢谢

public function getProject($id)
{
    $id  = (int) $id;
    $rowset = $this->projectTableGateway->select(array('id' => $id));
    $row = $rowset->current();
    if (!$row) {
        throw new 'Exception("Could not find row $id");
    }
    return $row;
}