Thomas Posted May 28, 2019 Share Posted May 28, 2019 Bonjour, Je m'arrache les cheveux sur le problème suivant sur PS 1.6.1.4 J'ai fait une modification de /classes/order/Order.php dans la fonction getProducts() en faisant un override pour pouvoir récupérer des infos supplémentaire à afficher sur les lignes des produits dans les pages de commandes (nom du fabricant, les différentes références fournisseurs, le prix d'achat, ...). Ça fonctionne très bien sur ma preprod mais en le mettant sur mon live, il n'y a plus aucune modification qui a été prise en compte. J'ai essayé les actions suivantes : vidé le cache désactivé le cache supprimer le /cache/class_index.php chargé la page de commande avec la console Chrome activé pour l'option "Disable cache" mis un die() dans /override/classes/order/Order.php (pas d'effet) mis un die() dans /classes/order/Order.php (pas d'effet) Je ne vois vraiment pas ce qui peut bloquer les modifications... Merci d'avance à tou(te)s ! Link to comment Share on other sites More sharing options...
Janett Posted May 28, 2019 Share Posted May 28, 2019 Les overrides sont bien activés dans Paramètres avancés > Performance ? Dommage sur cette version de Prestashop vous n'avez pas de hook pour éviter d'avoir recours à un override. Link to comment Share on other sites More sharing options...
Thomas Posted May 29, 2019 Author Share Posted May 29, 2019 Dans Paramètres avancés > Performances j'ai bien "Désactiver toutes les surcharges" sur NON. J'avais oublié de le préciser ^^ Link to comment Share on other sites More sharing options...
Thomas Posted June 3, 2019 Author Share Posted June 3, 2019 J'en profite pour UP avec une màj qui pourrait peut-être aider à trouver la source... J'ai fait une copie de fichier sur un sous-domaine de preprod. Pareil avec la BDD. Je me retrouve avec une copie conforme du site. La seule modification que j'ai opéré c'est le .htaccess pour faire un blocage via .htpasswd. Tout fonctionne à merveille sur la preprod... J'avais déjà un override de /classes/crontroller/FrontController.php présent sur le site. J'ai modifié une valeur à l'intérieur : sur le live ça fonctionne pas, sur la preprod si... Au cas où, j'ai désactivé le cache du site en forçant la compilation à chaque appel, désactivé le CCC et supprimé /cache/class_index.php mais ça ne change rien, les modifications ne sont pas prises en compte. Si ça peut aiguiller quelqu'un vers une piste... Link to comment Share on other sites More sharing options...
Thomas Posted June 5, 2019 Author Share Posted June 5, 2019 Toujours dans la recherche de la source, je me tourne vers le cache. J'ai cru lire, je ne sais plus où qu'on pouvait supprimer le contenu de /cache/smarty/compile (je suppose à part le index.php). Est-ce qu'il y a un danger / non intérêt à faire cela ? Link to comment Share on other sites More sharing options...
Janett Posted June 5, 2019 Share Posted June 5, 2019 2 hours ago, Thomas said: Toujours dans la recherche de la source, je me tourne vers le cache. J'ai cru lire, je ne sais plus où qu'on pouvait supprimer le contenu de /cache/smarty/compile (je suppose à part le index.php). Est-ce qu'il y a un danger / non intérêt à faire cela ? Oui, cela a intérêt si le cache n'a pas été vidé depuis un bon moment et qu'il est volumineux. Lorsque le cache est volumineux, l'action de vider le cache peut être lente et dépasser la limite d'exécution des scripts. Particulièrement sur les hébergements mutualisés qui ont des limitations de performances (Quotas d'IO etc...) Mais c'est la méthode la plus rapide. En 1.7 on peut vider le cache en ligne de commande, ce qui est bien plus efficace. Ce n'est pas le cas sur votre version 1.6.1.4 Reste donc le vidage manuel du cache smarty, via le FTP vous pouvez supprimez tous les dossiers et fichiers contenus dans : /cache/smarty/cache/ /cache/smarty/compile/ Le mieux étant de conserver le fichier index.php On 6/3/2019 at 2:44 PM, Thomas said: J'avais déjà un override de /classes/crontroller/FrontController.php présent sur le site. J'ai modifié une valeur à l'intérieur : sur le live ça fonctionne pas, sur la preprod si... Si ça peut aiguiller quelqu'un vers une piste... Si votre modification n'est pas prise en compte, c'est soit que votre override n'est pas utilisé parce que les overrides sont désactivés dans Paramètres avancés > Performances, ou que votre fichier d'override est mal placé/nommé/mauvais nom de classe etc... soit que vous avez peut être un cache genre opcache ou truc du genre au niveau de votre hébergement Link to comment Share on other sites More sharing options...
Thomas Posted June 5, 2019 Author Share Posted June 5, 2019 Bonjour Janett 22 minutes ago, Janett said: Reste donc le vidage manuel du cache smarty, via le FTP vous pouvez supprimez tous les dossiers et fichiers contenus dans : /cache/smarty/cache/ /cache/smarty/compile/ J'ai tout vidé sauf les index.php et cela n'a rien changé 🤕 24 minutes ago, Janett said: On 6/3/2019 at 2:44 PM, Thomas said: J'avais déjà un override de /classes/crontroller/FrontController.php présent sur le site. J'ai modifié une valeur à l'intérieur : sur le live ça fonctionne pas, sur la preprod si... Si ça peut aiguiller quelqu'un vers une piste... Si votre modification n'est pas prise en compte, c'est soit que votre override n'est pas utilisé parce que les overrides sont désactivés dans Paramètres avancés > Performances, ou que votre fichier d'override est mal placé/nommé/mauvais nom de classe etc... soit que vous avez peut être un cache genre opcache ou truc du genre au niveau de votre hébergement L'override fonctionne bien, car il y a une fonctionnalité dynamique qui est visible sur le site (pour indiquer si la boutique est ouverte ou pas en fonction du jour et de l'heure courante). J'ai juste rajouté la date du jour dans un array() pour indiquer que la boutique est fermée. Ça fonctionne pour toutes les dates déjà indiquées, mais celle que je rajoute n'est pas prise en compte. J'explique ça pour illustrer qu'il y a une sorte de "version" que le système connaît et qui ne prend pas en compte les modifications. Concernant le cache, je suis sur un serveur infogéré chez OVH. J'ai déjà demandé à l'infogérant et il n'y a pas de système de cache au niveau serveur, ni de fonctionnement spécifique au domaine du live par rapport au sous-domaine de preprod. Merci pour votre retour en tout cas ! Link to comment Share on other sites More sharing options...
Thomas Posted June 5, 2019 Author Share Posted June 5, 2019 (edited) Comment pourrait-on expliquer que la copie intégrale du site (fichiers + BDD) sur une preprod vierge (tant par les fichiers que par la BDD) fonctionne correctement ? Est-ce que la copie des fichiers ne devrait pas "emporter" le cache et reproduire le même problème ? Edited June 5, 2019 by Thomas (see edit history) Link to comment Share on other sites More sharing options...
Janett Posted June 5, 2019 Share Posted June 5, 2019 Faudrait faire un diff sur les fichiers entre votre prod et votre preprod pour détecter toutes les différences. Et c'est peut être votre code qui pose problème, mettez le code de votre override ici qu'on jette un oeil. Link to comment Share on other sites More sharing options...
Thomas Posted June 5, 2019 Author Share Posted June 5, 2019 (edited) Faire un compare fichier par fichier je sais faire ça (via Notepad++) mais pas en masse... :s Il y a moyen en ligne de commande de faire quelque chose comme ça ? Ou autrement ? Pour assurer, j'ai fait une capture de Paramètres avancés > Performances > Mode debug : Pour les overrides, les voici : /override/classes/order/Order.php est le fichier qui m'a posé le problème à la base. Même un die() en début de getProduct() n'a pas d'effet. <?php /*** /* override/classes/order/Order.php /**/ class Order extends OrderCore { // Override déjà présent avant de faire l'ajout public function getCartRules() { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'order_cart_rule` ocr INNER JOIN `'._DB_PREFIX_.'cart_rule` cr ON ocr.`id_cart_rule` = cr.`id_cart_rule` WHERE ocr.`id_order` = '.(int)$this->id); } /** START ADD **/ // Récupère des informations sur le fournisseur d'un produit à réutiliser dans la page commande public function setProductSupplierInfos(&$row) { $suppliers_ref_list = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT ps.*, s.name, p.id_supplier AS sup_default FROM `'._DB_PREFIX_.'product_supplier` ps LEFT JOIN `'._DB_PREFIX_.'supplier` s ON (ps.id_supplier = s.id_supplier) LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.id_product = ps.id_product) WHERE ps.`id_product` = '.(int)$row['id_product'].' AND s.`active` = 1 AND ps.id_product_attribute = '.(int)$row['product_attribute_id']); foreach ($suppliers_ref_list as $key => $supplier_infos) { if ($supplier_infos['sup_default'] == $supplier_infos['id_supplier']) { $row['supplier_default']['name'] = $supplier_infos['name']; $row['supplier_default']['reference'] = $supplier_infos['product_supplier_reference']; $row['supplier_default']['achat'] = $supplier_infos['product_supplier_price_te']; } else { $row['suppliers_infos'][$supplier_infos['id_supplier']]['sup_reference'] = $supplier_infos['product_supplier_reference']; $row['suppliers_infos'][$supplier_infos['id_supplier']]['sup_name'] = $supplier_infos['name']; $row['suppliers_infos'][$supplier_infos['id_supplier']]['sup_achat'] = $supplier_infos['product_supplier_price_te']; } } } // Récupère le nom du fournisseur d'un produit à réutiliser dans la page commande public function setProductManufacturerName(&$row) { $manufacturer_name = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT name FROM `'._DB_PREFIX_.'manufacturer` WHERE `id_manufacturer` = '.(int)$row['id_manufacturer']); foreach ($manufacturer_name as $key => $name) { $row['manufacturer_name'] = $name['name']; } } /** END ADD **/ public function getProducts($products = false, $selected_products = false, $selected_qty = false) { if (!$products) { $products = $this->getProductsDetail(); } $customized_datas = Product::getAllCustomizedDatas($this->id_cart); $result_array = array(); foreach ($products as $row) { // Change qty if selected if ($selected_qty) { $row['product_quantity'] = 0; foreach ($selected_products as $key => $id_product) { if ($row['id_order_detail'] == $id_product) { $row['product_quantity'] = (int)$selected_qty[$key]; } } if (!$row['product_quantity']) { continue; } } $this->setProductImageInformations($row); $this->setProductCurrentStock($row); // Backward compatibility 1.4 -> 1.5 $this->setProductPrices($row); $this->setProductCustomizedDatas($row, $customized_datas); // Add information for virtual product if ($row['download_hash'] && !empty($row['download_hash'])) { $row['filename'] = ProductDownload::getFilenameFromIdProduct((int)$row['product_id']); // Get the display filename $row['display_filename'] = ProductDownload::getFilenameFromFilename($row['filename']); } $row['id_address_delivery'] = $this->id_address_delivery; /** START ADD **/ if ($row['product_id'] == 108948) { die(print_r($row)); } $this->setProductSupplierInfos($row); $this->setProductManufacturerName($row); /** END ADD **/ /* Stock product */ $result_array[(int)$row['id_order_detail']] = $row; } if ($customized_datas) { Product::addCustomizationPrice($result_array, $customized_datas); } return $result_array; } } /override/classes/controller/FrontController.php, début janvier je l'ai modifié et pas eu de soucis pour que ça marche. J'avais modifié la variable $jours_feries = array($year_now.'-01-01', $paques, $year_now.'-05-01', $year_now.'-05-08', $year_now.'-07-14', $year_now.'-08-15', $year_now.'-11-01', $year_now.'-11-11', $year_now.'-12-25', '2018-10-13'); Cette fois, j'ai modifié le produit en rajoutant la date du jour ( '2019-06-05' ) ce qui est censé indiquer que la boutique et le service client est fermée, mais ça ne fonctionne pas. Pourtant lors des autres jours du tableau déjà présent, ça fonctionne. Voici le $jour_feries qui ne fonctionne pas. $jours_feries = array($year_now.'-01-01', $paques, $year_now.'-05-01', $year_now.'-05-08', $year_now.'-07-14', $year_now.'-08-15', $year_now.'-11-01', $year_now.'-11-11', $year_now.'-12-25', '2018-10-13', '2019-06-05'); Voici le fichier au complet : <?php /** * override/classes/controller/FrontController.php * Le fichier a déjà été modifié avec succès par le passé (courant janvier 2019) **/ class FrontController extends FrontControllerCore { /* * module: lgseoredirect * date: 2017-09-04 15:48:08 * version: 1.2.7 */ public function init() { if (Module::isInstalled('lgseoredirect')) { $uri_var = $_SERVER['REQUEST_URI']; $shop_id = Context::getContext()->shop->id; $redirect = Db::getInstance()->getRow( 'SELECT * FROM '._DB_PREFIX_.'lgseoredirect '. 'WHERE url_old = "'.pSQL($uri_var).'" '. 'AND id_shop = "'.(int)$shop_id.'" '. 'ORDER BY id DESC' ); $header = Array(); if ($redirect and $uri_var == $redirect['url_old'] and $shop_id == $redirect['id_shop']) { if ($redirect['redirect_type'] == 301) { $header[] = 'HTTP/1.1 301 Moved Permanently'; } if ($redirect['redirect_type'] == 302) { $header[] = 'HTTP/1.1 302 Moved Temporarily'; } if ($redirect['redirect_type'] == 303) { $header[] = 'HTTP/1.1 303 See Other'; } $header[] = 'Cache-Control: no-store, no-cache, must-revalidate'; Tools::redirect($redirect['url_new'], __PS_BASE_URI__, null, $header); } } parent::init(); } // Gestion de l'ouverture boutique / service client sur toutes les pages du site public function initHeader() { // Horaires boutique et service client $hor_boutique = array('mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'); $hor_servcli = array('lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'); $matin_heure_debut = '09:30'; $matin_heure_fin = '12:30'; $am_heure_debut = '14:00'; $am_heure_fin = '18:00'; // Traductions $days = array('Monday' => 'lundi', 'Tuesday' => 'mardi', 'Wednesday' => 'mercredi', 'Thursday' => 'jeudi', 'Friday' => 'vendredi', 'Saturday' => 'samedi', 'Sunday' => 'dimanche'); $months = array('January' => 'janvier', 'February' => 'février', 'March' => 'mars', 'April' => 'avril', 'May' => 'mai', 'June' => 'juin', 'July' => 'juillet', 'August' => 'août', 'September' => 'septembre', 'October' => 'octobre', 'November' => 'novembre', 'December' => 'décembre'); // Date $date = new DateTime(); $complete_date_now = $days[date_format($date, 'l')].' '.date_format($date, 'j').' '.$months[date_format($date, 'F')].' '.date_format($date, 'Y'); $complete_date_now_us = date_format($date, 'Y-m-d'); $jour_now = $days[date_format($date, 'l')]; $year_now = date_format($date, 'Y'); $heure_now = date_format($date, 'H:i'); // Calcul de la date du lundi de Pâques $calc_paques = 57 - (((11 * (($year_now % 19) + 1) + (-(floor($year_now / 100)) + (floor((floor($year_now / 100)) / 4)) + (floor((8 * ((floor($year_now / 100)) + 11)) / 25)))) % 30 + 30) % 30) - ((((50 - ((((11 * (($year_now % 19) + 1) + (-(floor($year_now / 100)) + (floor((floor($year_now / 100)) / 4)) + (floor((8 * ((floor($year_now / 100)) + 11)) / 25)))) % 30) + 30) % 30) - (floor((551 - 19 * ((((11 * (($year_now % 19) + 1) + (-(floor($year_now / 100)) + (floor((floor($year_now / 100)) / 4)) + (floor((8 * ((floor($year_now / 100)) + 11)) / 25)))) % 30) + 30) % 30) + (($year_now % 19) + 1)) / 544))) % 7) + ((((9 - 2 * ((floor($year_now / 100)) % 4)) % 7) + ($year_now % 100) + (floor(($year_now % 100) / 4))) % 7)) % 7) - (floor((551 - 19 * ((((11 * (($year_now % 19) + 1) + (-(floor($year_now / 100)) + (floor((floor($year_now / 100)) / 4)) + (floor((8 * ((floor($year_now / 100)) + 11)) / 25)))) % 30) + 30) % 30) + (($year_now % 19) + 1)) / 544)); if (($calc_paques + 1) > 31) { if ((($calc_paques + 1) - 31) < 10) { $day_paques = '0'.(($calc_paques + 1) - 31); } $paques = $year_now.'-04-'.$day_paques; } else { if (($calc_paques + 1) < 10) { $day_paques = '0'.($calc_paques + 1); } $paques = $year_now.'-03-'.$day_paques; } // Jours fériés $jours_feries = array($year_now.'-01-01', $paques, $year_now.'-05-01', $year_now.'-05-08', $year_now.'-07-14', $year_now.'-08-15', $year_now.'-11-01', $year_now.'-11-11', $year_now.'-12-25', '2018-10-13'); // Envoie des variables aux templates self::$smarty->assign(array( 'hor_boutique' => $hor_boutique, 'hor_servcli' => $hor_servcli, 'matin_heure_debut' => $matin_heure_debut, 'matin_heure_fin' => $matin_heure_fin, 'am_heure_debut' => $am_heure_debut, 'am_heure_fin' => $am_heure_fin, 'complete_date_now' => $complete_date_now, 'complete_date_now_us' => $complete_date_now_us, 'heure_now' => $heure_now, 'jours_feries' => $jours_feries, 'jour_now' => $jour_now )); $isMobile = false; if ($this->context->isTablet()) { $isMobile = false; } elseif ($this->context->isMobile()) { $isMobile = true; } self::$smarty->assign('isMobile', $isMobile); return parent::initHeader(); } } Sincèrement, j'espère vraiment que c'est "juste" un problème dans l'override ! Merci Janett pour tes interventions. Edited June 5, 2019 by Thomas commentaire *START ADD* mal placé dans le premier override (see edit history) Link to comment Share on other sites More sharing options...
Janett Posted June 7, 2019 Share Posted June 7, 2019 (edited) Bon en fait la plupart de tes overrides sont inutiles, ce serait plus propre d'ajouter ça via des modules en utilisant les hooks. Faire des overrides c'est dangereux et c'est une très mauvaise pratique, car modifier le comportement du code natif ça peut faire planter tes mises à jour futures. Il ne faut les utiliser uniquement lorsque tu n'as aucun hook à disposition pour faire ce dont tu as besoin car c'est ta seule solution mais il faut vraiment éviter. Je n'ai pas le temps de regarder en détails maintenant, mais je reviens vers toi dès que possible Edited June 7, 2019 by Janett (see edit history) Link to comment Share on other sites More sharing options...
Thomas Posted June 12, 2019 Author Share Posted June 12, 2019 Merci pour ton retour @Janett. Il faut vraiment que je me penche sur la création de module... Merci pour la recommandation. Je vais voir comment je peux changer cela. Je suis ouvert à toute remarque si tu as le temps de faire un tour plus approfondi en tout cas ! 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