如何实现下拉列表中一组元素的ObjectSelect

How to implement a group of elements in the drop-down list ObjectSelect

如何实现下拉列表中的一组元素ObjectSelect'optgroup_identifier'

Form\CategoryForm.php

$this->add([
    'type'  => ObjectSelect::class,
     'name' => 'category',
    'options' => [
        'label' => 'Категория',
        'object_manager' => $this->getObjectManager(),
        'target_class'   => Category::class,
        'property'       => 'name',
        'optgroup_identifier' => '???',
        'optgroup_default'    => 'Главная',
        'empty_option'   => '== Категория ==',
        'is_method'      => true,
        'find_method'    => [
            'name'   => 'findAllChildCategories',
            'params' => [
            ],
        ],
    ],
]);

类别 Table 相关 Self-referencing

Entity\Category.php

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\OneToMany(targetEntity="Application\Entity\Category", mappedBy="parent", cascade={"remove"})
 */
private $children;

/**
 * @var \Application\Entity\Category
 *
 * @ORM\ManyToOne(targetEntity="Application\Entity\Category", inversedBy="children")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="parent", referencedColumnName="id", nullable=true)
 * })
 */
private $parent;

组名必须是父类 $category->getParent()->getName()

值得庆幸的是,对于这种情况,Doctrine 不会执行任何查询来获取分组;它在内部进行。 optgroup_identifier 只是用于获取组名的 getter 的名称,因此 getter 可以 return 任何你想要的。

Entity\Category中添加一个方法,专门用于return获取类别的父名称。确保它不与任何字段重合,因此 Doctrine 不会 return 将整个对象代理到表单中。例如:

public function getParentName() {
    if(!$this->parent) return '';
    return $this->parent->getName();
}

由于根类别没有父类别,$this->parent 将为 null。注意这种情况以避免脚本崩溃和 return 空字符串作为它的指定。

然后,将这个getter名字填入表格的optgroup_identifier。最终结果将如示例数据的屏幕截图所示。