使用LexikFilterBundle类型我在主窗体上创建一个子窗体,所以:
->add('adressData', CollectionAdapterFilterType::class, array(
'entry_type' => AddressFilterType::class,
'add_shared' => function (FilterBuilderExecuterInterface $qbe) {
$qbe->addOnce($qbe->getAlias() . '.adressData', 'a');
},
'label' => 'person.address',
))
我的AddressFilterType是这样定义的:
// EyeColorFilterType.php
namespace AppBundle\Filter;
use AppBundle\Entity\AdressData;
use AppBundle\Entity\Country;
use AppBundle\Repository\AddressRepository;
use AppBundle\Repository\CountryRepository;
use AppBundle\Repository\EyeColourRepository;
use Lexik\Bundle\FormFilterBundle\Filter\FilterOperands;
use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\TextFilterType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CountryType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Lexik\Bundle\FormFilterBundle\Filter\Form\Type as Filters;
class AddressFilterType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('street', TextFilterType::class, [
'condition_pattern' => FilterOperands::STRING_CONTAINS])
->add('city', TextFilterType::class, [
'condition_pattern' => FilterOperands::STRING_CONTAINS])
->add("country", CountryType::class, [
'required' => false,
'multiple' => true,
'attr' => [
"class" => "countryselect2",
],
'placeholder' => 'address.choosecountry',
'label' => "address.country",
'translation_domain' => "address",
]);
}
public function getBlockPrefix()
{
return 'address_filter';
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => AdressData::class,
'translation_domain' => 'address'
));
}
// this allow us to use the "add_shared" option
public function getParent()
{
return Filters\SharedableFilterType::class;
}
}
现在在我的模板模板中,我将AddressFilterType传递给:
{% embed ":addressdata/forms:filter.html.twig" with{"address":form.adressData} %}{% endembed %}
如果我然后简单地调用form_row(addressdata)就行了(城市,街道和国家都按照上面显示的AddressFilterType中的定义进行渲染。但是如果我自己尝试渲染字段就会失败。为什么会这样?说没有这样的方法以getCountry()为例。当我将主窗体的adressData和adminAdressData组件传递给包含模板时,对于如何访问这些字段感到困惑。
{# @var address \AppBundle\Entity\AdressData #}
{#{{ form_row(address) }}#}
<div class=" row">
<div class="col-sm-6">
{{ form_row(address.country) }}
</div>
<div class="col-sm-6">
{{ form_row(address.city) }}
</div>
</div>
<div class=" row">
{{ form_row(address.street) }}
</div>
POST EDIT:
解决方案是
{% embed ":addressdata/forms:filter.html.twig" with{"address":form.adressData[0]} %}{% endembed %}
我不知道为什么因为只有一个表格。