1

我对 Zend Framework 2 & Doctrine 的下拉列表有疑问。我会将“selected”属性放在我的下拉列表中,但所有选项都会传递给 selected

我的代码:

控制器 :

public function editAction()
{
    // get error message during addAction
    $this->layout()->setVariable("messageError", $this->flashMessenger()->getErrorMessages());

    $auth = $this->getAuthService();
    if ($auth->hasIdentity()){
        $builder = new AnnotationBuilder();
        // Get id of StaticContent
        $id = (int)$this->getEvent()->getRouteMatch()->getParam('id');
        if (!$id) {
            $this->flashMessenger()->addErrorMessage("Aucun plan choisi !");
             return $this->redirect()->toRoute('admin/plans');
        }
        $plan = $this->getEntityManager()->getRepository("Admin\Entity\Plan")->find((int)$id);
        $form = $builder->createForm($plan);
        // Find options for Localite list (<select>)
        $localites = $this->getEntityManager()->getRepository("Admin\Entity\Localite")->getArrayOfAll();
        $form->get('localiteid')->setValueOptions($localites);
        $form->get('localiteid')->setValue("{$plan->getLocaliteid()->getId()}");

        // Find options for TypePlan list (<select>)
        $typesPlan = $this->getEntityManager()->getRepository("Admin\Entity\TypePlan")->getArrayOfAll();
        $form->get('typeid')->setValueOptions($typesPlan);
        $form->get('typeid')->setValue("{$plan->getTypeid()->getId()}");
        // Options for Statut list (<select>)
        $form->get('statut')->setValueOptions(array('projet'=>'Projet', 'valide'=>'Validé'));
        $form->get('statut')->setValue($plan->getStatut());
        $form->setBindOnValidate(false);
        $form->bind($plan);
        $form->add(array(
            'name' => 'submit',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Modifier',
                'id' => 'submitbutton',
                'class' => "btn btn-primary"
            ),  
        ));
        $request = $this->getRequest();
        if ($request->isPost()) {
            [...]

            }
}

$localites = $this->getEntityManager()->getRepository("Admin\Entity\Localite")->getArrayOfAll();
    $form->get('localiteid')->setValueOptions($localites);

我正确填充我的下拉列表,通常使用

$form->get('localiteid')->setValue("{$plan->getLocaliteid()->getId()}");

只需在由以下定义的选项上设置“选定”:

$plan->getLocaliteid()->getId()

那么为什么在我的下拉列表中选择了所有选项?!

信息:typeId 相同,但没有 Statut

4

3 回答 3

1

由于花括号,它可能无法正常工作。根据PHP文档

使用单个花括号 ({}) 将无法访问函数或方法的返回值或类常量或静态类变量的值。

这在使用 setValue 时也是不必要的。ZF2 在视图中对其进行格式化时会将其转换为字符串。

当您创建要传递给 setValueOptions() 的数组时,您应该使其成为具有以下值的数组的关联数组:

$form->get('select')->setValueOptions(array(
  'field' => array(
      'value' => 'value_of_the_option',
      'label' => 'what is displayed',
      'selected' => true,
  ),
));

哪个字段的 selected 选项设置为 true 将是表单元素中的默认选择。

于 2013-08-08T01:28:34.337 回答
1

就我个人而言,我不知道 getArrayOfAll() 这样的函数是否存在,我假设您正确地将数组传递给 FORM,

我认为你应该做这样的事情来设定价值。

 $form->get('localiteid')->setValue($plan->getLocaliteid()->getId());

但是由于您正在填充 DROP down,我想这种方法不适用于 Drop Down。你需要做这样的事情

   $form->get('localiteid')->setAttributes(array('value'=>$plan->getLocaliteid()->getId(),'selected'=>true));
于 2013-08-08T05:13:16.890 回答
0

我发现了一个错误?!

$plan = $this->getEntityManager()->getRepository("Admin\Entity\Plan")->find((int)$id);
$idLocalite = 18;//(int)$plan->getLocaliteid()->getId();
$idTypePlan = 2;//(int)$plan->getTypeid()->getId();

当我使用$plan->getLocaliteid()->getId();$plan->getTypeid()->getId()将参数传递给 Repository 方法时getArrayOfAll($idLocalite)

LocaliteRepository.php:

class LocaliteRepository extends EntityRepository {

  public function getArrayOfAll($currentLocaliteId) {
    $result = $this->_em->createQuery("SELECT l.nom, l.localiteid FROM Admin\Entity\Localite l ORDER BY l.nom")->getArrayResult();
    $localite = array();
    foreach($result as $loc) {
        if ($currentLocaliteId == $loc['localiteid']) {
            $localite[$loc['localiteid']] = array(
                    'value' => $loc['localiteid'],
                    'label' => $loc['nom'],
                    'selected' => true,
            );
        } else {
            $localite[$loc['localiteid']] = array(
                    'value' => $loc['localiteid'],
                    'label' => $loc['nom'],
                    'selected' => false
            );
            //$localite[$loc['localiteid']] = $loc['nom'];
        }
    }

    return $localite;
  }

}

所以,如果我使用$idLocalite = 18而不是$idLocalite = (int)$plan->getLocaliteid()->getId()只选择想要的选项。为什么 ?!

于 2013-08-09T09:18:17.440 回答