IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[Form] Entity Field non préchargé [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut [Form] Entity Field non préchargé
    Bonjour,

    Dans un formulaire, jai un champ de type entity.
    Le pobleme étant que cette entité tape dans une table de plusieurs centaines de milliers de lignes.

    Je ne voudrais donc pas que symfony charge toutes les données de cette entité à l'affichage. (je génere les champs en ajax manuellement)

    J'ai tnté de pallier à cela n personnalisant le query_builder pour limitr le nombre de résultat récupéré.
    Mais si on choisi d'ajouter une element qui ne fait pas parti des éléments récupérés par le query builder, la valeur n'est pas considérée comme valide.

    Est ce possible ?
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    Dans ce type de cas tu peux utiliser ce Bundle:
    https://github.com/Gregwar/FormBundle

    Il propose un type de champ "entity_id" qu'il te faudra rempli coté client (avec un module d'autocomplétion par exemple) avec l'id de l'entité.
    A la soumission du formulaire il se charge de transformer cet id en entité et de la valider.

  3. #3
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Bonjour,

    Cela semble en effet pouvoir résoudre mon probleme.

    Cependant, je rencontre ce message d'erreur lors de son utilisation :
    Fatal error: Declaration of Gregwar\FormBundle\Type\EntityIdType::buildForm() must be compatible with that of Symfony\Component\Form\FormTypeInterface::buildForm()
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Il y a un conflit de version entre ta version de SF et la version du GregwarFormBundle

    la signature de la méthode buildForm a changé entre la version 2.0 et 2.1
    2.0 => https://github.com/symfony/symfony/b...eInterface.php
    2.1 => https://github.com/symfony/symfony/b...eInterface.php
    voir le change log https://github.com/symfony/symfony/b...UPGRADE-2.1.md

    si tu es en symfony 2.0 utilise la branche taggé "v2.0" du GregwarEntityBundle
    v2.0 => https://github.com/Gregwar/FormBundl...tityIdType.php
    master => https://github.com/Gregwar/FormBundl...tityIdType.php

  5. #5
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Merci pour la réponse.

    Je suis effectivement en symfony 2.0
    J'ai donc récupéré la branche 2.0 du bundle.

    Mais je me retrouve avec une nouvelle erreur :

    Entities passed to the choice field must be managed
    Pour info, le code qui instancie le formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $lierBeneficiaire = new LierBeneficiaire();
    $form_lier = $this->createForm(new LierBeneficiaireType(), $lierBeneficiaire);
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Tu peux essayer cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $lierBeneficiaire = new LierBeneficiaire();
    $entityManager->persist($lierBeneficiaire);
    $form_lier = $this->createForm(new LierBeneficiaireType(), $lierBeneficiaire);
    mais sinon tu n'es pas obligé d'instancier toi-même l'entité, si ton form a une option data_class il créera lui-même l'entité de la bonne classe.
    http://symfony.com/doc/2.0/book/form...rms-data-class

    mais je pense que l'erreur ne vient pas directement de ce code, mais de l'endroit ou tu as appelé le "entity_id".
    Est-ce que dans le constructeur de LierBeneficiaire tu instancies également d'autres objets et notamment celui que tu lis au champ "entity_id"?

  7. #7
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    LierBeneficiaire() est un modele de formulaire (Form\Model\LierBeneficiaire), pas un entité.
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    la signature de la méthode createForm attend en premier argument un Type de form et en deuxième (optionellement) les données.
    https://github.com/symfony/symfony/b...ller.php#LC161

    Pourquoi passer 2 types de Form?


    [edit] erratum, j'avais pas compris ta réponse

    L'erreur indique que l'on passe une entité non managé dans l'entity_id type, probablement une entité qui vient d'être crée mais pas persisté.
    Cela est-il possible quelque part dans ton code?

    note:
    LierBeneficiaire() est un modele de formulaire (Form\Model\LierBeneficiaire), pas un entité
    ça n'empèche pas d'utiliser l'option data_class

  9. #9
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Le bloc qui pose problme dans mon FormType :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $builder->add('beneficiairesAssocies', 'entity_id', array(
                    'class' => '***:Metier\Beneficiaire',
                    'required' => false,
                    'multiple' => true,
                    'property' => 'nomOuDenomination',
                    'property_path' => 'beneficiairesAssocies',
                    'label' => 'Bénéficiaires',
                    'query_builder' => function(BeneficiaireRepository $er) {
                                            $prefix = 'tab';
                                            $query = $er->createQueryBuilder($prefix)->setMaxResults(1);//->where($prefix.'.id = '.$id);
                                            //$er->checkActif($prefix, $query, true);
                                            return $query;
                                        },
                    'error_bubbling' => true
            ));
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  10. #10
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    J'ai solutionné mon problem en bidouillant un peu :

    Controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // On récupère les id sélectionnés depuis la request
    $allowed_ids = array(0);
    $request_beneficiaire = $request->request->get('FormName', false);
    if ($request_beneficiaire and isset($request_beneficiaire['FieldName']))
    {
        $allowed_ids = $request_beneficiaire['FieldName'];
    }
     
    // Formulaire de liaison
    $lierBeneficiaire = new LierBeneficiaire();
    $form_lier = $this->createForm(new LierBeneficiaireType($allowed_ids), $lierBeneficiaire);
    FormType
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    class LierBeneficiaireType extends AbstractType {
     
        private $allowed_ids;
     
        /**
         * 
         * @param array $allowed_ids
         */
        public function __construct($allowed_ids = null)
        {
            $this->allowed_ids = $allowed_ids;
        }
     
        public function buildForm(FormBuilder $builder, array $options)
        {
            $allowed_ids = $this->allowed_ids;
     
            $builder->add('beneficiairesAssocies', 'entity', array(
                    'class' => '***:Metier\Beneficiaire',
                    'required' => true,
                    'multiple' => true,
                    'property' => 'nomOuDenomination',
                    'property_path' => 'beneficiairesAssocies',
                    'label' => 'Bénéficiaires',
                    'query_builder' => function(BeneficiaireRepository $er) use ($allowed_ids) {
                                            return $er->createQueryBuilder('b')->andWhere('b.id IN ('.implode(',', $allowed_ids).')');
                                        },
                    'error_bubbling' => true
            ));
     
            // ...
     
        }
     
        // ...
    }
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] [Form] Réaliser un simple formulaire Entity Field Type
    Par Lex92 dans le forum Symfony
    Réponses: 10
    Dernier message: 25/09/2012, 12h21
  2. [Forms 6i] Bloc non basé et navigation
    Par macben dans le forum Oracle
    Réponses: 3
    Dernier message: 13/01/2006, 12h27
  3. [FORMS][6i] Erreur non explicitée
    Par badara1 dans le forum Forms
    Réponses: 15
    Dernier message: 13/05/2005, 10h56
  4. [FORMS] Champ image non basé
    Par macharius dans le forum Forms
    Réponses: 5
    Dernier message: 08/03/2005, 17h04
  5. Input File, Request.form Firefox, Chemin non spécifié
    Par Phenolphtaleine dans le forum ASP
    Réponses: 6
    Dernier message: 13/01/2005, 09h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo