2017-01-24 1 views
0

J'ai utilisé un Sylius 1.0.0-beta1 et porté EntityFilter de dev-master en raison du manque de cette fonctionnalité dans la dernière version stable. Tout fonctionne bien, mais est-il possible de choisir non pas toutes les ressources, mais seulement une partie d'entre elles? Je dois faire un filtre basé sur les taxonomies. J'ai quelques taxons qui sont des noms de villes et tous ont un taxon appelé City (code: city). Donc, je veux afficher dans ce filtre tous les enfants du taxon de la ville.Sylius EntityFilter choix d'une partie des ressources

Ma configuration de grille est présentée ci-dessous:

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 

Le premier filtre de travaux de configuration et filtres bien, sauf qu'il faut tous les taxons, mais je dois montrer que quelques-uns.

J'ai aussi essayé de créer mon propre filtre (le second) mais j'ai un champ de texte au lieu du champ d'entité dans le filtre. Suite à la docs j'ai créé un personnalisé. Voici mon essai:

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

configuration de service:

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 } 

Et enfin des modèles filtre:

sylius_grid: 
    templates: 
     filter: 
      app_entity: "SyliusExtensionBundle:Grid/Filter:entity.html.twig" 
      app_taxon: "SyliusExtensionBundle:Grid/Filter:entity.html.twig" 

S'il vous plaît guider mon comment puis-je limiter EntityFilter ou comment faire fonctionner le filtre personnalisé . J'ai passé de nombreuses heures sur ce sujet et je ne vois pas où est l'erreur.

effet actuel ci-dessous:

enter image description here

EDIT:

TaxonFilterType actuel selon des conseils Paweł Jędrzejewski. Ne fonctionne toujours pas et ne détecte pas les champs dans la configuration.

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

Répondre

1

Actuellement, ce n'est pas possible via la configuration. Je vais l'ajouter à l'arriéré, mais je ne sais pas quand il pourra être mis en œuvre. Cela étant dit, votre filtre personnalisé est une bonne idée. Vous devriez faire un petit changement et cela devrait fonctionner: Le type de formulaire devrait avoir EntityType::class dans getParent() au lieu d'utiliser la méthode buildForm. Et le générateur de requête personnalisé doit être configuré dans la méthode configureOptions, puis il rendra un champ approprié. Voici le code complet qui devrait fonctionner:

<?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

Merci pour votre réponse, mais quelque chose est toujours cassé. Je reçois l'erreur Twig "L'option" les champs "n'existe pas" quand j'ai ajouté options.fields comme dans le filtre d'entité. Lorsque je l'ai supprimé, il s'agit toujours d'une entrée de texte brut. J'ai copié toute la classe à partir de votre solution. – Starspire

+0

J'ai mis à jour la question selon vos conseils. – Starspire