【问题标题】:ZF2 - set selected value on Select ElementZF2 - 在选择元素上设置选定值
【发布时间】:2013-08-07 13:36:37
【问题描述】:

我对 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

【问题讨论】:

    标签: doctrine-orm zend-framework2


    【解决方案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 将是表单元素中的默认选择。

    【讨论】:

    • 谢谢!我尽快测试它。
    【解决方案2】:

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

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

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

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

       $form->get('localiteid')->setAttributes(array('value'=>$plan->getLocaliteid()->getId(),'selected'=>true));
    

    【讨论】:

    • getArrayOfAll() 是一个存储库方法。这是我的 Localite RepositoryClass 中的自定义 find()。我将使用@Adrian 的方法
    【解决方案3】:

    我发现了一个错误?!

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

    当我使用$plan-&gt;getLocaliteid()-&gt;getId();$plan-&gt;getTypeid()-&gt;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-&gt;getLocaliteid()-&gt;getId(),则只选择想要的选项。为什么?!

    【讨论】:

    • 抱歉,不太明白这个问题。只有18岁才有效?或者当你通过 18 时它选择了错误的东西?我建议您在将 $localite 传递给 Select 元素之前转储它并查看它的结构。如果问题是它只有在您传入 18 时才能正常工作,那么获取 $plan 的查询就有问题。
    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 2011-08-06
    • 2010-11-16
    • 2017-05-30
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多