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

CodeIgniter PHP Discussion :

Faire des sous-totaux dans une table


Sujet :

CodeIgniter PHP

  1. #21
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Je suis honteuse et confuse ... et sans doute fatiguée ! j'ai copié ton script mais j'ai rafraichi la page en oubliant de l'envoyer sur le serveur ! ça marche !!!!! faut juste que je remette les colonnes correctement car il n'y a plus les totaux pour chaque produit à la fin de chaque ligne (prix = qty)

    Mille mercis !!!

  2. #22
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Impec, je te laisse cliquer sur

  3. #23
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    je vais faire ça mais encore une petite question : je dois changer le code de la table pour faire une table accordéon. Pour ça, la ligne de total doit être au-dessus de la liste de produits. je suppose qu'alors je dois mettre ce qui est en-dessous de // ligne total au-dessus du foreach ?

    merci pour ton aide précieuse !

  4. #24
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    ça ne sera pas suffisant. Il faudra parcourir toutes les données une première fois pour calculer les totaux et afin de les avoir disponibles au rendu (avant la liste des produits).

  5. #25
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    merci pour ta réponse..
    Par rapport au code, j'ai une question : pourquoi 2 fois //ligne total ? (une fois dans le if, une fois après le foreach).
    Pour l'affichage en accordéon, je cherche ....

    dans l'absolu, comme je vais utiliser css et js pour faire cette table accordéon, le code devrait ressembler à 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <table class="table table-bordered">
        <thead>
            <tr>
                <th>Id</th>
                <th><?= $this->lang->line('Productname') ?></th>
                <th><?= $this->lang->line('Orderdate') ?></th>
                <th><?= $this->lang->line('Quantity') ?></th>
                <th><?= $this->lang->line('Price') ?></th>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
    	  <tr>  
    	     <td>
    		   <table class="accodeon">
                 <thead>
    			  <tr class="total-commande">
    			    <td style="font-size: 18px;" colspan="2">Total</td>
                                <td style="font-size: 18px;" colspan="2">{$v['order_date']}</td>
                                 <td style="font-size: 18px;" colspan="2">{$sum} &euro;</td>
    			  </tr>
    	    </thead>
    	   <tbody>
    			    <tr class="items-commande">
                      <td style="font-size: 18px;">{$i}</td>
                      <td style="font-size: 18px;">{$v['proname']}</td>
                      <td style="font-size: 18px;">{$v['order_date']}</td>
                      <td style="font-size: 18px;">{$v['qnty']}</td>
                      <td style="font-size: 18px;">{$v['price']}</td>
                      <td style="font-size: 18px;">{$total} &euro;</td>
                              </tr>
    	  </tbody>
     
    		   </table>
    		 </td>
    	  </tr>
        </tbody>
    </table>
    Comme dans ton code $rows contient les balises html j'ai tenté en nommant $rows1 la variable qui contient la construction de total de la commande, et $rows2, la variable qui contient la ligne produit.
    J'ai essayé en mettant juste dans la ligne total commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <tr class="total-commande">echo $rows1</tr>
    et dans la ligne où doivent s'afficher les items de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <tr class="items-commande">echo $row2</tr>
    Cela n'a bien sûr pas fonctionné ;-)
    Il faudrait un foreach dans la partie items-commande" pour afficher toutes les lignes.
    Je tourne le truc dans tous les sens mais je bute sur mes limites :-(

  6. #26
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    tu dis qu'il faudrait parcourir les données une première fois pour calculer le total et récupérer cette valeur pour l'afficher sur une ligne précédant l'affichage des items. Mais ce calcul n'est-il pas fait dans la partie //ligne produit avec $sum +=$total; ??

  7. #27
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par kamilane Voir le message
    je dois changer le code de la table pour faire une table accordéon. Pour ça, la ligne de total doit être au-dessus de la liste de produits.
    Tu indiques toi-même le résultat à atteindre.

    Citation Envoyé par kamilane Voir le message
    tu dis qu'il faudrait parcourir les données une première fois pour calculer le total et récupérer cette valeur pour l'afficher sur une ligne précédant l'affichage des items. Mais ce calcul n'est-il pas fait dans la partie //ligne produit avec $sum +=$total; ??
    le total est bien calculé avec $sum +=$total; mais si tu regardes le rendu tu verras que dans la variable $rows[] sont stockées en premier les lignes des produits et après le total, l'inverse de ce que tu veux obtenir. Le total est calculé après le rendu des lignes produits d'où l'obligation de parcourir une première fois le résultat pour en sortir les totaux et après procéder au rendu en générant la ligne total avant les lignes produits.
    2-3 modifs par ci par là et hop le tour est joué :

    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
    <?php
     
    $this->db->join('indochine_products_options','indochine_products_options.product_option_id=indochine_order.options');
    $uid       = $this->session->userdata('uid');
    $all_order = $this->db->order_by('orderCreatetime', 'DESC')->get_where('indochine_order' , array('user_id' => $uid))->result_array();
     
    // génération des lignes de détail du tableau
    $rows   = [];
    $i      = 0;
    $id_cde = '';
    $sums   = [];
     
    // calcul des totaux pour affichage avant les produits
    foreach ($all_order as $k => $v) {
        if ( ! isset($sums[$v['id_commande']])) {
            $sums[$v['id_commande']] = 0;
        }
     
        $total = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
        $sums[$v['id_commande']] += $total;
    }
     
    // rendu des lignes du tableau
    foreach ($all_order as $k => $v) {
        if ($id_cde !== $v['id_commande']) {
            // ligne total
            $rows[] = <<<html
    <td style="font-size: 18px;" colspan="4">Total</td>
    <td style="font-size: 18px;">{$sums[$v['id_commande']]} &euro;</td>
    html;
            $id_cde = $v['id_commande'];
        }
     
        // ligne produit
        ++$i;
        $total  = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
        $rows[] = <<<html
    <td style="font-size: 18px;">{$i}</td>
    <td style="font-size: 18px;">{$v['proname']}</td>
    <td style="font-size: 18px;">{$v['orderCreatetime']}</td>
    <td style="font-size: 18px;">{$v['qnty']}</td>
    <td style="font-size: 18px;">{$total} &euro;</td>
    html;
    }
    ?>
    <table class="table table-bordered">
        <thead>
            <tr>
                <th>Id</th>
                <th><?= $this->lang->line('Productname') ?></th>
                <th><?= $this->lang->line('Orderdate') ?></th>
                <th><?= $this->lang->line('Quantity') ?></th>
                <th><?= $this->lang->line('Price') ?></th>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
            <tr><?= implode('</tr><tr>', $rows) ?></tr>
        </tbody>
    </table>

  8. #28
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    bon, je tourne le truc dans tous les sens, je n'y arrive pas après avoir séché dessus toute la journée :-(. Au mieux, j'ai une ligne et une seule au sommet de la liste avec un total de 0 puis le tableau correct avec les sous-totaux...

    Donc je pense attaquer la chose autrement et afficher dans la ligne sur laquelle cliquer pour dérouler le contenu de la commande, Commande du / date de la commande et donc récupérer la date..
    mais cela ne va pas mieux. Au mieux, je n'ai qu'une date en haut du tableau, qui doit je pense correspondre à la toute première commande.
    Au pire, la page ne s'affiche pas, par exemple avec ma dernière tentative :
    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
    <?php 
     
    // génération des lignes de détail du tableau
    $rows   = [];
    $i      = 0;
    $sum    = 0;
    $id_cde = reset($all_order)['id_commande'];
     
    foreach ($all_order as $k => $v) {
     
     
      if ($id_cde !== $v['id_commande']) {
            // ligne total
            $rows[] = <<<html
    <td style="font-size: 18px;" colspan="4">Total</td>
    <td style="font-size: 18px;">{$sum} &euro;</td>
    html;
            $id_cde = $v['id_commande'];
            $sum    = 0;
        }
     
    //ajout ligne commande par date
     foreach ($id_cde = $v['id_commande']) {
         $date = $v['order_date'];}
     
        // ligne produit
        ++$i;
        $total  = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
        $sum   += $total;
        $rows[] = <<<html
    <td style="font-size: 18px;">{$i}</td>
    <td style="font-size: 18px;">{$v['proname']}</td>
    <td style="font-size: 18px;">{$v['order_date']}</td>
    <td style="font-size: 18px;">{$v['qnty']}</td>
    <td style="font-size: 18px;">{$v['price']}</td>
    <td style="font-size: 18px;">{$total} &euro;</td>
    html;
    }
    // ligne total
    $rows[] = <<<html
    <td style="font-size: 18px;" colspan="3" style="text-align:right;">Total : </td>
    <td style="font-size: 18px;" colspan="3">{$sum} &euro;</td>
    html;
     
    ?>
    <table class="table table-bordered">
        <thead>
            <tr>
                <th>Id</th>
                <th><?= $this->lang->line('Productname') ?></th>
                <th><?= $this->lang->line('Orderdate') ?></th>
                <th><?= $this->lang->line('Quantity') ?></th>
                <th><?= $this->lang->line('Price') ?></th>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
    	  <tr>  
    	     <td>
    		   <table class="accordeon">
                 <thead>
    			  <tr class="total-commande">
    			   <td style="font-size: 18px;"><?=$date ?></td>
    			   </tr>
    	    </thead>
    	   <tbody>
    			    <tr><?= implode('</tr><tr>', $rows) ?></tr>
    	  </tbody>
     
    		   </table>
    Malgré ma tignasse, je risque de ne plus avoir beaucoup de cheveux ce soir !!
    J'ai cherché sur le Net, mais absolument rien trouvé de ce type !
    Merci d'avance pour tout coup de pouce !!

  9. #29
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    pardonne-moi, j'ai posté avant d'avoir vu ta réponse. Je te remercie infiniment ! le total s'affiche mais je dois vérifier car le chiffre me paraît curieux. je reviens te dire ce qu'il en est. Merci pour le temps que tu y passes !!!

  10. #30
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    le total est bien calculé avec $sum +=$total; mais si tu regardes le rendu tu verras que dans la variable $rows[] sont stockées en premier les lignes des produits et après le total, l'inverse de ce que tu veux obtenir. Le total est calculé après le rendu des lignes produits d'où l'obligation de parcourir une première fois le résultat pour en sortir les totaux et après procéder au rendu en générant la ligne total avant les lignes produits.
    2-3 modifs par ci par là et hop le tour est joué
    Oui, j'avais vu effectivement ce que faisait la variable $rows[] et l'ordre dans lequel cela s'affichait.

    Donc avec le code précédent, une ligne TOTAL calculait bien le total de chaque commande

    Id Nom du Produit Date et heure de la commande Quantité Prix Total
    1 Drinks - RED WINE 2018-05-07 10:13:36 1 2.4 2.4 €
    2 Vegetables - MASALA VEGETABLES 2018-05-07 10:13:31 1 0 0 €
    3 Rice & Noodle - STEAMED RICE 2018-05-07 10:13:28 1 0 0 €
    4 Curry - LENTIL CURRY 2018-05-07 10:13:24 1 14.9 14.9 €
    5 Drinks - STILL WATER 2018-05-03 11:55:50 1 0 0 €
    6 Sauce - YOGURT & CORIANDER 2018-05-03 11:55:33 1 0 0 €
    7 Indian Kebab - CHICKEN, FIG, MANGO IN A SESAME NAAN 2018-05-03 11:55:22 1 9.9 9.9 €
    8 SUPPLEMENT - FETA CHEESE 2018-05-03 11:35:19 1 1.5 1.5 €
    9 Naan cuit au four - PEPERONCINO 2018-05-03 11:31:10 1 3.5 3.5 €
    Total 32.2 €
    10 Drinks - STILL WATER 2018-04-26 19:56:10 1 0 0 €
    11 SUPPLEMENT - FETA CHEESE 2018-04-26 19:56:09 1 1.5 1.5 €
    12 Sauce - YOGURT & CORIANDER 2018-04-26 19:56:05 1 0 0 €
    13 Indian Kebab - CHICKEN, FIG, MANGO IN A SESAME NAAN 2018-04-26 19:56:04 1 9.9 9.9 €
    14 Oven cooked naan - CLASSIC 2018-04-26 19:54:25 1 3 3 €
    15 NUTELLA NAAN - NUTELLA NAAN CUIT IN THE TANDOOR OVEN 2018-04-26 19:54:07 1 5.5 5.5 €
    16 LASSI - MANGO 2018-04-26 19:53:51 1 0 4.5 €
    17 Rice & Noodle - STEAMED RICE 2018-04-26 19:51:11 1 0 0 €
    18 Curry - KORMA LAMB 2018-04-26 19:51:08 1 14.9 16.9 €
    Total 41.3 €


    J'ai fait des tentatives avec un foreach pour récupérer le total mais comme je disais, au mieux il m'affichait un total global au-dessus de la liste complète des commandes. J'ai compris pourquoi en voyant ton code (je n'avais pas mis de if dans le foreach)

    Donc j'ai copié ton code ce qui donne 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
    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
    <?php
     
    $this->db->join('indochine_products_options','indochine_products_options.product_option_id=indochine_order.options');
    $uid       = $this->session->userdata('uid');
    $all_order = $this->db->order_by('orderCreatetime', 'DESC')->get_where('indochine_order' , array('user_id' => $uid))->result_array();
     
    // génération des lignes de détail du tableau
    $rows   = [];
    $i      = 0;
    $id_cde = '';
    $sums   = [];
     
    // calcul des totaux pour affichage avant les produits
    foreach ($all_order as $k => $v) {
        if ( ! isset($sums[$v['id_commande']])) {
            $sums[$v['id_commande']] = 0;
        }
     
        $total = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
        $sums[$v['id_commande']] += $total;
    }
     
    // rendu des lignes du tableau
    foreach ($all_order as $k => $v) {
        if ($id_cde !== $v['id_commande']) {
            // ligne total
            $rows[] = <<<html
    <td style="font-size: 18px;" colspan="4">Total</td>
    <td style="font-size: 18px;">{$sums[$v['id_commande']]} &euro;</td>
    html;
            $id_cde = $v['id_commande'];
        }
     
        // ligne produit
        ++$i;
        $total  = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
        $rows[] = <<<html
    <td style="font-size: 18px;">{$i}</td>
    <td style="font-size: 18px;">{$v['proname']}</td>
    <td style="font-size: 18px;">{$v['orderCreatetime']}</td>
    <td style="font-size: 18px;">{$v['qnty']}</td>
    <td style="font-size: 18px;">{$total} &euro;</td>
    html;
    }
    ?>
    et le résultat :
    Id Nom du Produit Date et heure de la commande Quantité Prix Total
    Array
    Total 107.3 €
    1 Drinks - RED WINE 2018-05-07 10:13:36 1 2.4 €
    2 Vegetables - MASALA VEGETABLES 2018-05-07 10:13:31 1 0 €
    3 Rice & Noodle - STEAMED RICE 2018-05-07 10:13:28 1 0 €
    4 Curry - LENTIL CURRY 2018-05-07 10:13:24 1 14.9 €
    5 Drinks - STILL WATER 2018-05-03 11:55:50 1 0 €
    6 Sauce - YOGURT & CORIANDER 2018-05-03 11:55:33 1 0 €
    7 Indian Kebab - CHICKEN, FIG, MANGO IN A SESAME NAAN 2018-05-03 11:55:22 1 9.9 €
    8 SUPPLEMENT - FETA CHEESE 2018-05-03 11:35:19 1 1.5 €
    9 Naan cuit au four - PEPERONCINO 2018-05-03 11:31:10 1 3.5 €
    Total 41.3 €
    10 Drinks - STILL WATER 2018-04-26 07:56:10 1 0 €
    11 SUPPLEMENT - FETA CHEESE 2018-04-26 07:56:09 1 1.5 €
    12 Sauce - YOGURT & CORIANDER 2018-04-26 07:56:05 1 0 €
    13 Indian Kebab - CHICKEN, FIG, MANGO IN A SESAME NAAN 2018-04-26 07:56:04 1 9.9 €
    14 Oven cooked naan - CLASSIC 2018-04-26 07:54:25 1 3 €
    15 NUTELLA NAAN - NUTELLA NAAN CUIT IN THE TANDOOR OVEN 2018-04-26 07:54:07 1 5.5 €
    16 LASSI - MANGO 2018-04-26 07:53:51 1 4.5 €
    17 Rice & Noodle - STEAMED RICE 2018-04-26 07:51:11 1 0 €
    18 Curry - KORMA LAMB 2018-04-26 07:51:08 1 16.9 €
    Total 26.3 €
    19 SUPPLEMENT - FETA CHEESE 2018-04-26 07:15:31 1 1.5 €
    20 Drinks - STILL WATER 2018-04-26 07:15:19 1 0 €
    21 Sauce - YOGURT & CORIANDER 2018-04-26 07:15:16 1 0 €
    22 Indian Kebab - CHICKEN, FIG, MANGO IN A SESAME NAAN 2018-04-26 07:15:15 1 9.9 €
    23 OVEN COOKED NAAN - CLASSIC 2018-04-26 07:15:09 1 3 €
    24 Empanadas - CHICKEN CURRY 2018-04-26 07:15:07 1 4 €
    25 Kebab Indien au sésame - MAYONNAISE SPILLED AT CURRY 2018-04-26 07:15:07 1 7.9 €

    Comme tu peux voir, le premier total ne correspond pas au total de la commande (les autres oui). De plus, sur cette commande là, curieusement, il y a des produits de dates différentes.

    Par ailleurs, je souhaite donc faire un tableau accordéon, il faudrait donc que le total soit appelé séparément, si c'est possible ? et non dans implode

    J'avais donc essayé 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <table class="table table-bordered">
        <thead>
            <tr>
                <th>Id</th>
                <th><?= $this->lang->line('Productname') ?></th>
                <th><?= $this->lang->line('Orderdate') ?></th>
                <th><?= $this->lang->line('Quantity') ?></th>
                <th><?= $this->lang->line('Price') ?></th>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
    	  <tr>  
    	     <td>
    		   <table class="accordeon">
                 <thead>
    			  <tr class="total-commande">
    			   <td style="font-size: 18px;" colspan="6"><?=$sums ?></td>
    			   </tr>
    	    </thead>
    	   <tbody>
    			    <tr><?= implode('</tr><tr>', $rows) ?></tr>
    	  </tbody>
     
    		   </table>
    		 </td>
    	  </tr>
        </tbody>
    </table>]
    Mais mon en-tête n'apparaît pas.

    Merci en tout cas mille fois pour ton aide !!

  11. #31
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par kamilane Voir le message
    De plus, sur cette commande là, curieusement, il y a des produits de dates différentes.
    Ben c'est normal, le code php ne semble pas en cause par contre le SQL lui semble problématique : tu tries par orderCreatetime DESC, donc vu le résultat obtenu, je pense que orderCreatetime n'est pas suffisant pour regrouper les commandes.
    Remplace orderCreatetime DESC par une autre colonne plus appropriée. A toi de choisir.

    Citation Envoyé par kamilane Voir le message
    Par ailleurs, je souhaite donc faire un tableau accordéon, il faudrait donc que le total soit appelé séparément, si c'est possible ? et non dans implode
    Ben oui c'est possible, tu as tous les éléments maintenant pour t'en sortir.
    Vérifie bien comment l'accordéon est codé pour produire un html correctement pris en charge par le plugin.

  12. #32
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Merci pour ta réponse.
    Pour qu'il affiche les commandes par date, il me semble que le orderCreatetime DESC est correct mais il faut sans doute regrouper par id_commande, non ?
    Est-ce que ceci serait correct ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $all_order = $this->db->order_by('order_date', 'DESC'), group by('id_commande')->get_where('indochine_order' , array('user_id' => $uid))->result_array();
    Pour l'affichage dans la table, j'imagine qu'il faut supprimer le code correspondant à // ligne total sinon le contenu est repris dans l'implode. Est-ce correct ? Ou donner un autre nom à la variable pour la récupérer là où je veux ?
    Pour que le tableau s'affiche pour chaque commande, ne faut-il pas ajouter un foreach à l'intérieur ?
    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
     
    <table class="tbl-accordeon">
      <thead>
         <tr>
            <th>
              Ici les en-têtes des colonnes
            </th>
          </tr>
       </thead>
       //Pour chaque commande on affiche une ligne Commande - date de la commande - montant total (sur laquelle on cliquera pour afficher les items de la commande)
        <tbody>
           <tr>
              <td>
                 <table class="tbl-accordeon-recap"> 
                     <thead>
                        <tr>
                              <td>Commande</td>
                              <td> date de la commande </td>
                              <td>montant total de la commande </td>
                         </tr>
                      </thead>
                       <tbody style="display: table-row-group">// les items de la commande
                             <tr>//item 1 de la commande
                                   <td>id de l'item</td>
                                   <td>Nom du produit</td>
                                   <td>- (pas nécessaire de montrer la date pour chaque item</td>
                                   <td>qnty</td>
                                   <td>price</td>
                                   <td>total qnty * price &euro</td>
                              </tr>
                              <tr>
                                  <td>//item 2 de la commmande</td>
                              </tr> etc </tr>
                           </tbody>
                       </table>
                    </td>
                  </tr>
               </tbody>
     </table>
    Une fois que les données seront correctement affichées "dépliées" je pourrai faire le css et rajouter le script pour l'accordéon. mais pour l'affichage des données j'ai du mal !
    Si tu veux bien m'aider encore un peu, tu auras ma reconnaissance éternelle !

    PS : ce serait peut-être plus simple si la ligne cliquable ne contient que Commande du : et la date de la commande. Et garder la ligne montant total après les lignes d'items ?

    PS 2 : j'ai essayé d'ajouter group_by id_commande (avant order_by) mais cela fait une erreur, la page ne s'est pas affichée.

    PS 3 : tu as raison pour le souci SQL, je me suis rendue compte qu'il y avait des id_commande = 0 (des produits non commandés mais mis en favori) donc il faut ajouter id_commande >0
    désolée ... ce n'est pas moi qui ai créé le bazar !

  13. #33
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Il faut voir comment est généré le id_commande, si c'est un numérique auto-incrémenté, il y a une probabilité forte pour les commandes les plus récentes aient un plus grand id_commande tout en ayant un order_date du même acabit

    Donc, je ferai un essai avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $all_order = $this->db->order_by('id_commande', 'DESC')->get_where('indochine_order' , array('user_id' => $uid))->result_array();
    Quel plugin tu utilises pour gérer l'affichage accordéon ?
    Un lien rien que pour toi : ici

    Essaie avec ça stp :
    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
    <?php
     
    $this->db->join('indochine_products_options','indochine_products_options.product_option_id=indochine_order.options');
    $uid       = $this->session->userdata('uid');
    $all_order = $this->db->order_by('id_commande', 'DESC')->get_where('indochine_order' , array('user_id' => $uid))->result_array();
     
    // génération des lignes de détail du tableau
    $rows   = [];
    $i      = 0;
    $id_cde = '';
    $sums   = [];
     
    // calcul des totaux pour affichage des totaux avant les produits
    foreach ($all_order as $k => $v) {
        if ( ! isset($sums[$v['id_commande']])) {
            $sums[$v['id_commande']] = 0;
        }
     
        $total = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
        $sums[$v['id_commande']] += $total;
    }
     
    // rendu des lignes du tableau
    foreach ($all_order as $k => $v) {
        if ($id_cde !== $v['id_commande']) {
            if ($id_cde !== '') {
                $rows[] = '</tbody></table></td>';
            }
            // ligne total
            $rows[] = <<<html
    <td>
      <table class="tbl-accordeon-recap">
        <thead>
          <tr>
            <td>{$v['id_commande']}</td>
            <td>{$v['order_date']}</td>
            <td>{$sums[$v['id_commande']]} &euro;</td>
          </tr>
        </thead>
        <tbody style="display: table-row-group">
    html;
            $id_cde = $v['id_commande'];
        }
     
        // ligne produit
        ++$i;
        $total  = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
        $rows[] = <<<html
    <tr>
      <td style="font-size: 18px;">{$i}</td>
      <td style="font-size: 18px;">{$v['proname']}</td>
      <td style="font-size: 18px;">{$v['qnty']}</td>
      <td style="font-size: 18px;">{$total} &euro;</td>
    </tr>
    html;
    }
    if ( ! empty($all_order)) {
        $rows[] = '</tbody></table></td>';   
    }
    ?>
    <table class="table table-bordered">
        <thead>
            <tr>
                <th>Id</th>
                <th><?= $this->lang->line('Orderdate') ?></th>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
            <tr><?= implode('</tr><tr>', $rows) ?></tr>
        </tbody>
    </table>
    Va falloir que tu t'y colles parce que je joue aux devinettes là et c'est pas trop mon truc vois-tu... Tu as tous les éléments maintenant après faut quand même apprendre un peu ce qui te manque

  14. #34
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Bonjour et merci pour ta réponse !
    Dans la bdd, le id_commande n'est pas autoincrémenté. Quand on choisit ses produits, on peut soit opter pour les commander, soit les mettre en favoris. Dans la bdd si commande => id_commande > 0, si favoris : id_commande = 0.
    Si commande, chaque ligne de produit composant la commande reçoit le même id_commande. Ce pourquoi je cherchais comment regrouper les résultats de recherche par id_commande >0.

    Donc j'avais déjà essayé ce que tu proposes, de remplacer l'order_by orderCreatime par order_by id_commande, mais c'est là que je me suis rendue compte qu'il y avait des commandes dont l'id_commande = 0, qui ne doivent pas apparaître dans ce tableau. J'ai essayé plusieurs choses pour ne sélectionner que les id_commande > 0 mais à chaque fois j'ai fait tout planter.

    Dans la bdd, orderCreatetime est de type VARCHAR et order_date TIMESTAMP. Fatalement, chaque ligne d'item a une heure différente, il me semble qu'un de ces 2 champs devrait être au format DATE Y-m-d pour faciliter l'ORDER_BY non ?

    Je te réponds au fur et à mesure de la lecture de ta réponse, donc je viens de tester ton code .... et GENIAAAAAAAAAAAAAL ça marche !!! Merciiiiiiiiiiiiiiiiiiiiiiiiii !!!! La seule chose que je vais chercher à rajouter, c'est donc la sélection des id_commandes >0. J'ai essayé hier comme quand je fais ce type de sélection dans phpmyadmin mais manifestement, là ça ne marche pas (je dirais même plus, ça plante !)

    Je te rassure, j'ai passé toute la journée hier à chercher, à faire des tests, à étudier ton code pour le comprendre, je n'attendais pas le bec ouvert que tu me serves la solution tout crue ;-) mais il n'y a pas beaucoup d'exemples de ce type sur le Net, à part beaucoup de choses pour Excel. Même à mon grand âge, j'adore continuer à apprendre mais pour ça, faut trouver des tutos :-)

    Par contre pour ce qui est de l'HTML du tableau, le code que je t'avais mis, je l'avais tiré de la page ici. Je vais aller comparer avec le code de la page que tu me donnes.

    Merci en tout cas infiniment pour ton aide et ta patience !! je vais peut-être pouvoir faire autre chose ce we ;-)

  15. #35
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Comme je ne connais pas l'ORM que tu utilises, je vais contourner le problème du WHERE directement en PHP.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // calcul des totaux pour affichage des totaux avant les produits
    foreach ($all_order as $k => $v) {
        if ($k === 0) {
            continue;
        }
        if ( ! isset($sums[$v['id_commande']])) {
            $sums[$v['id_commande']] = 0;
        }
     
        $total = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
        $sums[$v['id_commande']] += $total;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // rendu des lignes du tableau
    foreach ($all_order as $k => $v) {
        if ($k === 0) {
            continue;
        }
        // suite du code
    }
    Et le tour est joué
    Bon week-end

  16. #36
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    à première vue, ça a été créé avec codeigniter. Je ne le connais pas mais ayant trouvé le fichier php de la vue de ce tableau, j'ai cherché à le modifier lui en direct.

    Bon we à toi aussi et encore un tout grand merci, tu as sauvé le mien !! ;-)

  17. #37
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bon j'ai zieuté du côté de la doc de CodeIgniter et il serait possible de faire comme un truc dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $all_order = $this->db->order_by('id_commande', 'DESC')->get_where('indochine_order' , array('user_id' => $uid, 'id_commande >' => 0))->result_array();
    pense à commenter le contournement en PHP du message précédent pour le test

  18. #38
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Comme je ne connais pas l'ORM que tu utilises, je vais contourner le problème du WHERE directement en PHP.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // calcul des totaux pour affichage des totaux avant les produits
    foreach ($all_order as $k => $v) {
        if ($k === 0) {
            continue;
        }
        if ( ! isset($sums[$v['id_commande']])) {
            $sums[$v['id_commande']] = 0;
        }
     
        $total = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
        $sums[$v['id_commande']] += $total;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // rendu des lignes du tableau
    foreach ($all_order as $k => $v) {
        if ($k === 0) {
            continue;
        }
        // suite du code
    }
    Et le tour est joué
    Bon week-end
    Voilààààà ! ça marche. Cela ne fonctionnait pas avec $k car il y avait des prix à 0 donc j'ai utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($v['id_commande'] == 0)
    et ça marche impecc !

    encore 10000 fois merci !!

  19. #39
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    rawscr si tu as encore un peu de patience ;-) j'ai une dernière petite question concernant ce tableau :
    il faudrait que les colonnes prix et total qui sont à 0€ soient vides ou affichent un -

    j'ai donc modifié le script de cette façon (juste la partie des lignes) mais ça plante le site. Peut-on mettre du php de cette façon ? ou fais-je une erreur de parenthèse, d'accolade ?
    j'ai essayé aussi en mettant le if dans le <tr> mais ça m'a fait pareil.

    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
        // ligne produit
        ++$i;
        $total  = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
    	if ($v['price'] == 0) {
        $rows[] = <<<html
    <tr>
      <td style="font-size: 18px;">{$i}</td>
      <td style="font-size: 18px;">{$v['proname']}</td>
      <td style="font-size: 18px;">{$v['order_date']}</td>
      <td style="font-size: 18px;">{$v['qnty']}</td>
      <td style="font-size: 18px;">{$v['price']}</td>
      <td style="font-size: 18px;">{$total} &euro;</td>
    </tr>
    html;
    }
    } else {
        $rows[] = <<<html
    <tr>
      <td style="font-size: 18px;">{$i}</td>
      <td style="font-size: 18px;">{$v['proname']}</td>
      <td style="font-size: 18px;">{$v['order_date']}</td>
      <td style="font-size: 18px;">{$v['qnty']}</td>
      <td style="font-size: 18px;">{$v['price']}</td>
      <td style="font-size: 18px;">{$total} &euro;</td>
    </tr>
    html;
    }
    }
    Merci d'avance !

  20. #40
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    comme ça :
    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
    <?php
     
    $this->db->join('indochine_products_options','indochine_products_options.product_option_id=indochine_order.options');
    $uid       = $this->session->userdata('uid');
    $all_order = $this->db->order_by('id_commande', 'DESC')->get_where('indochine_order' , array('user_id' => $uid))->result_array();
     
    // génération des lignes de détail du tableau
    $rows   = [];
    $i      = 0;
    $id_cde = '';
    $sums   = [];
     
    // calcul des totaux pour affichage des totaux avant les produits
    foreach ($all_order as $k => $v) {
        if ($v['id_commande'] == 0) {
            continue;
        }
     
        if ( ! isset($sums[$v['id_commande']])) {
            $sums[$v['id_commande']] = 0;
        }
     
        $total = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
        $sums[$v['id_commande']] += $total;
    }
     
    // rendu des lignes du tableau
    foreach ($all_order as $k => $v) {
        if ($v['id_commande'] == 0) {
            continue;
        }
        if ($id_cde !== $v['id_commande']) {
            if ($id_cde !== '') {
                $rows[] = '</tbody></table></td>';
            }
            // ligne total
    		$total  = ($sums[$v['id_commande']] > 0) ? "{$sums[$v['id_commande']]} &euro;" : '&nbsp;';
            $rows[] = <<<html
    <td>
      <table class="tbl-accordeon-recap">
        <thead>
          <tr>
            <td>{$v['id_commande']}</td>
            <td>{$v['order_date']}</td>
            <td>{$total}</td>
          </tr>
        </thead>
        <tbody style="display: table-row-group">
    html;
            $id_cde = $v['id_commande'];
        }
     
        // ligne produit
        ++$i;
        $sum    = $v['qnty'] * ($v['product_option_price'] + $v['product_option_extra']);
    	$total  = ($sum > 0) ? "{$sum} &euro;" :  '&nbsp;';
        $rows[] = <<<html
    <tr>
      <td style="font-size: 18px;">{$i}</td>
      <td style="font-size: 18px;">{$v['proname']}</td>
      <td style="font-size: 18px;">{$v['qnty']}</td>
      <td style="font-size: 18px;">{$total}</td>
    </tr>
    html;
    }
    if ( ! empty($all_order)) {
        $rows[] = '</tbody></table></td>';   
    }
    ?>
    <table class="table table-bordered">
        <thead>
            <tr>
                <th>Id</th>
                <th><?= $this->lang->line('Orderdate') ?></th>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
            <tr><?= implode('</tr><tr>', $rows) ?></tr>
        </tbody>
    </table>

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [XL-2003] Sous Totaux dans une liste grace à des "Inputbox".
    Par graphikris dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/05/2013, 18h37
  2. Réponses: 7
    Dernier message: 08/10/2012, 16h46
  3. [AC-2002] Comment calculer des sous-totaux dans une requete croisee
    Par babinou dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/08/2009, 10h43
  4. Ne pas faire apparaitre les titres des sous figures dans la table des figures?
    Par Contact2012 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 7
    Dernier message: 27/04/2009, 18h39
  5. [VRML] Faire des trous ronds dans une table.
    Par yoyo910 dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 22/03/2006, 18h56

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