Jump to content
kerlin

Calculer le total des colonnes

Recommended Posts

Bonjour,

Sur un PS 1.7.5.2, j'ai réussi à créer mon premier module (grâce aux tutos et à la patience d'un dev chevronné !). Ce module permet à l'admin de remplir un tableau avec des données : id du client, date, et 4 colonnes de montants.

Pour chaque client, il peut ensuite visualiser le tableau des données correspondant à ce client dans le BO client.
Le client, quant à lui, a un nouveau bouton sur sa page Mon compte, visible s'il a des données dans son tableau. Ce bouton ouvre une page affichant le tableau avec ses données à lui.
J'ai pu ajouter une colonne qui calcule le total de chaque ligne. C'est peut-être pas catholique mais ça marche en faisant juste ($valeur1)+($valeur2) etc (les variables de chaque colonne).

Mais je sèche complètement pour afficher le total par colonne. Voici le code du controller front qui gère donc l'affichage du tableau en front

    <?php


class programcustomer2defaultModuleFrontController extends ModuleFrontController

{
     public $auth = true;
      public $id_programcustomer;

   public $title_book;

   public $id_customer;

   public $date_comm;

   public $comm_broched;

   public $comm_brochoth;

   public $comm_ebooked;

   public $comm_ebookoth;

    public function init()
    {
        parent::init();
        $this->customer = $this->context->customer;
    }

	 public function getListCommissionsSql($idCommission = null)

		{

				$sql = 'SELECT DISTINCT
                      a.`id_programcustomer` AS `id`,
                      a.`title_book`,
                      a.`id_customer`,
                      a.`date_comm`,
                      a.`comm_broched`,
                      a.`comm_brochoth`,
                      a.`comm_ebooked`,
                      a.`comm_ebookoth`

                    FROM `' . _DB_PREFIX_ . 'programcustomer2` a

                    WHERE
                        `id_customer` = $id_customer ';
          $idCommission = (int) Db::getInstance()->getValue('
                SELECT `id_programcustomer`
                FROM `' . _DB_PREFIX_ . 'programcustomer2`

                '
            );

        if (!is_null($idCommission)) {
            $sql .= ' AND a.`id_programcustomer` = ' . (int) $idCommission ;
          }

        return $sql;
     }

    public function initContent()
    {
        parent::initContent();
       $id_customer = $this->customer->id;

         //Récupération des commissions liées au clients via une requête sql
     $commissionSql = "SELECT *
                        FROM "._DB_PREFIX_."programcustomer2
                        WHERE
                        `id_customer` = '$id_customer'
												ORDER BY  date_comm DESC ;";


    $results = Db::getInstance()->executeS($commissionSql);

		$totalebookedSql = "SELECT Sum(comm_broched) as total1
		                    FROM "._DB_PREFIX_."programcustomer2
                      WHERE
                        `id_customer` = '$id_customer';
                        " ;

    $totalbooked = Db::getInstance()->executeS($totalebookedSql);
    //Assignation et Affichage des résultats dans un template
    $this->context->smarty->assign('results',$results);
     $this->context->smarty->assign('totalbooked',$totalbooked);

    $template = $this->setTemplate('module:programcustomer2/views/templates/front/programcustomerfront.tpl');


    }
    
    
    }

Sur le code de base gérant les données du tableau, j'ai ajouté la requête $totalebookedSql, la variable $totalbooked et l'assign totalbooked.

Dans le tpl, dans la case sous la première colonne, j'ai mis ceci (entre autres nombreux essais !!)

<td>{$totalbooked.total1}</td>

Mais la case total reste désespérement vide !

Mes questions sont :

- faut-il créer une nouvelle function au lieu de mettre tout dans la function initContent ?

- faut-il créer une fonction par champ contenant des montants à additionner ?

- qu'est-ce qui est faux dans mon Select Sum()

Quand je teste dans phpmyadmin, ça me renvoie bien le total.

 

Merci d'avance !!

 

Share this post


Link to post
Share on other sites

