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:
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';
}
}
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
J'ai mis à jour la question selon vos conseils. – Starspire