我有一个带有集合字段类型的表单。 我想对实体字段类型进行过滤,但我没有找到解决方案。
我发现了其他类似的问题但到目前为止还没有令人满意的答案。我们可以这样做:
$builder
->add('userIngredients', 'collection', array(
'type' => new UserImportedIngredientType($this->userIngredients),
'query_builder'=>$this->queryBuilder,
))
;
如果没有,我们可以使用表单侦听器事件来基于对象属性排除某些元素吗?怎么样?
此集合表示userIngredients,我希望用户在将其属性isImported设置为true时能够更改,从而搜索query_builder解决方案。
答案 0 :(得分:1)
好吧,我想我可以做一些简单的事情,比如建立一个没有附加到父实体的常规表格。
如果这可能对某人有所帮助:
class UserImportedIngredientType extends AbstractType
{
protected $userIngredients;
protected $userImportedIngredients;
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
foreach ($this->userImportedIngredients as $userImportedIngredient)
{
/**
* @var $userImportedIngredient UserIngredient
*/
$builder
->add($userImportedIngredient->getId(), 'genemu_jqueryselect2_entity', array(
'query_builder'=>$this->userIngredients,
'class' => 'AppBundle:FoodAnalytics\UserIngredient',
'multiple' => false,
'label' => $userImportedIngredient->getName(),
'required'=>false,
'mapped' => false,
'data' => $userImportedIngredient
))
;
}
}
/**
* @return string
*/
public function getName()
{
return 'appbundle_foodanalytics_user_imported_ingredient';
}
public function __construct($userIngredients, $userImportedIngredients)
{
$this->userIngredients=$userIngredients;
$this->userImportedIngredients=$userImportedIngredients;
}
}
答案 1 :(得分:1)
在我的情况下,我在Symfony上添加了Sonata,这样解决了这个问题。我所做的是提供'data'参数,特定的doctrine查询实体数组结果。 (在存储库中:返回$ queryBuilder-> getQuery() - > getResult(); )
/** @var MyEntityRepository $myEntityRepository */
$myEntityRepository = $this->getEntityManager()->getRepository(MyEntity::class);
/** @var MyEntity[] $myEntities */
$myEntities = $myEntityRepository->findBySomeCriteriaFilter(
$parameter, Constants::specificConstant
);
$formMapper->add(
// html name=
'myEntityProperty',
\Symfony\Component\Form\Extension\Core\Type\CollectionType::class,
[
// specific form for MyEntity
'entry_type' => new Form\MyEntity\MyEntityType(),
'allow_add' => true,
'label' => false,
'entry_options' => [
'label' => false
],
// the filtered array of entities from doctrine repository query above
'data' => $myEntities,
]
);
我猜这是用而不是sonata_type_model_list。 此外,如果要过滤sonata_type_model,请使用EntityType,并将“query_builder”选项与Closure一起使用,并返回queryBuilder而不是实体数组。这一切都非常不一致,最好不要使用symfony和sonata。
答案 2 :(得分:0)
据我所知,收藏有not have the query_builder option 所以你不能这样走。 很难用4行formType来破译你想要做的事情。
您的代码看起来没问题,除了未报告的query_builder,并且您已经将userIngredients传递给构造函数。
我的意思是,如果您需要对此进行过滤,那么您不应该在集合类型中执行此操作,而是在其他位置执行此操作。
已编辑:
但是,在第二个,你试图在错误的地方过滤集合。不在基础集合上,而是在:
class UserImportedIngredientType extends AbstractType {
function __construct( $userIngredients ) {
// Do your stuff
}
function buildForm( FormBuilderInterface $builder, array $options) {
// Add here your entity with the query_filter option :)
}
}
检查收藏中的SO中的其他条目,有many of them