Toutes les clefs pour réussir dans le e-commerce

Mes modules Prestashop

Override pour corriger le problème des url sous prestashop 1.5

Dans mon article précédent je donnais une astuce pour corriger le problème des accents dans les url sous Prestashop 1.5. Cette astuce fonctionne mais à deux défauts (merci Thierry de l’avoir signalé):

Elle modifie les fichiers sources de Prestashop ce qui peut poser problème pour une mise à jour future. De plus elle ne corrige pas un second problème qui peut apparaître lorsque vous ajoutez un caractère interdit à la fin du nom de votre produit, en effet un produit nommé “où allons nous ?” aurait comme url “ou-allons-nous-“, le dernier tiret étant inutile autant le supprimer.

Il suffit de faire un override sur la fonction createUrl du dispatcher.

“override/classes/Dispatcher.php”


class Dispatcher extends DispatcherCore
{
public function createUrl($route_id, $id_lang = null, array $params = array(), $force_routes = false, $anchor = '')
{
if (!$id_lang)
$id_lang = Context::getContext()->language->id;

if (!isset($this->routes[$id_lang][$route_id]))
{
$query = http_build_query($params, '', '&');
$index_link = $this->use_routes ? '' : 'index.php';
return ($route_id == 'index') ? $index_link.(($query) ? '?'.$query : '') : 'index.php?controller='.$route_id.(($query) ? '&'.$query : '').$anchor;
}
$route = $this->routes[$id_lang][$route_id];

// Check required fields
$query_params = isset($route['params']) ? $route['params'] : array();
foreach ($route['keywords'] as $key => $data)
{
if (!$data['required'])
continue;

if (!array_key_exists($key, $params))
die('Dispatcher::createUrl() miss required parameter "'.$key.'" for route "'.$route_id.'"');
$query_params[$this->default_routes[$route_id]['keywords'][$key]['param']] = $params[$key];
}

// Build an url which match a route
if ($this->use_routes || $force_routes)
{
$url = $route['rule'];
$add_param = array();
foreach ($params as $key => $value)
{
if($key=="rewrite") {
$params[$key] = Tools::replaceAccentedChars($params[$key]);
if(strlen($params[$key])==strrpos($params[$key], "-")+1)
$params[$key] = substr($params[$key],0,-1);
}

if (!isset($route['keywords'][$key]))
{
if (!isset($this->default_routes[$route_id]['keywords'][$key]))
$add_param[$key] = $value;
}
else
{
if ($params[$key])
$replace = $route['keywords'][$key]['prepend'].$params[$key].$route['keywords'][$key]['append'];
else
$replace = '';
$url = preg_replace('#\{([^{}]+:)?'.$key.'(:[^{}])?\}#', $replace, $url);
}
}
$url = preg_replace('#\{([^{}]+:)?[a-z0-9_]+?(:[^{}])?\}#', '', $url);
if (count($add_param))
$url .= '?'.http_build_query($add_param, '', '&');
}
// Build a classic url index.php?controller=foo&...
else
{
$add_params = array();
foreach ($params as $key => $value)
if (!isset($route['keywords'][$key]) && !isset($this->default_routes[$route_id]['keywords'][$key]))
$add_params[$key] = $value;

if (!empty($route['controller']))
$query_params['controller'] = $route['controller'];
$query = http_build_query(array_merge($add_params, $query_params), '', '&');
if ($this->multilang_activated)
$query .= (!empty($query) ? '&' : '').'id_lang='.(int)$id_lang;
$url = 'index.php?'.$query;

}

return $url.$anchor;
}
}

J’ai juste rajouté le code suivant


if($key=="rewrite") {
$params[$key] = Tools::replaceAccentedChars($params[$key]);
if(strlen($params[$key])==strrpos($params[$key], "-")+1)
$params[$key] = substr($params[$key],0,-1);
}

Qui permet de supprimer les accents ET de supprimer les tirets inutiles qui peuvent apparaître.

 

A noter:

Cette solution ne corrige pas tous les problèmes. En effet vos urls fonctionneront sans les accents mais elles seront toujours enregistrées avec (les accents) en base de données ce qui n’est pas très cohérent. Le problème vient en partie d’une fonction javascript utilisée dans l’admin (str2url) qui génère à la volée (et systématiquement) l’url optimisée avec accents. Par conséquent vos url dans la base de données sont systématiquement réécrites même si vous souhaitez les modifier manuellement. Il n’y pas de solution pour faire un override de cette fonction javascript, par conséquent soit vous modifiez directement le fichier js au risque de perdre vos corrections lors d’une mise à jour, soit vous attendez que la team Prestashop corrige le problème.

Poster un Commentaire

7 Commentaires sur "Override pour corriger le problème des url sous prestashop 1.5"

Recevoir un email pour
avatar
Trier par:   plus récent | plus vieux | Plus de vote
Thierry
Invité

Je te félicite Olivier, il est vrai que cette fonction est plus cohérente que la mienne ; j’ai cherché à solutionner rapidement le problème :-)

Toutefois, je te confirme que l’overrite de la classe Tools (dans mon cas en tous cas, ou j’importe les catégories d’OsCommerce et fait donc appel à la fonction Tools->str2url(..) rend nettement plus propre la BDD (il me semble également que cette fonction est utilisée pour l’enregistrement d’autres url que la fiche produit, mais il faut que je vérifie…)

Ensuite, il est vrai, qu’à part ré-écrire la fonction js de l’admin, je n’ai pas trouvé d’autres solutions pour régler le problème de la saisie en admin.

Autre détail qui n’est pas des moindres concernant les url …

Lorsque tu modifies l’url pour en définir une comme tu le souhaites, à l’enregistrement de la fiche produit, cette dernière est écrasée par le nom du produit !

Adieu le référencement, si tu te permets de mettre autre chose que le nom du produit :-(

Alice
Invité
Alice

Merci pour cette solution, ça marche parfaitement!

Trafiquant
Invité

Mmm… J’essaye d’appliquer cette solution sur un Prestashop 1.5.2 et j’obtiens une erreur 500… Qu’aurais-je oublié ?

Faut-il combiner cette solution ET la précédente ? J’ai pour ma part overridé le Dispatcher.php mais également le AdminMetaController.php au lieu d’aller directement le modifier. J’ai également tenté de modifier le AdminMetaController.php au lieu de l’overrider, même problème. A priori c’est l’override sur le Dispatcher.php qui me cause la Internal Server Error…

Thierry HUGUET
Invité
Thierry HUGUET

J’ai pu modifier avec succès la fonction str2url() dans admin.js afin que les caractères accentués n’apparaissent plus.

Mais je ne sais pas où modifier le code PHP ou JS pour éviter que l’url simplifiée soit systématiquement réintialisé quand j’édite un produit dans le backoffice. Pouvez-vous m’aiguiller svp ?

Merci
Thierry
PS: je suis toujours sur PS 1.5.2.0

Thierry HUGUET
Invité
Thierry HUGUET

Merci ManiT4c
Je vais alors tester très rapidement la 1.5.6.2.

wpDiscuz