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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    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 confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    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.

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    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 confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    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() ?>
    ...

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    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 confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Attention, il ne s'agit pas d'un espace mais d'un trait de soulignement.

    code_postal qui donnera un getCodePostal()

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

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