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

 PHP Discussion :

Inverser un affichage [1.x]


Sujet :

PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Points : 49
    Points
    49
    Par défaut Inverser un affichage
    Bonjour,

    Dans un template je parcours des commentaires pour les afficher à la suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($contact->getComment() as $comment):
    Pour info, le getComment() utilise une clé étrangère.

    Ils s'affichent du moins récent au plus récent. Comment modifier ce comportement? J'aimerai les afficher du plus récent au moins récent.

    Ça se fait au niveau de doctrine? On peut agir sur les getters?

    Merci,
    Laurent.

  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
    Dans un premier temps, tu devrais modifier dans ton shema.yml le nom de la relations "comment" en "comments" pour indiquer qu'il retourne plusieurs enregistrements. Ceci n'a rien d'obligatoire mais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($contact->getComments() as $comment):
    est plus parlant.

    En fait, il ne fait aucun tris dans le getters, tu as donc l'ordre de saisie. De plus, il va faire une requête pour chaque enregistrement, ce qui peut être pénalisant.

    Tu as deux solutions. Si tu es surs de toujours souhaiter avoir les comments trié d'une manière précise tu peux créer une méthode getComment(s)() dans ton objet du métier et hoplà ! Sauf que tu vas être très limité et perdre notamment la possibilité de tous récupérer dans une requête.

    Deuxième (et bien meilleur) solution, tu crées une requête liée dans ton contrôleur qui trie la table comments comme tu le souhaites. Tu n'as pas à modifier le code dans le template, si les données ont été récupérée à l'origine et si tu n'as pas suivi la mauvaise première solution tu récupères le tout dans le bon ordre.

    En prime, tu n'as qu'une requête quelque soit le nombre d'enregistrement du premier et deuxième niveau.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    Merci pour les deux solutions. La première a eu le mérite de me faire réfléchir au classes du model.

    Donc j'ai fait la deuxième solution en créant cette petite requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $this->comments= Doctrine_Query::create()
             ->select('c.comment')
             ->from('comment c')
             ->where("contactid = ?",$request->getParameter('id'))
             ->orderBy('created_at desc')
    	 ->execute();
    La boucle foreach est donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($comments as $comment)
    le reste étant inchangé.

    Citation Envoyé par Michel Rotta
    Dans un premier temps, tu devrais modifier dans ton shema.yml le nom de la relations "comment" en "comments" pour indiquer qu'il retourne plusieurs enregistrements.
    J'ai dû mal à maitriser les conséquences de la syntaxe. Par rapport à ce que vous m'avez dit, je mettrai un "s" à la colonne "comment" mais je n'en suis pas sûr...
    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
    # config/doctrine/schema.yml
    contact:
      actAs: { Timestampable: ~ }
      columns:
            prenom: { type: string(255), notnull: true }
            nom: { type: string(255), notnull: true }
            datenaissance: { type: string(255) }
            profession: { type: string(255) }
            adresse: { type: string(255) }
            codepostal: { type: string(255) }
            ville: { type: string(255) }
            email: { type: string(255), unique: true }
            remarque: { type: string(65535) }
            antecedent: { type: string(65535) }
            traitement: { type: string(65535) }
            traitement: { type: string(255) }
            mutuelle: { type: boolean, default: null }
            telfixe: { type: string(255) }
            telport: { type: string(255) }
     
    comment:
      actAs: { Timestampable: ~ }
      columns:
            contactid: { type: integer, notnull: true }
            comment: { type: string(65535), notnull: true }
      relations:
            contact: { onDelete: CASCADE, local: contactid, foreign: id }      
     
    admin:
      actAs: { Timestampable: ~ }
      columns:
            name: { type: string(255), notnull: true }
            password: { type: string(255), notnull: true }
    Mes erreurs sont:
    - Manque underscore (ex: codepostal)
    - un "s" à "comment" dans "columns"?
    - pas de tableName

    Vous voyez autre chose?
    Je n'ai que cette page qui m'aide (vers le début). Autre chose de plus détaillé dans vos cartons?

  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
    Schéma "à ma façon"

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    # config/doctrine/schema.yml
    contact:
      actAs:
        Timestampable: ~
      columns:
        prenom: 
          type:   string(255) // un peu long pour le nom, non ?
          notnull:   true
        nom: 
          type:   string(255)
          notnull:   true
        datenaissance:   date
        profession:   string(255)
        adresse:   string(255)
        codepostal: string(10) // code postal, 10 devrait suffire. un _ est possible, a toi choix
        ville:   string(255)
        email:   
          type: string(255)
          unique:   true 
          remarque: clob
          antecedent: clob
          traitement: clob
          traitement2: string(255) // ? deux champs traitement ?
          mutuelle: 
            type: boolean
            default: null
          tel_fixe:   string(255) // un peu long, non ? 40 serait suffisant.
          tel_port:    string(255)
     
    comment:
      actAs: 
        Timestampable: ~
      columns:
        contact_id: type: integer
        comment: string(clob) // de tête, le clob ne peut être null
      relations:
        contact: 
          onDelete: CASCADE
          foreignAlias: comments // Il est ici le s      
     
    admin: // Gagnera à être remplacé par le plugin sfDoctrineGuard
      actAs: 
        Timestampable: ~
      columns:
        name: 
          type: string(255),
          notnull: true
        password:  type: string(255)
    table_name n'a d'importance que si tu as une convention de nommage dans la base différente de celle des objets dans symfony


    Donc, dans le contrôleur (action : executeTruc() ) pour récupérer un "contact" et tous ces "comment"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $this->contact = doctrine_core::getTable('contact')->
              createQuery('c')->
              leftJoin('c.contents t')->
              where('c.id = ?', $leIdDuContact)->
              odrerBy('t.createdAt desc')->
              execute();
    dans le template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php echo $contact->getNom ?>
    <?php foreach $contact->getComments() as $comment : ?>
      <?php echo $comment->getCreatedAt() ?>
    ...
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    Waouw, merci beaucoup pour tout ça

    Citation Envoyé par Michel Rotta
    codepostal: string(10) // code postal, 10 devrait suffire. un _ est possible, a toi choix
    Je ne savais même pas qu'on pouvait avoir un espace.

    Encore merci!

  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
    Attention, il ne s'agit pas d'un espace mais d'un trait de soulignement.

    code_postal qui donnera un getCodePostal()
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    J'ai un message d'erreur lorsque j'exécute la jointure à l'aide de doctrine_core donné ci-dessus et je n'arrive à la corriger (je l'ai transformer en doctrine_query et j'ai le même problème).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $this->contact = doctrine_core::getTable('contact')->
              createQuery('c')->
              leftJoin('c.comment t')->
              where('c.id = ?', $request->getParameter('id'))->
              orderBy('t.created_at desc')->
              execute();
    Pour appel, je suis sur ma page principale et je clique sur un contact pour afficher ses commentaires.

    Et voilà le message d'erreur sur la page appellée:
    Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'Doctrine_Collection' does not have a method 'getComment' in ..\lib\vendor\symfony\lib\escaper\sfOutputEscaperObjectDecorator.class.php on line 64
    Pb de syntaxe doctrine? (car j'ai du mal avec la syntaxe doctrine...)

  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
    Ha, les "s" quant ils nous tiennent...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    leftJoin('c.comments t')->
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    Bonsoir,

    Malheureusement j'ai toujours la même erreur. Et j'ai essayé pas mal de trucs même hasardeux mais rien ne change.

    Entre temps j'ai modifié mon schema.yml comme discuté plus haut donc je le met. Ma table s'appelle comment alias comments et sa column est content (j'avais vu que vous aviez mis "content" plus haut - en espérant n'avoir pas mal déduit... ):
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #config/doctrine/schema.yml
    contact:
      actAs:
        Timestampable: ~
      columns:
        prenom: 
          type: string(50)
          notnull: true
        nom: 
          type: string(50)
          notnull: true
        datenaissance: date
        profession: string(50)
        adresse: string(100)
        code_postal: string(10)
        ville: string(50)
        email:   
          type: string(255)
          unique: true 
        remarque: string(10000)
        antecedent: string(10000)
        traitement: string(10000)
        mutuelle: 
          type: boolean
          default: null
        tel_fixe: string(40)
        tel_port: string(40)
     
    comment:
      actAs: 
        Timestampable: ~
      columns:
        contact_id:
          type: integer
        content: string(20000)
      relations:
        contact: 
          onDelete: CASCADE
          foreignAlias: comments      
     
    admin:
      actAs: 
        Timestampable: ~
      columns:
        name: 
          type: string(50)
          notnull: true
        password:  type: string(50)
    Et la requête de l'action:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $this->contact = doctrine_core::getTable('contact')->
              createQuery('c')->
              leftJoin('c.comments t')->
              where('c.id = ?', $request->getParameter('id'))->
              orderBy('t.created_at desc')->
              execute();
    Dans le template, un simple $contact->getPrenom me donne la même erreur.

    Pour la leftJoin, j'ai essayé content/contents/comment/comments sans succès.

  10. #10
    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
    Quel sont les messages d'erreurs ?

    Le foreignAlias du lient est "comments".

    Donc le leftJoint est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    leftJoin('c.comments t')
    s'il y a erreur, il faut chercher ailleurs que sur le nom.

    Il n'est pas possible que le getPrenom() retourne la même erreur que la génération de la requête. Ou alors, l'erreur est très loin de là où on la cherche.

    Il peut être intéressant de : créer une application de test, y mettre le schema, générer les objets et les tables, essayer la requête.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    J'ai bien la même erreur pour getPrenom():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'Doctrine_Collection' does not have a method 'getPrenom' in ..\lib\vendor\symfony\lib\escaper\sfOutputEscaperObjectDecorator.class.php on line 64

    Printscreen

    J'espère trouver le temps pour essayer cet après-midi l'application de test.

    Bizarre car une requête sans jointure passe (avec, bien sûr, $comments au lieu $contact->getComments() dans le template associé)

    Voilà les 2 requêtes.
    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
     
    $comment = new comment;
        $comment->setContactId($request->getParameter('id'));
        $this->form = new commentForm($comment);
     
    $this->comments= Doctrine_Query::create()
             ->select('c.content')
             ->from('comment c')
             ->where("contact_id = ?",$request->getParameter('id'))
             ->orderBy('created_at desc')
    		 ->execute();
     
        /*
    	$this->contact = doctrine_core::getTable('contact')->
              createQuery('c')->
              leftJoin('c.comments t')->
              where('c.id = ?', $request->getParameter('id'))->
              orderBy('t.created_at desc')->
              execute();
              
        /*
    Et le template associé:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    <?php use_helper('date'); use_helper('tag'); ?>
    <div class="comment">
     
    	<?php include_partial('form', array('form' => $form)) ?>	 
     
    	<?php 		
     
    		foreach ($comments /*$contact->getComments()*/ as $comment): 
    	?>
    	<table>
    	 <tfoot>
    	  <tr>
    		<td class="horaire">
    		<?php 
    			if ($comment->getUpdatedAt() > $comment->getCreatedAt()) echo "updaté le ".format_date($comment->getUpdatedAt(),'dddd dd-MM-yyyy à HH:mm:ss', 'fr_FR'); 
    			else echo "créé le ".format_date($comment->getCreatedAt(),'dddd dd-MM-yyyy à HH:mm:ss', 'fr_FR');
    		?>
    		</td>
    		<td align="right"><a href="<?php echo url_for('comment/edit?id='.$comment->getId()) ?>">Editer</a></td>
     
    	   </tr>
    	  </tfoot>
    	  <tbody>   
    	    <tr>
    		 <td class="commentaire"><?php 
    	      /*nl2br permet de garder les retours chariot du message (textarea)*/
    		  	echo nl2br($comment->getContent());
    		 ?>
    	     </td>
    	    </tr>
    	  </tbody>
    	</table>
    	<?php endforeach; ?>
     
     
     </div>
     <div class="fiche">
    	<table>
    	  <tbody>
    	    <tr>
    	      <th>Prénom:</th>
    	      <td><?php echo $contact->getPrenom() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Nom:</th>
    	      <td><?php echo $contact->getNom() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Date de naissance:</th>
    	      <td><?php echo $contact->getDatenaissance() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Profession:</th>
    	      <td><?php echo $contact->getProfession() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Adresse:</th>
    	      <td><?php echo $contact->getAdresse() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Code postal:</th>
    	      <td><?php echo $contact->getCodePostal() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Email:</th>
    	      <td><?php echo $contact->getEmail() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Remarque:</th>
    	      <td><?php echo $contact->getRemarque() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Antécédent:</th>
    	      <td><?php echo $contact->getAntecedent() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Traitement:</th>
    	      <td><?php echo $contact->getTraitement() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Mutuelle:</th>
    	      <td><?php echo $contact->getMutuelle() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Tel. fixe:</th>
    	      <td><?php echo $contact->getTelFixe() ?></td>
    	    </tr>
    	    <tr>
    	      <th>Tel. portable:</th>
    	      <td><?php echo $contact->getTelPort() ?></td>
    	    </tr>
    	 </tbody>
    	</table>
     </div>

  12. #12
    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
    A priori, c'est la même erreur qui se produit deux fois pour deux affichages de la même méthode. Déjà un bon signe.

    Par contre, je suis passé très vite sur ton code et j'ai l'impression que nous (je) sommes en train de faire un plat de spaghetti à la crème sans crème, ni pâtes...

    Pourrais-tu décrire simplement, en quelques lignes, ce que tu souhaites faire sur l'écran à générer ?
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    Voilà ce que ça donne lorsque ça fonctionne avec une requête sans jointure donné plus haut + une requête sur la table contact pour le deuxième tableau (celui de droite):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $this->contact = Doctrine_Core::getTable('Contact')->find(array($request->getParameter('id')));
        $this->forward404Unless($this->contact);
    Printscreen

    La page précédente est un simple tableau avec tous les contacts cliquable où l'id est envoyé par l'url.
    Donc j'arrive au résultat voulu mais pas par une jointure. Et si je n'arrive pas à faire de jointure, me voilà assez mal embarqué, n'est-t-il pas?

  14. #14
    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
    Ta requête est proche d'un findOneById.

    Tu n'as pas répondu à la deuxième question, pourtant importante.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    La page générée est pour 1 contact (cliqué sur la page précédente).

    Elle contient:
    - un formulaire de saisie pour ajouter un commentaire (pas de bug)
    - la liste des commentaires existant pour ce contact (enregistrés dans la table comment alias comments)
    - la fiche complète de ce contact (table contact)

    Le rendu sans bug (donc avec la requête sans jointure + requête sur table contact) est sur le 2ème printscreen donné dans mon précédent post. Et celle avec bug dans le 1er printscreen.

  16. #16
    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
    Si cela ne porte que sur 1 contact, avoir deux requêtes n'est pas catastrophique. Tu peux donc envisager de garder les deux requêtes, même si intellectuellement, ce n'est pas parfait.

    Pour satisfaire l’intellect, as-tu essayé la requête sans le orderBy ? Si non, peux-tu essayer ?
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    La suppression du orderBy n'a rien changé. Je garde donc les deux requêtes. Je devrais être amené à faire d'autres jointures. Je verrais si le problème réaparait.

    Merci !

  18. #18
    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
    Ceci va demeurer un mystère mystérieusement mystérieux.

    Ou s'éclaircir à la prochaine requête...
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Michel Rotta Voir le message
    Il peut être intéressant de : créer une application de test, y mettre le schema, générer les objets et les tables, essayer la requête.
    J'ai de nouveau le même message d'erreur mais pas avec un leftJoin dans l'action. Je l'explique ci-dessous mais j'aimerai rebondir sur votre proposition de l'application test.

    Est-ce que je repars du tout début pour avoir un symfony tout neuf ou je la crée dans mon symfony courant?
    En fait je ne me suis pas trop posé de question pour débuter (cohabiter plusieurs applis) donc c'est pour l'instant un mystère pour moi. Je surnage déjà avec l'environnement dev et prod.

    Là, j'ai une appli "frontend" dans "apps". Si 2 applis, le fichier schema.yml sera commun aux deux applis, c'est bien ça?

    Sinon pour en revenir à mon bug.

    Contexte:
    Page principale avec plusieurs contacts. Clique sur l'un deux => page avec les commentaires associés au contact saisie par un "etio".

    Mon action:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        $comment = new comment;
        $comment->setContactId($request->getParameter('id'));
        $this->form = new commentForm($comment);
     
        $this->contact = Doctrine_Core::getTable('Contact')->find(array($request->getParameter('id')));
        $this->forward404Unless($this->contact);
     
        $this->comments= Doctrine_Query::create()
             ->select('c.content')
             ->from('comment c')
             ->where("contact_id = ?",$request->getParameter('id'))
             ->orderBy('created_at desc')
    	 ->execute();
    mon template où l'erreur est générée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "Saisie par ".$comment->getEtios()->getNom().". ";
    et enfin mon schema.yml
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #config/doctrine/schema.yml
    contact:
      actAs:
        Timestampable: ~
      columns:
        prenom: 
          type: string(50)
          notnull: true
        nom: 
          type: string(50)
          notnull: true
        datenaissance: date
        profession: string(50)
        adresse: string(100)
        code_postal: string(10)
        ville: string(50)
        email:   
          type: string(255)
          unique: true 
        remarque: string(10000)
        antecedent: string(10000)
        traitement: string(10000)
        mutuelle: 
          type: boolean
          default: null
        tel_fixe: string(40)
        tel_port: string(40)
     
    comment:
      actAs: 
        Timestampable: ~
      columns:
        contact_id:
          type: integer
        etio_id:
          type: integer
          notnull: true
        content: string(20000)
      relations:
        contact:
          local: contact_id
          foreign: id
          onDelete: CASCADE
          foreignAlias: comments      
     
    etio:
      actAs: 
        Timestampable: ~
      columns:
        name: 
          type: string(50)
          notnull: true
        password:  type: string(50)
      relations:
        comment:
          local: id
          foreign: etio_id
          foreignAlias: etios

  20. #20
    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
    Ton lien entre etos et comment est sur la table 1 de la relation 1-n et le fameux "s" n'est pas sur la bonne relation. Cela laisse entendre qu'un etos ne peut être relié qu'à un comment mais qu'un comment peut être relié à plusieurs etios.... Change la relation de la table etio à celle comment et inverse les s. Ce n'est pas que ce que tu as fais ne marchera pas, mais c'est moins évident à comprendre

    Effectivement, si tu crées deux applications dans ton environnement actuel, elle vont partager le shema et le model. Après, je ne sais pas comment tu es installé sur ton poste mais "avoir un symfony tout neuf " me semble proche de ce que je pense.

    Perso, ma structure est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    developpementSymfony
      projet1
      projet2
      projet3
      symfony
    chaque projet est l'ensemble des dossiers : apps, lib, cache,... et touti quanti.

    symfony est tous ce qui est symony et les plugins. Si tu part d'une installation de ce type là, quant tu fais la création du projet, le liens correcte est mis en place. Il faut juste l'adapter lors de l'installation définitive. Cette structure n'est viable que pour des développements, pas en production.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/11/2011, 14h15
  2. [AC-2000] Etat:inverser l'affichage, une ligne de D en colonne
    Par kir4000 dans le forum IHM
    Réponses: 4
    Dernier message: 07/07/2009, 11h45
  3. Comment inverser mon affichage (miroir horizontal)?
    Par mougel dans le forum Périphériques
    Réponses: 4
    Dernier message: 25/11/2007, 19h57
  4. Comment inverser mon affichage (miroir)?
    Par mougel dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 24/11/2007, 15h38
  5. problème inversion d'affichage....???
    Par AlSvartr dans le forum Langage
    Réponses: 8
    Dernier message: 10/01/2006, 11h40

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