Type personnalisé : service non utilisé

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour !

Nous sommes deux à avoir planché dessus, et on n’arrive pas à trouver ce qui manque ou ce qui n’est pas correct… donc je tente d’avoir au moins une paire d’yeux externe.

Je suis en train de créer un type de formulaire personnalisé sur une application en Symfony 2.8. C’est une liste de valeurs qui initialement était en base de données, mais je suis en train de l’extérioriser dans un fichier de configuration, et du coup c’est extrêmement similaire à ce qu’explique la documentation. La différence que je vois, c’est qu’au lieu de mettre les paramètres directement dans parameters.yml, ils sont dans un autre fichier qui lui est importé.

Avec l’aide de debug:container, je vois que mon service est listé avec les bonnes informations, tout comme mon paramètre avec les bonnes valeurs. Je n’ai pas redéfini le service ailleurs, donc pas d’écrasement (et si c’était le cas, je pense que je n’aurais pas les bonnes informations avec debug:container).

Cependant, quand je tente d’utiliser mon type personnalisé, aucun paramètre ne lui est passé (erreur comme quoi il en attend un et rien n’est fourni). J’ai tenté de simplement changer le paramètre pour passer un service et changer l’erreur, mais ça n’a pas eu l’effet escompté — ça n’a pas même eu d’effet.

Evidemment, j’ai purgé le cache, redémarré Apache, je suis même allé jusqu’à mettre à jour ma version de PHP (passé de 7.1.20 à .23), et j’en suis toujours au même point.

Est-ce que quelqu’un verrait ce qui m’a échappé ?

Merci d’avance.

Type error: Too few arguments to function Mon\BôBundle\Form\ActivityTypeType::__construct(), 0 passed

parameters:
  activity.types:
    edition:
      icon: "fa-edit"
    creation:
      icon: "fa-plus-square"
    removal:
      icon: "fa-trash"
activityTpes.yml
imports:
  - { resource: "activityTypes.yml" }

services:
  monbo.form.activity_type:
    class: "Mon\\BôBundle\\Form\\ActityTypeType"
    arguments:
      - "%activity.types%"
    tags:
      - { name: "form.type" }
services.yml
<?php
namespace Mon\BôBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ActivityTypeType extends AbstractType
{
    private $activityTypes;

    public function __construct(array $activityTypes)
    {
        $this->activityTypes = $activityTypes;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'choices' => $this->activityTypes,
            'choice_name' => 'identifier',
        ));
    }

    public function getParent()
    {
        return ChoiceType::class;
    }
}
\Mon\BôBundle\Form\ActivityTypeType
            ->add('type', \Mon\BôBundle\Form\ActivityTypeType::class, array(
                'required' => false,
                'choice_label' => 'icon',
//                 'choice_translation_domain' => null,
            ))
La seule utilisation actuelle. J’ai aussi testé de mettre uniquement le nom de la classe sans le namespace — le formulaire utilisant mon ActivityTypeType partage le même espace de noms

Evitez qu’on vous dise de les lire : FAQ PHP et SymfonyTutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

Merci. La seule différence est qu’il définit un alias pour le type de champ (ce qui n’est plus conseillé pour Symfony 2.8 et ne fonctionne plus dès Symfony 3, si je me souviens bien), au même titre que l’étaient les types sous forme de texte au début de Symfony 2. Je verrai pour tester, mais j’aimerais cependant relever que j’ai deux autres champs créés de manière similaire à celui qui ne fonctionne pas, je les utilise de la même manière, et évidemment là je n’ai pas de souci…

Ces autres types sont d’ailleurs définis dans le même fichier de services, j’ai copié-collé une des définitions et ai modifié la classe, l’identifiant du service et le paramètre à passer.

Édité par Ymox

Evitez qu’on vous dise de les lire : FAQ PHP et SymfonyTutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

Voici.

<?php

namespace Mon\BôBundle\Form;

use Mon\BôBundle\Form\DataTransformer\IdToPersonTransformer;
use Doctrine\ORM\EntityManager;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;

/**
 * @see \Mon\BôBundle\Form\DataTransformer\IdToPersonTransformer
 * @see @Monbo\Form\person-autocomplete.html.twig
 */
class PersonAutocompleteType extends AbstractType
{
    /**
     * @var EntityManager
     */
    protected $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addViewTransformer(new IdToPersonTransformer($this->em));
    }

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        if (($person = $form->getData()) instanceof \Mon\TrèBôBundle\Entity\Person) {
            $view->vars['attr']['data-id'] = $person->getId();
        }
    }

    public function getParent()
    {
        return TextType::class;
    }
}
Un exemple fonctionnel
services:
  monbo.form.type.personAutocomplete:
    class: "Mon\\BôBundle\\Form\\PersonAutocompleteType"
    arguments:
      - "@doctrine.orm.default_entity_manager"
    tags:
      - { name: "form.type" }
La déclaration du service (quelques lignes au-dessus de ce qui ne fonctionne pas)
->add('person', PersonAutocompleteType::class, array(
    'required' => false,
))
L’utilisation dans un autre formulaire

Alors certes, je n’utilise pas le paramètre qui lui est passé (c’est un reliquat d’une autre version du type), mais cependant le paramètre est passé.

Evitez qu’on vous dise de les lire : FAQ PHP et SymfonyTutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Cette réponse a aidé l’auteur du sujet

Salut,

Je vais peut-être dire quelque chose de bête, mais est-il possible que le souci vienne du nom de ta classe ?
Autrement dit, le fait que ta classe contienne le mot « Type » ne pose-t-il pas souci dans le traitement que Symfony fait ?

+0 -0
Auteur du sujet

Hé ben pas loin !

Si je mets l’identifiant ….activity_type, ça ne passe pas. Mais si je colle au nom de la classe, donc ….activity_type_type, , ça fonctionne !  o_O

Donc dans Symfony 2.8, il devait déjà y avoir des éléments pour l'autowiring

Evitez qu’on vous dise de les lire : FAQ PHP et SymfonyTutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte