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 :

Problème de récupèration d'id dans le class form [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Points : 48
    Points
    48
    Par défaut Problème de récupèration d'id dans le class form
    Bonjour,

    Voila j'ai un petit problème, je cherche a récupérer un id dans ma class form.

    Voici mon form :

    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
     
    class CandidateDegreeForm extends BaseCandidateDegreeForm
    {
     
      public function configure()
      {
     
        $idD = $this->object->id;
        if($idD)
        {
          $q = Doctrine::getTable('CandidateDegree')->find($idD);
          $query = Doctrine::getTable('CandidateSchool')->createQuery('sc');
          $query->where('sc.candidate_id='.$q->getCandidateId());
     
          $this->widgetSchema['candidate_school_id'] = new sfWidgetFormDoctrineChoice(array('model' => 'CandidateSchool', 'add_empty' => true,'query'=>$query));
        }
      }
    }
    Au fait dans mon formulaire j'ai toujours un id candidat (que je connais d'avance). Et cette id que j'aimerai récupérer pour pouvoir faire une liste déroulante filtrer.

    La actuellement mon code me permet de récupérer l'id de l'enregistrement. Ce qui fonctionne en édition mais pas dans le cas d'un nouveau enregistrement.

    Alors si quelqu'un a déjà fait cela, je suis preneur.

    Au pire des cas, je vais devoir le faire en ajax.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Lors de la création d'un enregistrement, il n'y a pas d'Id dans l'objet data.

    L'Id n'"apparait" qu'une fois l'objet enregistré pour la première fois sur le disque. En effet, c'est la base de données qui, généralement, attribue l'Id. Et la base de donnée n'est pas au courant de l’existence potentiel de cet enregistrement avant qu'il ne soit créé (MySql avec une boule de cristal ? non, ceci n'existe pas).

    Tu as donc trois solutions (a priori) :

    Créer l'enregistrement avec un minimum de champ et après un premier enregistrement, renvoyer la page normal de modification avec le tout (l'id existera).

    Créer l'enregistrement et attribuer toi même l'Id à partir d'une procédure qui t'es propre. Plus d'attente mais le risque de perdre un numéro.

    Lors de la demande de création, commencer par créer l'enregistrement en base de données et l'afficher en modification (l'id existera). Par contre, il va falloir gérer ceux qui auront été abandonné entre la demande de création et la sauvegarde.

    Personnellement j'utilise la méthode 1 le plus souvent possible.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Points : 48
    Points
    48
    Par défaut
    Ok. Je me suis mal fait comprendre. Au fait dans ma table j'ai deux champs.
    Id = clef primaire (celui bien sur on ne le connait pas)
    idCandidat = mais celui on le connais via l'url.

    ET je voudrai faire un traitement avec l'idcandidat de le form. Donc je chercher a le récupérer. Je pense que je vais le faire avec la session.

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Donc tu as un paramètre transmis au contrôleur que tu voudrais faire passer à form pour qu'il l'utilise dans sa méthode configure() ?

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Points : 48
    Points
    48
    Par défaut
    Oui. Donc j'ai fait comme ceci :

    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
     
    class CandidateDegreeForm extends BaseCandidateDegreeForm
    {
     
      public function configure()
      {
     
        $user = sfContext::getInstance()->getUser();
        $idC = $user->getAttribute("idCandidate");
     
        $query = Doctrine::getTable('CandidateSchool')->createQuery('sc');
        $query->where('sc.candidate_id='.$idC);
     
        $this->widgetSchema['candidate_school_id'] = new sfWidgetFormDoctrineChoice(array('model' => 'CandidateSchool', 'add_empty' => true,'query'=>$query));
     
      }
    }
    Et ca fonctionne.

  6. #6
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    C'est une bonne solution. Elle n'a qu'un défaut, si une personne ouvre deux fenêtre dans une même session, il ne pourra avoir qu'une valeur pour idCandidate dans son paramètre. Mais il n'y a pas d'autre possibilité avec cette technique, qui, hors ce problème, est excellente.

    Par contre, tu ne devrais pas avoir de requête dans un form. Il serait bon de la déporter dans un objet du modèle, ici probablement : CandidateSchoolTable.class.php et d'y faire référence depuis le form. Ceci pour préserver la séparation des couches que l'objet form met déjà un peu à mal, rien ne sert de l'aider

  7. #7
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    J'approuve la solution de Michel par contre je me permet de rebondir sur sa remarque concernant la séparation des couches du modèle dont j'ai un exemple similaire.

    En quoi la solution suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //class EventForm
    $this->widgetSchema['brand_sales_assistant_id'] = new sfWidgetFormDoctrineChoice(array(
    			'model' => $this->getRelatedModelName('Profile'),
    			'method' => 'getUser',
    			'query' => Doctrine_Query::create()->select()->from('profile p')->where('p.entity_id = 2'),
    		));
    est-elle moins "bonne?"/"performante?" que cette solution ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //class EventForm
    $this->widgetSchema['brand_sales_assistant_id'] = new sfWidgetFormDoctrineChoice(array(
    			'model' => $this->getRelatedModelName('Profile'),
    			'method' => 'getUser',
    			'query' => $this->getObject()->getTable()->getBrandSalesAssistant() // <-- EDIT (diantre j'ai tapé mon getTable à l'aveuglette et ça fonctionne comme ça ? Mais elle est ou cette méthode getTable() Pas dans ma base de classe en tout cas !) 
    		));
    Est-ce uniquement pour le principe de dire que l'on place les choses à leur place (donc pour des questions de lisibilité, maintenance etc.) ? Ou est-ce qu'il y a des traitements supplémentaires ou des ralentissements par rapport à l'autre méthode ?

  8. #8
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    En fait la méthode la plus proche du MVC doit être imperceptiblement plus lente... Par contre elle présente l'avantage de plus de facilité à la maintenance, plus lisible. Et si tu modifies la structure de la table, tu n'a qu'un objet à modifier, le reste ne devrait pas être directement impacté.

    Pour ta méthode, si tu regardes ton objet tableBase tu vas voir qu'il est lui même enfant de sfDoctrineRecord, enfant de Doctrine_Record et qu'il y a un paquet de méthodes qui découlent de Doctrine_Record...

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

Discussions similaires

  1. [ZF 1.9] problème de récupération id URl dans la partie form
    Par hadesjack dans le forum Zend Framework
    Réponses: 10
    Dernier message: 29/09/2009, 16h23
  2. Réponses: 2
    Dernier message: 17/01/2007, 11h20
  3. Problème de récupération de tableau dans hash DBM
    Par siaoly dans le forum Langage
    Réponses: 1
    Dernier message: 01/05/2006, 16h00
  4. Problème de récupérations de données dans une table mysql
    Par Helpine dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 09/03/2006, 19h07
  5. [WSDL][Axis] Récupération de valeur dans des classes java
    Par cosmos38240 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 09/01/2006, 17h38

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