Bonjour,

je débute avec symfony (4) et je bloque sur l'enregistrement d'un formulaire.
Voici le code du formulaire:

$builder
            ->add('name', TextType::class, array('label' => 'Nom de la catégorie : ')) 
            ->add('parent', EntityType::class, array(
                // looks for choices from this entity
                'class' => Category::class,
                 'required' => false,
                 'query_builder' => function (EntityRepository $er) {
                        return $er->createQueryBuilder('u')
                             ->where('u.parent = 1')
                            ->orderBy('u.name', 'ASC');
                    },
                 'label_format' => 'Catégorie parent',
                'choice_label' => 'name',
                 'placeholder' => 'Aucune',
                 'choice_value'  => 'id',
                 'empty_data' => null

            )) $builder
            ->add('name', TextType::class, array('label' => 'Nom de la catégorie : ')) 
            ->add('parent', EntityType::class, array(
                // looks for choices from this entity
                'class' => Category::class,
                 'required' => false,
                 'query_builder' => function (EntityRepository $er) {
                        return $er->createQueryBuilder('u')
                             ->where('u.parent = 1')
                            ->orderBy('u.name', 'ASC');
                    },
                 'label_format' => 'Catégorie parent',
                'choice_label' => 'name',
                 'placeholder' => 'Aucune',
                 'choice_value'  => 'id',
                 'empty_data' => null

            ))

             ->add('title', TextType::class, array('label' => 'Title SEO : ')) 
            ->add('metadescription', TextareaType::class, array(
            'label' => 'Description SEO : ',
            'attr' => array('class' => 'tinymce'),
            )) 
            ->add('submit', SubmitType::class, ['label'=>'Envoyer', 'attr'=>['class'=>'btn-primary btn-block']])
        ;

Celui-ci s'affiche correctement.

Mon problème: J'ai l'erreur suivante:
Expected argument of type "integer", "App\Entity\Category" given.

Je comprend que l'on attend un integer mais c'est ce que je pense envoye, non?:

<select id="category_parent" name="category[parent]" class="form-control">
  <option value="">Aucune</option>
  <option value="1">catégorie 1</option>
  <option value="3">categorie 2</option>
</select>

Voilà l'élément dans mon entité:

 /**
     * @ORM\Column(name="parent", type="integer",options={"default":0})
     */
     private $parent;

Merci beaucoup de votre aide

9 réponses


Digivia
Réponse acceptée

Ca vient des données existantes en base. Il faut que tu vides ta base (supression des tables) et ensuite que tu les crée à nouveau (doctrine:schema:update --force), ou que tu fasses la requete de modif de base en désactivant les triggers. Ensuite ça fonctionnera correctement.

Hello,

Cela vient en effet du mapping de ton entity. Dans ton formulaire tu lui dis de se baser sur l'entity Category pour faire une liste du parent.
Le type que tu envois est donc une entity, d'où le fait qu'il attend une entity Category et non un integer.

L'idée serait de faire ceci :

/**
   * @ORM\ManyToOne(targetEntity="App\Entity\Category")
   * @ORM\JoinColumn(nullable=false)
   */
  private $parent;

N'oublie pas de mettre à jour ta base ;)

Guihom
Auteur

Merci de ton retour. Mais lorsque je met a jour ma base, j'ai l'erreur suivante: Cannot add or update a child row: a foreign key constraint fails [...] Forieign key ('parent_id') references 'Category' (id)

L'erreur provient-elle du fait que les catégories parents et enfants sont dans la meme table Category ? J'avais en tete de préciser les parents de chacune via un champs parent contenant l'ID du parent. Ne faudrait-il créer une table sous catégories ?

Guihom
Auteur

Ca fonctionne, merci beaucoup.
J'en profite pour poser une dernière question. Je souhaite créér un slug qui se base sur le nom de la catégorie créée dans ce formulaire.
Dans mon entity:

 /**
     * @Gedmo\Slug(fields={"name"},updatable=false)
     * @ORM\Column(length=128, unique=true)
     **/
    private $slug;

j'ai l'erreur suivante:
SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'slug' ne peut être vide (null)

merci

Les extensions doctrines sont-elles bien configurées?
Normalement ça se gère tout seul et ça fonctionne bien...
Notes qu'il ne faut pas de méthode setSlug() pour ton champ, cette méthode est prise en charge dans l'extension.

Guihom
Auteur

voila mes extensions Doctrine pour mon entité

namespace App\Entity;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;

et je n'ai effectivement pas de setSlug() . :-)

Pour la config je parlais plutôt de ton config.yml (ou équivalent en SF4). Tu passes par le bundle stof?

Guihom
Auteur

Merci de ton retour. Quel est l'equivalent de config.yml en SF4? j'ai toujours se probleme pourtant, tout semble en ordre :-(

Guihom
Auteur

OK... je viens de trouver la réponse ! il me manquait la configuration dans config/packages/stof_doctrine_extensions.yaml