【问题标题】:How to Order Entities (ManyToOne association) when using DoctrineORMModule\Form\Element\EntitySelect annotation使用 DoctrineORMModule\Form\Element\EntitySelect 注释时如何对实体进行排序(ManyToOne 关联)
【发布时间】:2013-06-11 20:28:18
【问题描述】:

使用 zf2 和 Doctrine,我正在为我的 Salesman 类生成一个表单。 Salesman 有一个对 Store 的 ManyToOne 引用(即,一个商店可以有 1 个或多个销售员)

由于我使用了@Annotation\Type("DoctrineORMModule\Form\Element\EntitySelect"),所以我在表单中显示了一个下拉列表,这正是我想要的。 p>

我想要实现的是基于商店的名称属性对商店进行排序在@ManyToOne 关联的框架中

这是我拥有的 HTML(生成)代码:

<select>
    <option value="1" selected="selected">Store A</option>
    <option value="2">Store C</option> <- not ordered! probably because using row id for sorting.
    <option value="3">Store B</option>
<select>

这就是我想要的:

<select>
    <option value="1" selected="selected">Store A</option>
    <option value="3">Store B</option>
    <option value="2">Store C</option> <- good, now my store are alphabetically ordered :-)
<select>

@Annotation\Type("DoctrineORMModule\Form\Element\EntitySelect") 接受 @ORM\OrderBy({"name" = "ASC"}) 可选注释但这仅适用于 @OneToMany 或 @ManyToMany :-(

问题:

如何通过我的 @ManyToOne 关联在我的 EntitySelect 中实现排序?

PHP源码摘录:

<?php
namespace Customer\Entity;

use Doctrine\ORM\Mapping as ORM;
use Zend\Form\Annotation;

/**
 * @ORM\Entity
 */

class Salesman extends AbstractEntity
{
    ...

    /**
     * @ORM\ManyToOne(targetEntity="Customer\Entity\Store", fetch="EAGER")
     * @Annotation\Attributes({"readonly":"false"})
     * @Annotation\Type("DoctrineORMModule\Form\Element\EntitySelect")
     * @Annotation\Options({"label":"Store:", "target_class":"Customer\Entity\Store"})
     */
    protected $store;

    ...
}

<?php
namespace Customer\Entity;

use Doctrine\ORM\Mapping as ORM;

use Zend\Form\Annotation;

/**
 * @ORM\Entity
 */

class Store extends AbstractEntity
{

    ...

    /**
     * @ORM\Column(type="string", length=100)
     * @Annotation\Options({"label":"Name: "})
     */
    protected $name;

    /**
     * @ORM\OneToMany(targetEntity="Customer\Entity\Salesman", mappedBy="store", cascade={"all"}, orphanRemoval=true)
     * @Annotation\Attributes({"type":"hidden"})
     * @Annotation\Required(false)
     * @Annotation\Type("Zend\Form\Element\Collection")
     * @Annotation\Options({
     *     "label" : "Salesmen",
     *     "target_element" : {
     *         "composedObject" : "Customer\Entity\Salesman"
     *     }
     * })
     */
     protected $salesmen;
    ...
}

关于视图(.phtml),没什么特别要说的:只是基本形式。

...
$form->prepare();
echo $this->form()->openTag($form);    
echo $this->formCollection($form);
echo $this->form()->closeTag();
...

感谢您的帮助。

【问题讨论】:

  • 谢谢山姆。好吧...我使用 $builder = new AnnotationBuilder(); 创建表单$this->form = $builder->createForm('Customer\Entity\Salesman');所以我会尝试在表单中找出生成的“DoctrineModule\Form\Element\ObjectSelect”并以编程方式对其进行更改。但这似乎不是“最干净”的继续方式(使用基于注释的表单创建方法时)
  • 我自己不使用注释,所以无法解决这个事实,但目前这是唯一的方法。如果我没记错的话,我们在 ZF2 中没有 @Inject
  • 感谢您的评论:所以我调试并找到了 EntitySelect 元素并且可以更改选项以使其正常工作!感谢您的提示(我在回答中感谢您)

标签: php doctrine zend-framework2


【解决方案1】:

感谢Sam 提供的url doc,我可以弄清楚如何更改我的EntitySelect after 表单生成和before 表单绑定的选项。

我是这样做的:

    $storeOptions = $this->form->get('store')->getOptions();

    /* mannually changing options.
       If someone knows how to achieve this using annotations, I am interested :-) */
    $storeOptions['is_method']   = true;
    $storeOptions['find_method'] = array(
        'name'   => 'findBy',
        'params' => array(
                'criteria' => array(), // no criteria since I want the whole list
                'orderBy'  => array('name' => 'ASC'),
        ),
    );

    $this->form->get('store')->setOptions($storeOptions);

现在我的实体选择器下拉列表按字母顺序排列。非常感谢山姆!

【讨论】:

    【解决方案2】:

    这对我有用

     * @Annotation\Options({"label":"Team(s):", "find_method"={"name": "findBy", "params"={"criteria"={}, "orderBy"={"name":"ASC"}}}})*
    

    【讨论】:

    • 关系是@ManyToOne 关联吗?
    【解决方案3】:

    添加到属性上方的实体

    @ORM\OrderBy({"name" = "ASC"})

    more info here

    编辑

    当然名称和 ASC 需要替换为您喜欢/需要的值

    【讨论】:

    • 会尝试,但文档声明“除了任何@OneToMany 或@ManyToMany 注释,您可以通过以下方式指定@OrderBy”。不提ManyToOne,我的情况是这样的……你试成功了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多