Symfony 在细枝模板中呈现用户定义的筛选器类型时出现问题
使用LexikFilterBundle类型,我在主窗体上创建了一个子窗体,以便:Symfony 在细枝模板中呈现用户定义的筛选器类型时出现问题,symfony,twig,symfony-forms,Symfony,Twig,Symfony Forms,使用LexikFilterBundle类型,我在主窗体上创建了一个子窗体,以便: ->add('adressData', CollectionAdapterFilterType::class, array( 'entry_type' => AddressFilterType::class, 'add_shared' => function (FilterBuilderExecuterInterface $qbe) {
->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()这样的方法例如,当我将主窗体的AddressData和AdminAddressData组件传递给包含模板时,我完全不知道如何访问这些字段
{# @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>
我不知道为什么,因为应该只有一个表单。我不知道
LexikFormFilterBundle
,但它看起来像form.addressdata
,您要传递给filter.html.twig
asaddress
变量是CollectionAdapterFilterType
的实例,而不是AddressFilterType
我想。我正在使用Idea/PHPStorm。你能告诉我如何调试细枝模板中的内容吗?只需使用dump()?dump()显示两个FormView并扩展传递的第一个表单:FormView{3827▼ +变量:数组:24[▶] +父对象:FormView{#2509▶} +子:数组:1[▼ 0=>FormView{#3836▼ +变量:数组:24[▶] +父级:FormView{#3827}+子级:数组:3[▼ “街道”=>FormView{#3840▶} “城市”=>FormView{#3843▶} “国家”=>FormView{#3845▶} ] -rendered:false}]-rendered:false}所以,多亏了你的提示,我只传入了adressData[0]。我不知道为什么会这样,但现在它可以工作了。谢谢你。这是因为CollectionAdapterFilterType
处理了条目类型的集合,而您的情况就是AddressFilterType
。
{% embed ":addressdata/forms:filter.html.twig" with{"address":form.adressData[0]} %}{% endembed %}