将参数从实体传递给query_builder

rkm*_*max 2 php forms symfony-forms symfony

我有一个实体

Product:
  name # string
  country # entity
  categories #entity many-many
Run Code Online (Sandbox Code Playgroud)

我有一个该实体的表格

ProductType:名称类别

现在我需要按国家/地区筛选类别,但我不想在我构建表单时显示国家/地区参数

//...
$entity = new Entity\Product();
$entity->setCountry($this->getUser()->getProfile()->getCountry());
$form = $this->createForm(new Form\ProductType(), $entity);

return array('form' => $form->createView());
Run Code Online (Sandbox Code Playgroud)

我希望在ProductType类中按国家/地区筛选类别,如何实现此目的?

我如何将$ country值传递给查询构建器?

//...
->add('categories', 'entity', array(
  'class' => 'MyBundle:Category',
  'query_builder' => function(EntityRepository $er) {
    return $er->createQueryBulder('c');
  }
)
Run Code Online (Sandbox Code Playgroud)

fer*_*tor 7

您正在寻找options可以传递给表单类的数组.将其添加到您的FormType:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'country' => null
    ));
}
Run Code Online (Sandbox Code Playgroud)

然后打电话给FormType这样:

$this->createForm(new Form\ProductType(), $entity, array(
    'country' => $country
));
Run Code Online (Sandbox Code Playgroud)

$country在您的buildForm方法中访问如下:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $country = $options['country'];
Run Code Online (Sandbox Code Playgroud)

从那里你可以构建自己的queryBuilder来只选择你需要的产品.

编辑: 要访问$countryqueryBuilder中的变量,您应该使用该use语句.它看起来像这样:

->add('categories', 'entity', array(
   'class' => 'MyBundle:Category',
   'query_builder' => function (EntityRepository $er) use($country) {
       // here you can use the $country variable in your anonymous function.
       return $er->createQueryBuilder('c');
       }
    )
)
Run Code Online (Sandbox Code Playgroud)