我想要一个按父类别分组的选择列表(下拉列表)(不可选)。这可能吗?
Example:
- Vehiculs (not selectable)
-- Car (selectable)
-- Boat (selectable)
- Computers (not selectable)
实体类别
/**
* @ORMOneToMany(targetEntity="Category", mappedBy="parent")
**/
private $children;
/**
* @ORMManyToOne(targetEntity="Category", inversedBy="children")
* @ORMJoinColumn(name="parent_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
**/
private $parent;
形式:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', 'text',
[
'attr' => ['placeholder' => 'Titel', 'class' => 'form-control', 'autocomplete' => 'off'],
'label' => false
]
)
...
->add('category', 'entity',
[
'property' => 'name',
'class' => '***ArticleBundle:Category',
]
)
;
}
使用上面的代码,我只得到父母,他们是可选的。我想把这些父母的孩子分组(1个深度),只让孩子们选择。
只是发布这个,因为这似乎是谷歌针对这个问题的第一次点击,我必须解决它。
事实上,您可以直接告诉symfony在FormBuilder中创建一个树选择,只需一个完全干净的小解决方案。
"实体"是"选择"的产物,这一事实在很大程度上帮助了这一点。该解决方案由三部分组成:Controller、FormType和Entity Repository让我们从控制器开始
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(new AcmeType(array(
'repository' => $em->getRepository('AcmeBundle:Category'),
)), $data, array(
'action' => *add your route here*
'method' => 'POST'
));
直接生成表单,除了将存储库作为FormType(我们需要它)的参数之外
您的FormType包括以下
/** @var CategoryRepository */
protected $repository;
public function __construct($options = array()){
$this->repository = $options['repository'];
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
*add your other stuff here*
->add('category', 'entity', array(
'empty_value' => 'Please Select...',
'required' => true,
'choices' => $this->repository->getCategoryData(),
'class' => 'AcmeAcmeBundleEntityCategory'
))
;
}
我们创建一个Entity字段类型,添加"选项",并用"getCategoryData"的响应填充它。
在数据实体的存储库中(在本例中为类别实体),您可以创建以下函数
public function getCategoryOptions()
{
$data = array();
$categories = $this
->createQueryBuilder('c')
->select('c')
->getQuery()
->getResult();
foreach( $categories as $category ){
/** @var Category $category */
if( !$category->getParent() ){
continue;
}
if(!array_key_exists($category->getParent()->getName(), $data) ){
$data[$category->getParent()->getName()] = array();
}
$data[$category->getParent()->getName()][$category->getId()] = $category;
}
return $data;
}
这个简单的函数对数据库执行一个简单的查询,以选择您的类别,然后通过它们运行foreach并构建一个数组。如上面的FormType所示,它将该数组直接解析为Entity字段类型的"choices"参数。symfony的Form Renderer足够聪明,可以添加带有标签的标签。
等等,你有一个分组的下拉框,其中包含不可选择的"家长"。
您不能直接告诉symfony在表单生成器中创建树选择。
首先,你必须在这里检查;http://symfony.com/doc/current/reference/forms/types/entity.html
您可以在实体字段上使用查询生成器来获取父子关系,但也可以选择父关系。
因此,您必须寻找另一种解决方案,如下所示:如何禁用表单选择类型中的特定项目?