Jump to content

Explications sur l'OVERRIDE


Recommended Posts

Bonjour,

 

J'essaie depuis ce matin de faire un override sur une toute petite modification de la classe tools.php.

 

J'ai bien sauvegarder ce fichier en local, j'ai bien modifié le nom de la classe avec extended :

class Tools extends ToolsCore

 

J'ai modifié juste 2 lignes pour éviter d'avoir le fil d'ariane en double dans la fonction publique : getPath et getFullPath.

 

J'ai recopier le Tolls.php en entier dans /override/classes/ et là mon site s'est retrouvé bien planté.

 

Quelqu'un aurait-il une idée ?

 

Merci

Patrick

Link to comment
Share on other sites

Bonjour,

 

La fonction override est parfois assez capricieuse, mais généralement en suivant bien les règles ça marche plutôt bien.

Notamment il vaut mieux ne garder dans le fichier override que le stricte nécessaire (donc la fonction modifiée)

 

Ton fichier override devrait donc ressembler à ça :

<?php

class Tools extends ToolsCore
{
public static function getPath($id_category, $path = '', $linkOntheLastItem = false, $categoryType = 'products')
{
		/* ici la fonction getPath modifiée */
}
}

 

Si avec ça ça plante encore, peut-être qu'il y a une erreur qui s'est glissée dans ta modif...

Link to comment
Share on other sites

  • 3 weeks later...

Pas de solution ou de guide pour ce problème ?

 

