2017-01-24 5 views
0

Я использовал 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 или как сделать работу пользовательских фильтров , Я потратил много часов на эту тему и не вижу, где ошибка.

Текущий эффект ниже:

enter image description here

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'; 
    } 
} 

ответ

1

В настоящее время это невозможно сделать путем конфигурации. Я добавлю его в отставание, но не уверен, когда его можно будет реализовать. При этом ваш собственный фильтр - хорошая идея. Вы должны сделать небольшое изменение, и оно должно работать: Тип формы должен иметь EntityType::class в getParent() вместо использования метода buildForm. И построитель настраиваемых запросов должен быть настроен в методе configureOptions, тогда он отобразит правильное поле. Вот полный код, который должен работать:

<?php 

namespace AcmeExtension\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 CityFilterType 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'; 
    } 
} 
+0

Спасибо за ваш ответ, но что-то еще сломано. Я получаю ошибку Twig. «Опция» поля «не существует», когда я добавлял options.fields как в фильтр сущности. Когда я удаляю его, он по-прежнему является сырым текстовым вводом. Я скопировал весь класс из вашего решения. – Starspire

+0

Я обновил вопрос в соответствии с вашими советами. – Starspire