Jump to content

Module sitemap me fait n'importe quoi


Recommended Posts

Bonjour,

 

La boutique est en 1.5.4.1, langues fr et gb installées

Je suis en phase de test et je viens de regarder un peu le contenu des sitemap généré

Mis à par les fiches produits qui sont OK, tout les autres liens renvoient vers un 404

 

exemple

sitemap :

racine/fr/best-sales (fichier fr)

racine/gb/best-sales (fichier gb)

 

url correcte :

/fr/meilleures-ventes

/gb/meilleures-ventes

 

Je ne comprend pas bien d'où vient le souci

D'avance merci pour vos conseils avisés ;)

Stéph

Link to comment
Share on other sites

  • 3 weeks later...

Je confirme le bug. En plus ces liens mi-anglais mi-français sont en https si le SSL est activé. Je vais jeter un coup d'oeil dans le code du module.

 

EDIT

 

En fait l'url_rewrite est selectionné sans que la langue soit précisée, alors la première valeur est utilisée. Cela a l'air de fonctionner en modifiant (l.183 de gsitemap.php)


$url_rewrite = Db::getInstance()->getValue('SELECT url_rewrite FROM `'._DB_PREFIX_.'meta_lang` WHERE `id_meta` = '.(int)$meta['id_meta']);

 

par

 

$url_rewrite = Db::getInstance()->getValue('SELECT url_rewrite FROM `'._DB_PREFIX_.'meta_lang` WHERE `id_meta` = '.(int)$meta['id_meta'] . ' AND `id_lang` = ' . (int) $lang['id_lang']);

J'ai ajouté :

 

' AND `id_lang` = ' . (int) $lang['id_lang']

 

pour que l'url_rewrite soit dans la bonne langue.

 

 

 

Pour le problème du SSL, il faut changer (la home page n'a pas à être en SSL) :

 

private function _getHomeLink(&$link_sitemap, $lang, &$index, &$i)
{
//return $this->_addLinkToSitemap($link_sitemap, array('type' => 'home', 'page' => 'home', 'link' => 'http'.(Configuration::get('PS_SSL_ENABLED') ? 's' : '').'://'.Tools::getShopDomain(false, true).__PS_BASE_URI__, 'image' => false), $lang['iso_code'], $index, $i, -1);
return $this->_addLinkToSitemap($link_sitemap, array('type' => 'home', 'page' => 'home', 'link' => 'http://'.Tools::getShopDomain(false, true).__PS_BASE_URI__, 'image' => false), $lang['iso_code'], $index, $i, -1);
}

 

 

Remplacer :

 

$url = (Configuration::get('PS_SSL_ENABLED') ? Tools::getShopDomainSsl(true) : Tools::getShopDomain(true));

 

par

 

$url = 'http://'.Tools::getShopDomain(false, true);

 

Le seul problème que cela pose c'est pour les pages qui doivent être en SSL comme la page contact (mais doivent-elles vraiment faire partie d'un sitemap ?).

Pour que cela soit vraiment propre il faudrait savoir si pour chaque page le SSL est activé ou pas. D'après moi ce n'est pas évident à faire, car le SSL est activé dans les controllers par l'utilisation d'une variable public $ssl = true;donc à moins de parser tous les controllers on ne peut pas récupérer cette variable. Ou il faudrait pouvoir créer une instance de controller et en extraire la variable. Du genre :

 

$contact_controller = new ContactControllerCore();
$contact_controller->ssl;

 

ça a l'air de marcher... maintenant récupérer le nom de chaque controller via une fonction :

 

 

function getControllerClassName($url_rewrite)
{
//could be more efficient with a loop
$url_rewrite = str_replace("-", " ", $url_rewrite);
$url_rewrite = ucwords($url_rewrite);
$url_rewrite = str_replace(" ", "", $url_rewrite);
return $url_rewrite . "ControllerCore";
}

 

Et en plus pour que ça marche vraiment il ne faudrait pas utiliser $url_rewrite mais la valeur de la requête : SELECT page FROM ps_meta;

Et faire un traitement différent pour les modules...

 

Pour résumer, il faudrait quelque chose qui ressemble à ça :

 

 $page = Db::getInstance()->getValue('SELECT page FROM `'._DB_PREFIX_.'meta` WHERE `id_meta` = '.(int)$meta['id_meta']);
 if(!empty($page))
 {
  //could be more efficient with a loop
  if(substr($page, 0, strlen("module-")) === "module-")
  {
   $page = str_replace("module-", "", $page);
   $page = str_replace("-", " ", $page);
   $page = ucwords($page);
   $page = str_replace(" ", "", $page);
   $page .= "ModuleFrontController";
  }
  else
  {
   $page = str_replace("-", " ", $page);
   $page = ucwords($page);
   $page = str_replace(" ", "", $page);
   $page .= "ControllerCore";
  }
  $controller = new $page();
  //$controller->ssl => Tools::getShopDomainSsl(true)
 }

 

Mais quid des modules qui ont des noms mal cassés (sic) ? Et d'ailleurs cela ne semble pas marcher avec les modules... J'abandonne :) En plus je viens de me rendre compte que ssl est toujours false. Fini pour moi :(

Edited by emily_d (see edit history)
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...