Bonjour,
J'ai un problème que je n'arrive pas à résoudre.
Pour faire court, j'ai un produit que je souhaite afficher. Quand j'affiche ce produit j'affiche un formulaire que j'appelle par PanierType.php.
Sur ce formulaire j'ai besoin de récupérer les tailles de ce produit dans la table SizeProduct.
Pour cela je fais appelle à un repository. Dans mon repository j'ai la fonction suivante

public function findByProduct($product_id)
        {

    $qb= $this->createQueryBuilder('s')
           ->where('s.product= :product_id')
           ->setParameter('product_id', $product_id);
           return $qb;
        }

La variable $product_id est récupéré dans mon form type

private $product_id;
    public function __construct($product_id=null) {
        $this->product_id = $product_id;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $product_id  = $this->product_id;
        $builder

 ->add('size', EntityType::class, array(
            'label' => 'Taille',
            'class' => 'AppBundle:SizeProduct',
            'expanded'=>false,
            'choice_label'=>'size',
            'query_builder' => function(EntityRepository $repo) use($product_id) {
                return $repo->findByProduct($product_id);
            }
            ))

            }

Sauf que mon repository ne reconnait pas la variable

Quand je fais un dump de ce qu'il me retourne, il met la variable $product_id à null.

De plus quand je force la valeur de mon $product_id dans mon repository j'ai le message d'erreur suivant:

Catchable Fatal Error: Object of class Proxies__CG__\AppBundle\Entity\Size could not be converted to string

Est-ce que cela vient du faite que mon entité SizeProduct récupère ses sizes avec les id de la table size?

3 réponses


Salut

C'est pas la bonne méthode pour passer des infos à ton FormType. Surtout pas par le constructeur.
Tu peux soit le passer par les options du formulaire lors du $this->createForm(...), soit passer à ton formulaire un objet qui dispose de ta variable product_id.

Pour ce qui est de ta fatal, il faudrait mettre un 'choice_label' => 'libelle', (j'ai cru voir un truc du genre dans un autre de tes posts) ou mettre un __toString() dans ton objet SizeProduct.

1- La variable $product_id, je pense le récupérer avec la création de mon formulaire dans mon controlleur.

$form_panier = $this->createForm(PanierType::class, new Panier($produit_id), [
      'action' =>  $this->generateUrl('add_panier', array('product_id' => $product_id)),
    ]);

Mais à priori ça ne fonctionne pas.

2-Je n'ai pas de libelle dans ma table SizeProduct. Le libelle vient de ma table size. Mon sizeProduct va chercher les sizes dans la tale size

J'ai trouvé mon erreur pour la gestion de la variable $product_id.
mais j'ai toujours cette erreur convert to string.
Et en retour de mon repository je n'ai pas de résultat.

SizeProductRepository.php on line 25:
QueryBuilder {#924 ▼
  -_em: EntityManager {#243 …11}
  -_dqlParts: array:9 [▼
    "distinct" => false
    "select" => array:1 [▶]
    "from" => array:1 [▼
      0 => From {#923 ▼
        #from: "AppBundle\Entity\SizeProduct"
        #alias: "s"
        #indexBy: null
      }
    ]
    "join" => []
    "set" => []
    "where" => Andx {#915 ▶}
    "groupBy" => []
    "having" => null
    "orderBy" => []
  ]
  -_type: 0
  -_state: 0
  -_dql: null
  -parameters: ArrayCollection {#821 ▼
    -elements: array:1 [▼
      0 => Parameter {#914 ▼
        -name: "product_id"
        -value: 3
        -type: "integer"
      }
    ]
  }
  -_firstResult: null
  -_maxResults: null
  -joinRootAliases: []
  #cacheable: false
  #cacheRegion: null
  #cacheMode: null
  #lifetime: 0
}

voici le dump de mon $qb

<?php

namespace AppBundle\Repository;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
/**
 * SizeProductRepository
 *
 */
class SizeProductRepository extends \Doctrine\ORM\EntityRepository
{

        public function findByProduct($product_id)
        {

    $qb= $this->createQueryBuilder('s')
           ->where('s.product= :product_id')
           ->setParameter('product_id', $product_id);

dump($qb);exit();
           return $qb;

        }

}