kerlin Posted November 14, 2019 Share Posted November 14, 2019 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 !! Link to comment Share on other sites More sharing options...
coeos.pro Posted November 14, 2019 Share Posted November 14, 2019 (edited) 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 November 14, 2019 by coeos.pro espace ente SUM et ( (see edit history) Link to comment Share on other sites More sharing options...
coeos.pro Posted November 14, 2019 Share Posted November 14, 2019 avec $totalbooked = Db::getInstance()->getValue($totalebookedSql); tu pourra mettre directement dans le tpl : {$totalbooked} Link to comment Share on other sites More sharing options...
kerlin Posted November 14, 2019 Author Share Posted November 14, 2019 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 :-) Link to comment Share on other sites More sharing options...
kerlin Posted November 14, 2019 Author Share Posted November 14, 2019 (edited) 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 November 14, 2019 by kerlin correction faute orth (see edit history) Link to comment Share on other sites More sharing options...
coeos.pro Posted November 14, 2019 Share Posted November 14, 2019 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}... Link to comment Share on other sites More sharing options...
kerlin Posted November 16, 2019 Author Share Posted November 16, 2019 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 ^^ Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now