- Ymox,
Bonjour tout le monde !
Afin de ne pas trop me casser le c*l, j'ai créé une extension de type de formulaire afin de pouvoir utiliser jQuery.select2 lorsque j'utilise EntityType. Le code de cette extension est fourni ci-après.
J'ai donc pris la documentation, j'ai repris plusieurs fois les étapes, j'ai vérifié que mon service n'était pas surchargé par une clé malencontreusement copiée-collée pour un autre service, mais rien qui ne me soit apparu.
Le plus déroutant dans l'histoire, c'est que c'est plus du niveau de "ce service ne se définit pas" qu'autre chose, parce que :
- mon fichier comprend trois autres déclarations qui sont bien prises en compte ;
- des affichages de débogage dans la classe ne sont pas visibles ;
- une erreur dans le FQCN de la classe pour la définition ne change absolument rien (et surtout ne me génère pas d'erreur).
J'ai pensé en premier lieu au cache, mais même une suppression bourrine ne change rien. La manifestation la plus claire de ce que l'extension n'existe pas aux yeux de Symfony est que si je tente d'ajouter une option de champ telle que définie dans mon extension, elle n'est pas reconnue.
Est-ce que c'est déjà eu arrivé à quelqu'un ?
Merci d'avance
Edit
En date d'édition et avec Symfony 3.1.3, le comportement est toujours présent.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <?php namespace My\WonderfulBundle\Form\Extension; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Bridge\Doctrine\Form\Type\EntityType; class EntitySelect2Extension extends AbstractTypeExtension { protected $router; public function __construct($router) { $this->router = $router; } public function getExtendedType() { return EntityType::class; } public function configureOptions(OptionsResolver $resolver) { $resolver ->setDefined('search_route') ->setAllowedTypes('search_route', 'string'); $resolver ->setDefined('search_route_params') ->setAllowedTypes('search_route_params', 'array') ->setDefault('search_route_params', array()); $resolver ->setDefined('additional_search_data') ->setAllowedTypes('additional_search_data', 'array'); $resolver->setDefaults(array( 'choices' => array(), )); } public function finishView(FormView $view, FormInterface $form, array $options) { if (empty($options['search_route'])) { return; } $attr = &$view->vars['attr']; if (empty($attr['class'])) { $attr['class'] = 'select2'; } else if (is_string($attr['class'])) { $attr['class'] .= ' select2'; } else if (is_array($attr['class'])) { $attr['class'][] = 'select2'; } $attr['data-uri'] = $this->router->generate($options['search_route'], $options['search_route_params']); if (!empty($options['additional_search_data'])) { $attr['data-additional'] = json_encode($options['additional_search_data']); } } } |
EntitySelect2Extension.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | services: # my_wonderful.example: # class: My\WonderfulBundle\Example # arguments: ["@service_id", "plain_value", %parameter%] my_wonderful.duration.type: class: My\WonderfulBundle\Form\Type\DurationType arguments: - "%my_wonderful.duration.min_length%" tags: - { name: form.type } my_wonderful.search_entity.type: class: My\WonderfulBundle\Form\Type\SearchEntityType arguments: - "@doctrine.orm.entity_manager" - "@router.default" tags: - { name: form.type } my_wonderful.entity_select2.extension: class: My\WonderfulBundle\Form\Extension\EntitySelect2Extension arguments: - "@router.default" tags: - { name: form.extension, extended_type: Symfony\Bridge\Doctrine\Form\Type\EntityType } my_wonderful.twig.duration: class: My\WonderfulBundle\Twig\DurationExtension public: false arguments: - "%my_wonderful.duration.min_length%" tags: - { name: twig.extension } |
src/My/WonderfulBundle/Resources/config/services.yml