ZF2表格/主义自我引用关系下拉列表

时间:2015-11-16 04:19:30

标签: php doctrine-orm zend-framework2 zend-form

首先感谢您对此进行调查。 我正在构建一个表单来向db表添加类别,这些类别可以具有父类别(自引用)。有一个下拉列表可以选择父类别。我使用ZF2和Doctrine 2来构建这个表单。一切正常但我唯一的问题是在编辑页面上,父类别下拉列表也显示当前类别。我想知道如何将其从下拉列表中排除。我在下面发布了一些代码。为了简单起见,我删除了一些不相关的行并缩短了一些名称。

我在模型上定义了自引用关系

//Category model
use Doctrine\ORM\Mapping as ORM;
Class Category {
/**
 *
 * @var integer
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
protected $id;
.....
.....
/**
 * Parent category if available
 * @var self 
 * @ORM\OneToOne(targetEntity="Category")
 * @ORM\JoinColumn(name="parent", referencedColumnName="id", nullable=true)
 */
protected $parent;

在表单上,​​我有一个列出所有类别的下拉列表

$parent = new \DoctrineModule\Form\Element\ObjectSelect('parent');
$parent->setOptions(array(
        'label' => 'Parent Category',
        'class' => '',
        'object_manager' => $this->em,
        'target_class' => \Data\Entity\Category::class,
        'property' => 'name',
        'display_empty_item' => true,
        'empty_item_label'   => '- Select Category -',
        'required' => false
    ))->setAttributes(array(
        'class' => 'form-control'
    ));

在编辑控制器上,我加载表单并将其绑定到db条目

public function editAction()
{
    //get id from url
    $id = $this->params()->fromRoute('id', 0);

    $request = $this->getRequest();

    //load selected category from database
    $category = $this->em->getRepository(\Data\Entity\Category::class)->find($id);

    //create form
    $form = new Form\Category($this->em);

    //bind selected category to form
    $form->bind($category);

    ......
}

感谢。

1 个答案:

答案 0 :(得分:1)

您需要将正在编辑的类别的类别ID传递给表单,并设置对象选择搜索参数以将ID传递给实体存储库。然后,您需要在存储库中创建搜索查询,以排除在搜索结果中返回类别ID。

您可以使用简单的setter将类别ID传递给表单。

protected $categoryId;

public function setCategoryId($categoryId)
{
    $this->categoryId = $categoryId;
}

在您的表单中,您需要类似

的内容
$parent->setOptions(array(
            'label' => 'Parent Category',
            'class' => '',
            'object_manager' => $this->em,
            'target_class' => \Data\Entity\Category::class,
            'property' => 'name',
            'is_method' => true,
            'find_method' => array(
                'name' => 'findCategories',
                'params' => array(
                    'searchParams' => array('id' => $this->categoryId),
                ),
            ),
            'display_empty_item' => true,
            'empty_item_label' => '- Select Category -',
            'required' => false
        ))->setAttributes(array(
            'class' => 'form-control'
        ));

并在您的类别库中

public function findCategories($searchParams)
    {
        $builder = $this->getEntityManager()->createQueryBuilder();
        $builder->select('c')
                ->from(\Data\Entity\Category::class, 'c')
                ->where('c.id != ?1')
                ->setParameter(1, $searchParams['id'])
                ->orderBy('c.category', 'ASC');

        return $builder->getQuery()->getResult(Query::HYDRATE_OBJECT);
    }

请注意orderBy是可选的。

我希望这是有道理的。