petits rappels https://www.prestashop.com/fr/blog/les-bonnes-pratiques-de-la-classe-db-sur-prestashop-1-5

 

essaye de remplacer

$totalebookedSql = "SELECT Sum(comm_broched) as total1 FROM "._DB_PREFIX_."programcustomer2 WHERE `id_customer` = '$id_customer'; " ; $totalbooked = Db::getInstance()->executeS($totalebookedSql);

 

par 

 

$totalebookedSql = 'SELECT SUM(comm_broched)  FROM `'._DB_PREFIX_.'programcustomer2` WHERE `id_customer` = '.(int)$id_customer;
$totalbooked = Db::getInstance()->getValue($totalebookedSql);

 

 

sinon a mon avis la valeur sera dans {$totalbooked.0.total1}

Edited by coeos.pro
espace ente SUM et ( (see edit history)

Share this post


Link to post
Share on other sites

avec $totalbooked = Db::getInstance()->getValue($totalebookedSql);

tu pourra mettre directement dans le tpl   {$totalbooked}

 

Share this post


Link to post
Share on other sites

Merci pour ton aide rapide !

Il n'y aurait pas une apostrophe (petite ? normale ? double ?) qui manquerait quelque part ? Car cela me donne

FUNCTION kamilane_editions717.SUM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
 

SELECT SUM (comm_broched) FROM `psnew17_programcustomer2` WHERE `id_customer` = 74 LIMIT 1

 

Bon, au moins l'id customer est bien récupérée :-)

Share this post


Link to post
Share on other sites

J'ai trouvé ! c'est parce qu'il y avait un espace entre SUM et la parenthèse (faut que ce soit collé : SELECT SUM(comm_broched) )

et là ça marche !!!!!!!!!!!!!

 

Mille et mille mercis !

Je suppose maintenant que je refais la même chose pour chaque colonne ?

Faut que je comprenne la différence entre ExectureS et GetValue ...je cherche des doc bien documentées. Celles que je trouve s'adressent souvent à des gens qui ont déjà plus de bouteille que moi dans le domaine ...

Edited by kerlin
correction faute orth (see edit history)

Share this post


Link to post
Share on other sites

cette doc (https://www.prestashop.com/fr/blog/les-bonnes-pratiques-de-la-classe-db-sur-prestashop-1-5) était pour 1.5 mais ça n'a pas changé depuis 2012.

si tu as plusieurs colonnes, tu peux toujours utiliser array avec un foreach tel que

<?php
$comms = array(  'comm_broched',
                'comm_brochoth',
                'comm_ebooked',
                'comm_ebookoth');
$total = array();
foreach ($comms as $comm) {
    $sql = 'SELECT SUM('.pSQL($comm).')  FROM `'._DB_PREFIX_.'programcustomer2` WHERE `id_customer` = '.(int)$id_customer;
    $total[$comm] = Db::getInstance()->getValue($sql);
}

$this->context->smarty->assign('total', $total);

 

et dans le tpl  {$total.comm_broched} ou {$total.comm_brochoth}...

 

Share this post


Link to post
Share on other sites

Merci à toi !

Je vais relire à tête reposée les bonnes pratiques, mais j'ai eu l'impression que cela s'adressait à des ceusses qui ont déjà de bonnes bases en PHP ... Il me faudrait un tuto pour les nuls 😉 avec les fonctions PHP correspondantes pour du Presta

Oui, je sais, on m'a déjà dit de d'abord apprendre le PHP. Mais si ensuite il faut apprendre le codage pour Prestashop, ça va me prendre des nuits ! 

 

C'est comme quand on crée une function : les noms doivent-ils répondre à un codage précis ? peut-on créer une fonction avec un nom personnalisé ? peut-on imbriquer des functions ? (du style function hook avec dedans un function init ??) 

Bref, de bêtes question, quoi 😉

Mais j'ai déjà beaucoup appris sur ce petit module. J'ai mis 5 jours à le faire ... alors qu'un dev pro m'avait chiffré ça à 20j de boulot ... et à première vue pour faire la même chose ^^

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More