Jump to content
Thomas

[PS 1.6.1.4] Modification de fichier non prise en compte

Recommended Posts

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 !

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Dans Paramètres avancés > Performances j'ai bien "Désactiver toutes les surcharges" sur NON.

J'avais oublié de le préciser ^^

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites
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 :

  1. /cache/smarty/cache/
  2. /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

Share this post


Link to post
Share on other sites

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 :

  1. /cache/smarty/cache/
  2. /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 !

Share this post


Link to post
Share on other sites

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 by Thomas (see edit history)

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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 :

param-avancees-perf-override.jpg.b3fbfb034ad3e7e959d7c858771e46d2.jpg

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 by Thomas
commentaire *START ADD* mal placé dans le premier override (see edit history)

Share this post


Link to post
Share on other sites

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 by Janett (see edit history)

Share this post


Link to post
Share on other sites

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 !

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