J'ai également modifié la fonction getPath() pour avoir un fil d'Ariane avec des microdata Schema.org dedans. Ben ça ne marche pas malgré le respect de la mise en place de la surcharge.

  1. Je crée un fichier /override/classes/Tools.php vide et j'y ajoute les lignes suivantes :
    class Tools extends ToolsCore // Une classe Tools qui étend la classe ToolsCore définie dans /classes/ (l'orginal)
    				{
    					/**
    					 * Get the user's journey
    					 *
    					 * @param integer $id_category Category ID
    					 * @param string $path Path end
    					 * @param boolean $linkOntheLastItem Put or not a link on the current category
    					 * @param string [optionnal] $categoryType defined what type of categories is used (products or cms)
    					 */
    					public static function getPath($id_category, $path = '', $linkOntheLastItem = false, $categoryType = 'products')// etc. etc.


  2. Je vide tout le cache : je désactive tous les caches, puis je vais vider /tools/smarty/compile/ (SAUF le 'index.php' !). Ça peut se trouver sous smarty_v2 si vous utiliser la v2, j'utilise la v3 perso.
  3. Ça marche ! Mon fil d'Ariane est optimisé pour la sémantique. Puis les problèmes commencent, les modif's de fiches produits dans l'admin commencent à mouliner et le comportement général part en vrille... J'ai bien tenté de copier tout le fichier Tools.php et de le modifier (nom de le classe) en le copiant sous /override/classes/ mais rien à faire, il y a conflit.

À quoi sert ce _Tools.php et pourquoi la surcharge ne marche-t-elle pas partout de la même manière, je ne saurais le dire. Perso je vais modifier mon fil d'Ariane via un module ou bien modifier la classe pour qu'elle sache utiliser un breadcrumb.tpl cat là tout est en dur dans le PHP avec des "echo", ça ne respecte pas le modèle de Prestashop. J'ai beaucoup de soucis avec la surcharge en général, alors soit c'est mal implémenté, soit je ne comprends rien et je suis mauvais, ce qui est tout à fait possible.

Link to comment
Share on other sites

Si tu as pris le temps de répondre, tu aurais aussi pu prendre le temps de lire tout le post : j'ai tout détaillé, ce qui marche, ce qui ne marche pas. Quant au problème, il n'a rien de nouveau et est tout à fait dans le sujet : l'override de Tools.php ne fonctionne pas.

Link to comment
Share on other sites

Bonjour,

 

coeos.pro n'a pas tord, ton problème semble différent puisque l'override a l'air de fonctionner mais ça provoque des problèmes ailleurs...

 

Comme je l'ai déjà dis plus haut, l'override est parfois assez capricieuse.

Mais dans ton cas je pencherais plus pour un problème dans le code modifié de la fonction getPath()

Cette fonction semble souvent appelé, aussi bien en front qu'en back office, alors on peut supposer que si quelque chose cloche la dedans ça peut facilement se répercuter ailleurs.

 

Le fichier _Tools.php est une classe de débogage (il ajoute des fonctions de débogage supplémentaires lorsqu'on le renomme en Tools.php)

 

Tu ne donne pas non plus ta version de Prestashop, mais pour comparaison voici le contenu de mon fichier override/classes/Tools.php (PS1.4.9)

Mes modifs consistent justement à ajouter les fonctionnalité de Rich Snippet Google au fil d’ariane, et ça marche parfaitement sans aucune interférence ailleurs.

Si ça peut aider...

<?php

class Tools extends ToolsCore
{
public static function getPath($id_category, $path = '', $linkOntheLastItem = false, $categoryType = 'products')
{
	global $link, $cookie;

	if ($id_category == 1)
		return '<span class="navigation_end">'.$path.'</span>';

	$pipe = htmlentities(Configuration::get('PS_NAVIGATION_PIPE'), ENT_QUOTES, 'UTF-8');
	if (empty($pipe))
		$pipe = '>';

	$fullPath = '';
	if ($categoryType == 'products')
	{
		$category = Db::getInstance()->getRow('
		SELECT nleft, nright
		FROM '._DB_PREFIX_.'category
		WHERE id_category = '.(int)$id_category);

		if (isset($category['nleft']))
		{
			$categories = Db::getInstance()->ExecuteS('
			SELECT c.id_category, cl.name, cl.link_rewrite
			FROM '._DB_PREFIX_.'category c
			LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = c.id_category)
			WHERE c.nleft <= '.(int)$category['nleft'].' AND c.nright >= '.(int)$category['nright'].' AND cl.id_lang = '.(int)$cookie->id_lang.' AND c.id_category != 1
			ORDER BY c.nleft ASC');

			$n = 1;
			$nCategories = count($categories);
			foreach ($categories as $category)
				$fullPath .=
					(($n < $nCategories OR $linkOntheLastItem) ? '<div itemscope itemtype="http://data-vocabulary.org/Breadcrumb"><a href="'.self::safeOutput($link->getCategoryLink((int)$category['id_category'], $category['link_rewrite'])).'" title="'.htmlentities($category['name'], ENT_NOQUOTES, 'UTF-8').'" itemprop="url"><span itemprop="title">' : '').
					htmlentities($category['name'], ENT_NOQUOTES, 'UTF-8').
					(($n < $nCategories OR $linkOntheLastItem) ? '</span></a></div>' : '').
					(($n++ != $nCategories OR !empty($path)) ? '<span class="navigation-pipe">'.$pipe.'</span>' : '');

			return $fullPath.$path;
		}
	}
	elseif ($categoryType === 'CMS')
	{
		$category = new CMSCategory((int)($id_category), (int)($cookie->id_lang));
		if (!Validate::isLoadedObject($category))
			die(self::displayError());
		$categoryLink = $link->getCMSCategoryLink($category);

		if ($path != $category->name)
			$fullPath .= '<div itemscope itemtype="http://data-vocabulary.org/Breadcrumb"><a href="'.self::safeOutput($categoryLink).'" itemprop="url"><span itemprop="title">'.htmlentities($category->name, ENT_NOQUOTES, 'UTF-8').'</span></a></div><span class="navigation-pipe">'.$pipe.'</span>'.$path;
		else
			$fullPath = ($linkOntheLastItem ? '<div itemscope itemtype="http://data-vocabulary.org/Breadcrumb"><a href="'.self::safeOutput($categoryLink).'" itemprop="url"><span itemprop="title">' : '').htmlentities($path, ENT_NOQUOTES, 'UTF-8').($linkOntheLastItem ? '</span></a></div>' : '');

		return self::getPath((int)($category->id_parent), $fullPath, $linkOntheLastItem, $categoryType);
	}
}
}

Link to comment
Share on other sites

Bonjour,

 

Merci beaucoup de vos réponses - en effet j'ai oublié, mon appli prestashop est la 1.4.9.0.

 

@Mellow Nous avons exactement la même classe en surcharge, mes problèmes viennent en fait d'effets de bord très étrange causés par le module ebay depuis peu, tout mon BO est touché, j'ai un client qui hurle, c'est un peu la 4ième dimension ^^...

 

Le fil d'Ariane (ou « breadcrumb ») fonctionne parfaitement ainsi, merci.

Link to comment
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...