首先感谢您对此进行调查。 我正在构建一个表单来向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);
......
}
感谢。
答案 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是可选的。
我希望这是有道理的。