Я использовал Sylius 1.0.0-beta1
и портировал EntityFilter
от dev-master
из-за отсутствия этой функциональности в последней стабильной версии. Все работает отлично, но есть ли способ выбрать не все ресурсы, а только часть из них? Мне нужно сделать фильтр, основанный на таксономиях. У меня есть несколько таксонов, которые являются названиями городов, и все они имеют родительский таксон «Город» (код: город). Поэтому я хочу отобразить в этом фильтре всех детей городского таксона.Sylius EntityFilter выбор из части ресурсов
Моя конфигурация сетки показано ниже:
sylius_grid:
grids:
smartbyte_admin_products_by_event_archetype:
...
filters:
...
taxon:
type: app_entity
options:
fields: [taxon.id]
class: "%sylius.model.taxon.class%"
city:
type: app_taxon
Первый фильтр из работ конфигурации и фильтров тонкой, за исключением того, что принимает все таксонов, но мне нужно, чтобы показать только некоторые из них.
Я пробовал также сделать свой собственный фильтр (второй), но вместо текстового поля в поле фильтра я получаю текстовое поле. После docs я создал обычную. Вот моя попытка:
<?php
namespace SyliusExtensionBundle\Form\Type\Filter;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
final class TaxonFilterType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('city', EntityType::class, array(
'class' => 'Sylius\Component\Core\Model\Taxon',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('t')
->leftJoin('t.parent', 'taxon')
->where("taxon.code = 'city'");
},
'label' => 'Miasto',
'required' => false
));
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver
->setDefaults([
'label' => false,
'placeholder' => 'sylius.ui.all',
])
->setDefined('fields')
->setAllowedTypes('fields', 'array')
;
}
/**
* {@inheritdoc}
*/
public function getName()
{
return 'sylius_grid_filter_taxon';
}
}
Конфигурация службы:
services:
sylius.grid_filter.entity:
class: SyliusExtensionBundle\Grid\Filter\EntityFilter
tags:
- { name: sylius.grid_filter, type: app_entity, form-type: SyliusExtensionBundle\Form\Type\Filter\EntityFilterType }
- { name: sylius.grid_filter, type: app_taxon, form-type: SyliusExtensionBundle\Form\Type\Filter\EntityFilterType }
sylius.form.type.grid_filter.entity:
class: SyliusExtensionBundle\Form\Type\Filter\EntityFilterType
tags:
- { name: form.type, alias: sylius_grid_filter_entity }
app.form.type.grid_filter.taxon:
class: SyliusExtensionBundle\Form\Type\Filter\TaxonFilterType
tags:
- { name: form.type, alias: sylius_grid_filter_taxon }
И, наконец, фильтр шаблоны:
sylius_grid:
templates:
filter:
app_entity: "SyliusExtensionBundle:Grid/Filter:entity.html.twig"
app_taxon: "SyliusExtensionBundle:Grid/Filter:entity.html.twig"
Пожалуйста, руководство мой, как я могу ограничить EntityFilter или как сделать работу пользовательских фильтров , Я потратил много часов на эту тему и не вижу, где ошибка.
Текущий эффект ниже:
EDIT:
Текущий TaxonFilterType согласно советы Paweł Jędrzejewski. Все еще не работает и не задает опцию полей в конфигурации.
<?php
/**
* Created by PhpStorm.
* User: Krzysztof Wędrowicz [email protected]
* Date: 23.01.17
* Time: 14:56
*/
namespace SyliusExtensionBundle\Form\Type\Filter;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
final class TaxonFilterType extends AbstractType {
public function getParent()
{
return EntityType::class;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver
->setDefaults([
'label' => false,
'placeholder' => 'sylius.ui.all',
'class' => 'Sylius\Component\Core\Model\Taxon',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('t')
->leftJoin('t.parent', 'taxon')
->where("taxon.code = 'city'")
;
},
'required' => false
])
->setDefined('fields')
->setAllowedTypes('fields', 'array')
;
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'sylius_grid_filter_city';
}
}
Спасибо за ваш ответ, но что-то еще сломано. Я получаю ошибку Twig. «Опция» поля «не существует», когда я добавлял options.fields как в фильтр сущности. Когда я удаляю его, он по-прежнему является сырым текстовым вводом. Я скопировал весь класс из вашего решения. – Starspire
Я обновил вопрос в соответствии с вашими советами. – Starspire