Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-02-2013 20:15:27

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

[Résolu] ]Bind d'un formulaire avec Doctrine

Bonjour,

J'ai quelque souci avec Doctrine. J'ai un formulaire, en mode édition. Voici le code :

Code:

[lang=php]
$articleService = $this->getServiceLocator()->get('Application\Service\ArticleService');
        $article = $articleService->getById($id);

        $form->bind($article);
        $form->get('submit')->setValue('Edit');

        if ($this->request->isPost()) {
            $post = $this->request->getPost();

            $form->setData($post);

            if ($form->isValid()) {

Dans mon formulaire aucun champ n'est pré-rempli.

Voici le formulaire :

Code:

[lang=php]namespace Application\Form;

use Zend\Form\Form;
use Zend\Form\Element;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Stdlib\Hydrator\ClassMethods;
use Application\Entity\Article;

class ArticleForm extends Form implements InputFilterProviderInterface
{

    public function __construct()
    {
        parent::__construct('article-form');
        $this->setAttribute('method', 'post');
        $this->setAttribute('class', 'form-horizontal');
        $this->setHydrator(new ClassMethods(false))
            ->setObject(new Article());

Si je fais un dump de $article j'obtiens ceci :

Code:

[lang=php]object(Application\Entity\Article)
  protected 'id' => int 9
  protected 'author' => 
    object(DoctrineORMModule\Proxy\__CG__\ZfcUserDoctrineORM\Entity\User)
      private '_entityPersister' => 
        object(Doctrine\ORM\Persisters\BasicEntityPersister)
          protected '_class' => 
            object(Doctrine\ORM\Mapping\ClassMetadata)
              ...
          protected '_conn' => 
            object(Doctrine\DBAL\Connection)
              ...
          protected '_platform' => 
            object(Doctrine\DBAL\Platforms\MySqlPlatform)
              ...
          protected '_em' => 
            object(Doctrine\ORM\EntityManager)
              ...
          protected '_queuedInserts' => 
            array (size=0)
              ...
          protected '_rsm' => null
          protected '_columnTypes' => 
            array (size=0)
              ...
          protected 'quotedColumns' => 
            array (size=0)
              ...
          private '_insertSql' => null
          protected '_selectColumnListSql' => null
          protected '_selectJoinSql' => null
          protected '_sqlAliasCounter' => int 0
          protected '_sqlTableAliases' => 
            array (size=0)
              ...
          protected 'quoteStrategy' => 
            object(Doctrine\ORM\Mapping\DefaultQuoteStrategy)
              ...
      private '_identifier' => 
        array (size=1)
          'id' => string '1' (length=1)
      public '__isInitialized__' => boolean false
      protected 'id' => null
      protected 'username' => null
      protected 'email' => null
      protected 'displayName' => null
      protected 'password' => null
      protected 'state' => null

On voit que pour author ces attribues sont tous null, et doctrine me génère un proxy pour zfcuser.
Est-ce que c'est le proxy qui bloque le binding du formulaire ?
Pourquoi Doctrine me génère un un fichier proxy ?
J'ai lu que c’était pas bien qu'il génère ca.

Merci d'avance, j'espère avoir été un minimum claire

Dernière modification par alien7 (12-02-2013 13:56:10)


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#2 10-02-2013 21:44:18

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: [Résolu] ]Bind d'un formulaire avec Doctrine

Résolu en partie, le binding marche, en fait il me manquait les getters. En fait je n'ai pas écrit les getters et les setters dans mon Entity, j'utilise __get et __set plutot. Mais apparemment il faut les getters et les setters.

Il me reste le problème du fichier proxy généré par Doctrine pour l'entity Zfcuser. En fait je ne comprends pas vraiment ce que fait ce fichier et dans quel cas il est généré.

Dernière modification par alien7 (11-02-2013 16:14:24)


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#3 11-02-2013 22:57:35

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [Résolu] ]Bind d'un formulaire avec Doctrine

Salut,

Effectivement tu utilises l'hydrateur ClassMethods qui repose sur les getters et les setters. Par ailleurs, je te conseille d'utiliser l'hydrateur de DoctrineModule qui est bien plus puissant dès que les relations entrent en jeu.

Pour le proxy c'est tout à fait normal. En fait, quand tu récupères un objet via Doctrine, il va automatiquement charger tous les champs simples (Date, string...), par contre pour les associations (OneToOne, ManyToOne...), pour éviter de faire plusieurs requêtes inutiles, charge à la place un proxy. Un proxy est un objet qui hérite de l'objet de base (en l'occurrence dans ton exemple, DoctrineORMModule\Proxy\__CG__\ZfcUserDoctrineORM\Entity\User hérite de User).

C'est ce qu'on appelle le lazy-loading. Par contre, lorsque tu feras, par exemple : $article->getAuthor()->getName(), là tu tentes d'accéder à une propriété d'un auteur. Par conséquent, Doctrine va à ce moment là initialiser le proxy en effectuant une requête en base pour récupérer l'auteur. C'est totalement transparent pour l'utilisateur final. Evidemment, tu peux avoir envoie de TOUJOURS charger l'auteur en chargeant l'article, parce que tu sais que tu vas toujours accéder à l'auteur quand tu as un article (en gros, tu veux faire la jointure). Evidemment Doctrine le permet via le DQL, ou avec des annotations.

Hors ligne

 

#4 12-02-2013 13:55:25

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: [Résolu] ]Bind d'un formulaire avec Doctrine

Merci Bakura pour ces explications smile

Et j'utilise maintenant l'hydrateur de DoctrineModule

Voilà Merci encore


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages