Jump to content

[Tools] URL Rewriting + (MAJ 1.2)


Recommended Posts

Bonjour,

 

Vu que j'ai du le développer pour un client (et que ce module est pas une demande spécifique au client), je me suis dis que je pourrais le partager afin d'en faire profiter la communauté.

 

Ce module permet donc une gestion manuelle de l'URL Rewriting.

 

Exemple :

www.monsite.com/apn/

=> Renvoit vers la categorie des appareils photos numériques

www.monsite.com/apn/Kodak-3000-plus.html

=> Renvoit vers le produit Kodak 3000 plus

 

Ce qui permet d'avoir une gestion des URL différentes de celles actuelles où l'identifiant est présent.

 

Todo : (choses prévues dans les prochaines versions)

- Gestion des Fabricants

- Gestion des Fournisseurs

- Génération automatique pour les Fabricants / Fournisseurs

- Changement des liens présents sur les pages

- Ajout de langues

 

NB :

Actuellement le module ne change aucuns liens! Il n'ajoute en fait que de nouvelles URL pour accéder à vos produits et catégories. Les liens dans les pages restent donc inchangés! (ça viendra dans les prochaines versions)

 

Infos :

N'hésitez pas à me donner vos avis et problèmes s'il y en a.

Le modules est livré sans les pages de langues, mais a été développé en français.

 

Notes :

1.2

+ Génération automatique des URLs pour les catégories

+ Génération automatique des URLs pour les produits

* Correction d'un bug d'accès aux URLs des catégories

1.1

* Correction d'un bug

1.0

+ Version de base

urlrewritingplus_1_2.zip

980_58rdg7mlpzsprwcJowRR_t

urlrewritingplus_12.zip

Share this post


Link to post
Share on other sites

Bonjour,

 

Je viens de mettre à jour le module. Si jamais vous avez des questions ou autres, n'hésitez pas!

Si jamais une personne à le courage de traduire le module, n'hésitez pas à m'envoyer les fichiers de langues, je les ajouterais au module avec évidemment un remerciement pour vous sur cette page (et pq pas sur le module.

 


 

@Cuga & ME-Commerce

 

Sry, but I'm weak in english... So if another person is ready for translate, I'm ok for include the english file in my module!

Share this post


Link to post
Share on other sites

Bonjour,

 

Je viens de mettre à jour le module. Si jamais vous avez des questions ou autres, n'hésitez pas!

Si jamais une personne à le courage de traduire le module, n'hésitez pas à m'envoyer les fichiers de langues, je les ajouterais au module avec évidemment un remerciement pour vous sur cette page (et pq pas sur le module.

 


 

@Cuga & ME-Commerce

 

Sry, but I'm weak in english... So if another person is ready for translate, I'm ok for include the english file in my module!

Hi PierreYves,

 

I've had a look at your module and I see that you include the translation in your main file. Is it possible to keep your translations in another file e.g. fr.php so I can just copy this and translate it to en.php and so forth?

Share this post


Link to post
Share on other sites

Pour ceux qui voudraient changer tous les liens de leurs produits et catégories par les nouveaux liens qu'ils ont crée, voici une petite manipulation.

 

icone+attention.png Je ne met pas cette modif dans l'archive de base car elle modifie un fichier "CORE" de Prestashop (Je suis à la recherche d'une autre solution). Cependant elle fonctionne et n'affecte en aucun cas l'utilisation de prestashop.

 

Soit vous faites les modifications vous-même, soit vous prenez le fichier qui est en pièce jointe à ce post

 

Dans le fichier "classe/Link.php"

 

Remplacer :

public function getProductLink($id_product, $alias = NULL, $ean13 = NULL)
{
if (!isset($this->allow)) $this->allow = 0;
if (is_object($id_product))
	return ($this->allow == 1)?(__PS_BASE_URI__.intval($id_product->id).'-'.$id_product->link_rewrite.($id_product->ean13 ? '-'.$id_product->ean13 : '').'.html') : 
	(_PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product->id));
elseif ($alias)
	return ($this->allow == 1)?(__PS_BASE_URI__.intval($id_product).'-'.$alias.($ean13 ? '-'.$ean13 : '').'.html') : 
	(_PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product));
else
	return _PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product);
}

 

Par :

public function getProductLink($id_product, $alias = NULL, $ean13 = NULL)
{
if (!isset($this->allow)) $this->allow = 0;

// Edit by PY (piedboeuf@gmail.com)
// Check if Url Rwriting + is installed
$URLRLPLUS = false;
$modules = Module::getModulesInstalled();
foreach ($modules as $module) {
	if ($module['name'] != 'urlrewritingplus')
		continue;
	$URLRLPLUS = true;
}

if ($URLRLPLUS) {
	if ($this->allow == 0)
		return _PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product);
		if (!$link = Db::getInstance()->ExecuteS('SELECT `id_url`, `type`, `id`, `url` FROM '._DB_PREFIX_.'urlrplus WHERE `type` IN ('productauto', 'product') AND `id` = '.intval($id_product)))
			return _PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product);
		if (count($link) == 0)
			__PS_BASE_URI__.intval($id_product).'-'.$alias.($ean13 ? '-'.$ean13 : '').'.html';
	return __PS_BASE_URI__.$link[0]['url'].'.html';
}
// Fin

if (is_object($id_product))
	return ($this->allow == 1)?(__PS_BASE_URI__.intval($id_product->id).'-'.$id_product->link_rewrite.($id_product->ean13 ? '-'.$id_product->ean13 : '').'.html') : 
	(_PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product->id));
elseif ($alias)
	return ($this->allow == 1)?(__PS_BASE_URI__.intval($id_product).'-'.$alias.($ean13 ? '-'.$ean13 : '').'.html') : 
	(_PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product));
else
	return _PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product);
}

 

Et remplacer :

public function getCategoryLink($id_category, $alias = NULL)
{
if (is_object($id_category))
	return ($this->allow == 1) ? (_PS_USE_SSL_.__PS_BASE_URI__.intval($id_category->id).'-'.$id_category->link_rewrite) : 
	(_PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category->id));
if ($alias)
	return ($this->allow == 1) ? (_PS_USE_SSL_.__PS_BASE_URI__.intval($id_category).'-'.$alias) :
	(_PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category));
return _PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category);
}

 

Par :

public function getCategoryLink($id_category, $alias = NULL)
{
// Edit by PY (piedboeuf@gmail.com)
// Check if Url Rwriting + is installed
$URLRLPLUS = false;
$modules = Module::getModulesInstalled();
foreach ($modules as $module) {
	if ($module['name'] != 'urlrewritingplus')
		continue;
	$URLRLPLUS = true;
}

if ($URLRLPLUS) {
	if ($this->allow == 0)
		return _PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category);
		if (!$link = Db::getInstance()->ExecuteS('SELECT `id_url`, `type`, `id`, `url` FROM '._DB_PREFIX_.'urlrplus WHERE `type` IN ('categoryauto', 'category') AND `id` = '.intval($id_category)))
			return _PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category);
		if (count($link) == 0)
			_PS_USE_SSL_.__PS_BASE_URI__.intval($id_category->id).'-'.$id_category->link_rewrite;
	return __PS_BASE_URI__.$link[0]['url'].'/';
}
// Fin

if (is_object($id_category))
	return ($this->allow == 1) ? (_PS_USE_SSL_.__PS_BASE_URI__.intval($id_category->id).'-'.$id_category->link_rewrite) : 
	(_PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category->id));
if ($alias)
	return ($this->allow == 1) ? (_PS_USE_SSL_.__PS_BASE_URI__.intval($id_category).'-'.$alias) :
	(_PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category));
return _PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category);
}

Link.php

Share this post


Link to post
Share on other sites

I've had a look at your module and I see that you include the translation in your main file. Is it possible to keep your translations in another file e.g. fr.php so I can just copy this and translate it to en.php and so forth?

 

OK, no problem. In next archive, I will be include a fr.php file with translation for french

Share this post


Link to post
Share on other sites

I've had a look at your module and I see that you include the translation in your main file. Is it possible to keep your translations in another file e.g. fr.php so I can just copy this and translate it to en.php and so forth?

 

OK, no problem. In next archive, I will be include a fr.php file with translation for french

Thank you!  8)

 

You're doing a great job and developing some nice modules.. Is it too much asked to do the same thing for all your modules?

Share this post


Link to post
Share on other sites

Salut,

 

Comme pour l'autre module, il faut que tu teste... Hélas je développe tous sous la 1RC3.

 

Seulement pour ce module j'utilise pas mal de fonctions, et je doute donc que celui-ci fonctionne avec la 097...

 

Comme on le dit, qui verra vivra !

Ou plutôt, qui testera verra !  ::)

Share this post


Link to post
Share on other sites

Hello,

can it be that because of new forum, there is no attachment for modul download anymore!?
otherwise, may be Pierre-Yves can kindly post his module again?

Bonjour,

se fait-il que parce que de nouveau forum, il n'existe pas de module de saisie pour télécharger plus?
autrement, mai être Pierre-Yves peut bien vouloir envoyer son nouveau module?

Share this post


Link to post
Share on other sites

J’essai de t’envoyer la traduction du fichier urlrewritingplus_12.zip en Espagnol et ne peux pas, j'ai converti la feuille de Word à .rar mais le forum ne l'admet pas.
Où peux-je te l’envoyer?
Merci

Share this post


Link to post
Share on other sites

Salut! sympa ton petit module, bon boulot :)

Il y a cependant des petits problèmes avec les accents, donc rien de bien grave à corriger :)

exemple :

localhost/Cartilage-de-Requin---G--lules.html
renvoit vers le produit "Cartilage de Requin - Gélules"



tous les accents sont remplacés par des "-" donc ça fausse un peu les urls et on perd ainsi légèrement l'interet d'avoir des belles urls bien propres si chèèèèèères à nos amis les moteurs de recherche.

une petite fonction qui parse et supprime les caractères spéciaux serait donc la bienvenue ;)

@++

Share this post


Link to post
Share on other sites

Bjr Pierre-Yves:
Quelle est la derniere:
urlrewritingplus_1_2.zip (File Size: 9KB - Downloads: 31) ???
urlrewritingplus_12.zip (File Size: 6259KB - Downloads: 39) ???

Share this post


Link to post
Share on other sites
  • 4 weeks later...

Bonjour,

Merci pour ce module Pierre-Yves et pour les autres modules par la même occasion,

j'ai une petite question sur ce module :

si j'ai deux produits du même nom :

si on considère qu'un produit est en état de fonctionnement et l'autre en panne.

mais les deux sont en vente !

est que ce module ne risque pas de m'afficher ces deux produits avec le même nom et du coup il risque d'induire en erreur l'utilisateur ou le moteur de recherche ?

Merci d'une réponse...

à bientôt..

Share this post


Link to post
Share on other sites

Salut et merci.

Tout d'abord, si ça ne te dérange pas je préfèrerais rester en anglais sur ce post (on est dans la partie anglaise...). Pour toute discussion à propos de mes modules, tu les retrouve sur www.psfrance.org

Soit, je vais te répondre ici tout de même :)

Si effectivement... 2 produits ayant le même nom créera un "problème". L'url générée renverra vers seulement un des deux produits. On aura donc un produit inaccessible via ce système. C'est pour cela qu'il est possible de spécifier toi même l'url de tes produits ;) Tu peux donc pour ton produit "en panne" lui créer une url rewriting perso ;)

J'espère avoir répondu à ta demande :)

Share this post


Link to post
Share on other sites

Bonjour,

Merci de ta réponse,

je vais aller faire un tour vers psfrance.org,

mais j'ai une autre question,

est possible de faire une petite fonction du style :

si même nom ajouter le nume de catégorie à la fin ?

à bientôt...

Share this post


Link to post
Share on other sites

Bonjour,

une dernière question pour ce sujet :

comment ajouter simplement le numéro de la catégorie à la fin svp ?

merci d'avance pour ce module et de toute aide.

à bientôt...

Share this post


Link to post
Share on other sites
  • 1 month later...

Thx !!
btw, could you post the "new 1.1 version" in a new English post ?
Actually, I believe this module should be (optionally) integrated in prestashop core!!

Share this post


Link to post
Share on other sites

This is the original post translated with bablefish: http://babelfish.yahoo.com/translate_txt
a great place to translate when you need quick information.

Hello, Considering that j' have to develop it for a customer (and that this module is not a request specific to the customer), I am say that I could divide it so d' in making profit community. This module thus allows a manual management of l' URL Rewriting. Example: http://www.monsite.com/apn/ => Renvoit towards the category of the numerical cameras http://www.monsite.com/apn/Kodak-3000-plus.html => Renvoit towards the product Kodak 3000 more What allows d' to have a management of the URL different from those current where l' identifier is present. Todo: (things envisaged in the next versions) - Management of the Manufacturers - Management of the Suppliers - automatic Generation for the Manufacturers/Suppliers - Change of the bonds present on the pages - Addition of languages NB: Currently the module does not change aucuns bonds! It n' adds in fact that new URL to reach your products and categories. The bonds in the pages thus remain unchanged! (that will come in the next versions) Infos: N' do not hesitate to deliver your opinions and problems s' to me; it there of A. The modules is delivered without the pages of languages, but was developed in French. Notes: 1.2 + automatic Generation of URLs for the categories + automatic Generation of URLs for the products * Correction d' a bug d' access to URLs of the categories 1.1 * Correction d' a bug 1.0 + Initial version

Share this post


Link to post
Share on other sites
  • 2 weeks later...

Merci Pierre-yves pour ce module.
Je n'ai pas tout compris les diverses options offertes. Peut on ajouter une règle pour les produits + pour les catégories. Je crois que quelques petits exemples de ce que donne chaque bouton ne seraient pas superflus (pour moi en tous cas)
Merci encore.
Peut tu me dire également si ce magique module à la faculté de rafraichir toute les url ?

Bonne journée

Share this post


Link to post
Share on other sites

I think PrestaShop needs to implement a better rewrite method, something liek
www.foo.com/prestadir/top_category/next_category/next_category/itemName.html


Is that what this module does?

--Kevin Klika

Share this post


Link to post
Share on other sites

Salut Pierre Yves
J'ai installé ton module mais j'ai une erreur 404 quand je copie une des adresses générée, que ce soit pour un produit ou pour une catégorie. Je pense que celà doit venir de .htaccess ??? Une idée ???

merci

Share this post


Link to post
Share on other sites

Salut, et bravo pour ce module.
Je l'ai testé (ainsi que la modif du core pour modifier les liens) et ça marche nickel.
Par contre, je me heurte à un souci un peu trop compliqué pour moi : Le breadcrumb devient inutilisable et renvoie vers la page category.php?id_category=1.

Ais-je fait une erreur ou bien est-ce normal, et dans ce cas comment peut-on y remédier ??

merki !

Share this post


Link to post
Share on other sites

pour pallier TRES TEMPORAIREMENT à ce probleme en attendant une nouvelle mise a jour, tu peux dans le fichier classes/Link.php modifier ce bloc :

foreach ($_GET as $k => $value)
           if ($k != 'id_'.$type)
           {
               $ifNb = (!$nb OR ($nb AND !in_array($k, $varsNb)));
               $ifSort = (!$sort OR ($sort AND !in_array($k, $varsSort)));
               $ifPagination = (!$pagination OR ($pagination AND !in_array($k, $varsPagination)));
               if ($ifNb AND $ifSort AND $ifPagination)
                   !$array ? ($vars .= ((!$n++ AND ($this->allow == 1 OR $url == $this->url)) ? '?' : '&').urlencode($k).'='.urlencode($value)) : ($vars[urlencode($k)] = urlencode($value));
           }



remplacer par ça :

foreach ($_GET as $k => $value)
           if ($k != 'id_'.$type)
           {
               $ifNb = (!$nb OR ($nb AND !in_array($k, $varsNb)));
               $ifSort = (!$sort OR ($sort AND !in_array($k, $varsSort)));
               $ifPagination = (!$pagination OR ($pagination AND !in_array($k, $varsPagination)));
               if ($ifNb AND $ifSort AND $ifPagination)
                   !$array ? ($vars .= ((!$n++ AND ($this->allow == 1 OR $url == $this->url)) ? '&' : '&').urlencode($k).'='.urlencode($value)) : ($vars[urlencode($k)] = urlencode($value));
           }



Ce n'est pas testé avec les Manufacturers et les Suppliers mais ça devrait fonctionner comme pour les categories.

L'adresse des paginations n'est toutefois pas rewrité malgré l'appel a la fonction getCategoryLink qui est deja modifié pour l'url rewtrite +. 2nd bug, le parametre id_category=1 est toujours présent malgré qu'il soit écrasé par un autre &id_category=xx(ou xx est la bonne categorie).

Voila chef Pierre-Yves bon je suppose que t'avais deja tout remarqué car ton boulot est excellent.
EN esperant une nouvelle version de ce fabuleux module

Share this post


Link to post
Share on other sites

j'ai egalement modifié le pagination.tpl
Je ne sais pas si ça a une importance de respecter la casse sur les nom de fonctions mais bon je l'ai fait :


j'ai mis des majuscules sur les premieres ligne dans les parametres des appels a getPaginationLink :

($category, 'Category' , false ou true je sais plus, ...)
($manufacturer, 'Manufacturer', ....)
'Supplier'....etc


Voila je ne suis pas assez bon sur presta pour continuer le travail de PY donc je propose cette solution TEMPORAIRE ci-dessus.

Share this post


Link to post
Share on other sites
Moi ça ne marche pas
Y a t'il une astuce pour reconstruire les URL ???

as tu bien fait la modif dans pagination.tpl ?? j'ai vérifié et la Majuscule a de l'importance.

voila l'adresse du bouton "next" SANS modifier pagination.tpl :
http://foo/category.php?id_category=1&p=2'>http://foo/category.php?id_category=1&p=2

voila l'adresse du bouton next AVEC modifier pagination.tpl :
http://foo/category.php?id_category=1&id_category=XX&p=2

et aussi n'oublie pas de bien modifier le link.php, le bloc de mon precedent post (c'est la fonction getPaginationLink qu'il faut modifier.)

Share this post


Link to post
Share on other sites
  • 4 weeks later...

salut, je reviens un peu sur le sujet, la 1.1 beta 3 est sortie et je vais me baser dessus pour tous mes dev.
Donc je vais tester le module sur cette version et voir si il y a lieu de faire des corrections, merci py pour cette contrib très appréciée

Share this post


Link to post
Share on other sites
  • 4 weeks later...

Bonjour

Concernant le problème de Jean-Bruno, n'est-ce pas tout simplement le fait que Pierre-Yves ne reprend pas par défaut le path de la boutique dans la "reconstruction" de ses URL ?... D'ailleurs je viens de m'apercevoir que je fais de même dans mes essais de codes :cheese: puisque je reprends la variable php $_SERVER["SERVER_NAME"] ; ça ne fonctionne donc pas si la boutique n'est pas installée à la racine du nom de domaine !

(ps : je n'ai pas regardé le code de Pierre-Yves, je me fais donc l'avocat du Diable !)

Moi ce qui me dérange le plus, c'est le risque majeur de Duplicate content, déjà présent dans l'installation de base de Prestashop :blank: (au niveau des paginations et tris de catégories, et sur les produits car il semble que Google arrive à retrouver quelque part des URL non réécrites... Ce qui pénalise au final le positionnement dans les résultats de recherche !)

Share this post


Link to post
Share on other sites

As far as forum posts, whether in French or English, google translate works very well and will allow you to understand what has been posted.

Simply go here, enter your url, and any further pages you view, will be translated to the language of your choice. Should help those who need to read a particular post, but its not in your language

Google translate

Share this post


Link to post
Share on other sites
  • 4 weeks later...

Au hasard j'ai modifier la ligne 109 du fichier urlrewritingplus.php
Du coup le probleme ne se manifeste plus à l'installation mais lorsque j'essaye de configurer le module

code original de la ligne 109

    $file = fopen($rootdir.'/.htaccess', 'w+');/* 


ma modif

    $file = fopen($rootdir.'[b]/monsousdossier[/b]/.htaccess', 'w+');/* 



et toujours les erreurs suivantes donc

Notice: Undefined property: UrlRewritingPlus::$error in /var/www/vhosts/…monsousdossier/modules/urlrewritingplus/urlrewritingplus.php on line 312

Notice: Undefined property: UrlRewritingPlus::$error in /var/www/vhosts/…monsousdossier/modules/urlrewritingplus/urlrewritingplus.php on line 322

Notice: Undefined property: UrlRewritingPlus::$error in /var/www/vhosts/…monsousdossier/modules/urlrewritingplus/urlrewritingplus.php on line 327

Notice: Undefined property: UrlRewritingPlus::$error in /var/www/vhosts/…monsousdossier/modules/urlrewritingplus/urlrewritingplus.php on line 331

Share this post


Link to post
Share on other sites
  • 3 weeks later...
  • 3 weeks later...

it works for me for the products and category only , but for the cms and others doesn't. what is the solution for this ?

please anwer in enghish.

thanks!

tested on PS v1.1.

Share this post


Link to post
Share on other sites

the urlrewritingplus module is working great for me, except that it's broken the links to Viewed Products and the breadcrumb. All of those links now read "http://localhost/category.php?id_category=1".

Is there a solution for this problem?

Share this post


Link to post
Share on other sites

I fixed the problem of urlrewritingplus messing up links in the breadcrumb and the Viewed Products box by a modification of PY's modification of link.php.

classes/link.php
added code in two functions

public function getProductLink($id_product, $alias = NULL, $category = NULL, $ean13 = NULL)
   {
        if (!isset($this->allow)) $this->allow = 0;

   // Edit by PY (piedboeuf@gmail.com)
   // Update by JRE (rob@peggypigtails.com)
       // Check if Url Rwriting + is installed
       $URLRLPLUS = false;
       $modules = Module::getModulesInstalled();
       foreach ($modules as $module) {
           if ($module['name'] != 'urlrewritingplus')
               continue;
           $URLRLPLUS = true;
       }

       if ($URLRLPLUS) {
           if ($this->allow == 0)
               return _PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product->id);
     if (is_object($id_product)) {
       if (!$link = Db::getInstance()->ExecuteS('SELECT `id_url`, `type`, `id`, `url` FROM '._DB_PREFIX_.'urlrplus WHERE `type` IN (\'productauto\', \'product\') AND `id` = '.intval($id_product->id)))
       return _PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product->id);
     }
     else {
            if (!$link = Db::getInstance()->ExecuteS('SELECT `id_url`, `type`, `id`, `url` FROM '._DB_PREFIX_.'urlrplus WHERE `type` IN (\'productauto\', \'product\') AND `id` = '.intval($id_product)))
     return _PS_USE_SSL_.__PS_BASE_URI__.'product.php?id_product='.intval($id_product);
     }
            if (count($link) == 0)
                __PS_BASE_URI__.intval($id_product).'-'.$alias.($ean13 ? '-'.$ean13 : '').'.html';
           return __PS_BASE_URI__.$link[0]['url'].'.html';
       }
       // Fin



and

public function getCategoryLink($id_category, $alias = NULL)
   {

   // Edit by PY (piedboeuf@gmail.com)
   // Update by JRE (rob@peggypigtails.com)
       // Check if Url Rwriting + is installed
       $URLRLPLUS = false;
       $modules = Module::getModulesInstalled();
       foreach ($modules as $module) {
           if ($module['name'] != 'urlrewritingplus')
               continue;
           $URLRLPLUS = true;
       }

       if ($URLRLPLUS) {
           if ($this->allow == 0)
               return _PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category);
     if (is_object($id_category)) {
       if (!$link = Db::getInstance()->ExecuteS('SELECT `id_url`, `type`, `id`, `url` FROM '._DB_PREFIX_.'urlrplus WHERE `type` IN (\'categoryauto\', \'category\') AND `id` = '.intval($id_category->id)))
                return _PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category->id);
     }
     else {
            if (!$link = Db::getInstance()->ExecuteS('SELECT `id_url`, `type`, `id`, `url` FROM '._DB_PREFIX_.'urlrplus WHERE `type` IN (\'categoryauto\', \'category\') AND `id` = '.intval($id_category)))
                return _PS_USE_SSL_.__PS_BASE_URI__.'category.php?id_category='.intval($id_category);
     }
            if (count($link) == 0)
                _PS_USE_SSL_.__PS_BASE_URI__.intval($id_category->id).'-'.$id_category->link_rewrite;
           return __PS_BASE_URI__.$link[0]['url'].'/';
       }
       // Fin



I've also included my current link.php file, with these additions, in all their dubious glory. Note that this only works with friendly urls and PY's urlrewritingplus module. Also note that it's a bit of a hack, but it does the job.

Link.php

Share this post


Link to post
Share on other sites

Hi All,
I have installed the url rewriting module but i am having problems, now none of the cms pages work (http404) and the products are the same (not working http404).

how do I "restore" my shop back to how it was before I installed the module ?

Hope you can help

all the best,
cerberus22

Share this post


Link to post
Share on other sites

Hi again,

I have sorted it out (I think), I have changed the htaccess file (back to how it was before installing module) and it seems to have fixed it.

If I have "missed" something (needs to be changed to restore site back to before installing module) please let me know.

All the best,
Cerberus22

Share this post


Link to post
Share on other sites

This works just fine except that the .htaccess file is not updated and I need to type each link manually in .htaccess file :(

also, in the module screen it's still shows an .htaccess old content (it is not the same thing with what I have on current file on the root folder)

I hope you understand what I'm trying to say

Share this post


Link to post
Share on other sites
  • 1 month later...

i have installed urlrewritingplus module and also changed Link.php file but still not working. it shows modified urls in admin where rules are generated and also inserted in database but these links are not shown on site....



i hope so you will understand what i am trying to say.....

Share this post


Link to post
Share on other sites
  • 1 month later...

Hi !

Thank for this module, it's just what i need.

I take a look at the http://www.psfrance.org, but nothing about this module. (i'm french)

So, i have a question :)

I need to put the language in the url like this :

www.monsite.com/fr/maCatégorie or www.monsite.com/uk/maCatégorie



I have no idea how to do this, maybe you can help me, or in best case, you allready do this ! So tell me :)

I allready use this module and it's work fine.

Thank U !

Share this post


Link to post
Share on other sites
  • 2 weeks later...

Hey great work on the module, I've fixed a few issues, not sure if they relate only relate to v1.12 of PrestaShop, but here are the issues I've found and fixed.

i) Pagination Links broken (always defaulting to the same page)
ii) Breadcrumbs not displaying friendly URL

Here's how to fix it all of 1.12 (should work on others!)

1) Backup Classes/Link.php and Classes/Tools.php
2) Open Link.php

Find the following code:

public function getPaginationLink($type, $id_object, $nb = FALSE, $sort = FALSE, $pagination = FALSE, $array = FALSE)
   {
       if ($type AND $id_object)
           $url = $this->{'get'.$type.'Link'}($id_object, NULL);
       else
           $url = $this->url;
       $vars = (!$array ? '' : array());
       $varsNb = array('n', 'search_query');
       $varsSort = array('orderby', 'orderway');
       $varsPagination = array('p');
       $varsVarious = array('search_query');

       foreach ($_GET as $k => $value)
           if ($k != 'id_'.$type)
           {
               $ifNb = (!$nb OR ($nb AND !in_array($k, $varsNb)));
               $ifSort = (!$sort OR ($sort AND !in_array($k, $varsSort)));
               $ifPagination = (!$pagination OR ($pagination AND !in_array($k, $varsPagination)));
               if ($ifNb AND $ifSort AND $ifPagination AND !is_array($value))
                   !$array ? ($vars .= ((!$n++ AND ($this->allow == 1 OR $url == $this->url)) ? '?' : '&').urlencode($k).'='.urlencode($value)) : ($vars[urlencode($k)] = urlencode($value));
           }
       if (!$array)
           return $url.$vars;
       $vars['requestUrl'] = $url;
       if ($type AND $id_object)
           $vars['id_'.$type] = (is_object($id_object) ? intval($id_object->id) : intval($id_object));
       return $vars;
   }



Replace with:

public function getPaginationLink($type, $id_object, $nb = FALSE, $sort = FALSE, $pagination = FALSE, $array = FALSE)
   {
       $URLRLPLUS = false;
       $modules = Module::getModulesInstalled();
       foreach ($modules as $module) {
           if ($module['name'] != 'urlrewritingplus')
               continue;
           $URLRLPLUS = true;
       }

       if ($type AND $id_object)
           $url = $this->{'get'.$type.'Link'}($id_object, NULL);
       else
           $url = $this->url;
       $vars = (!$array ? '' : array());
       $varsNb = array('n', 'search_query');
       $varsSort = array('orderby', 'orderway');
       $varsPagination = array('p');
       $varsVarious = array('search_query');

       foreach ($_GET as $k => $value)
           if ($k != 'id_'.$type)
           {
               $ifNb = (!$nb OR ($nb AND !in_array($k, $varsNb)));
               $ifSort = (!$sort OR ($sort AND !in_array($k, $varsSort)));
               $ifPagination = (!$pagination OR ($pagination AND !in_array($k, $varsPagination)));
               if ($ifNb AND $ifSort AND $ifPagination AND !is_array($value))
                   !$array ? ($vars .= ((!$n++ AND ($this->allow == 1 OR $url == $this->url)) ? '?' : '&').urlencode($k).'='.urlencode($value)) : ($vars[urlencode($k)] = urlencode($value));
           }
       if (!$array)
           return $url.$vars;
       $vars['requestUrl'] = $url;
       if ($type AND $id_object)
           $vars['id_'.$type] = (is_object($id_object) ? intval($id_object->id) : intval($id_object));

       if ($URLRLPLUS) {
           if ($this->allow == 0)
               $vars['requestUrl'] = $url;
            elseif (!$link = Db::getInstance()->ExecuteS('SELECT `id_url`, `type`, `id`, `url` FROM '._DB_PREFIX_.'urlrplus WHERE `type` IN (\'categoryauto\', \'category\') AND `id` = '.$vars['id_'.$type]))
                $vars['requestUrl'] = $url;
            elseif (count($link) == 0)
                $vars['requestUrl'] = $url;
           else $vars['requestUrl'] = __PS_BASE_URI__.$link[0]['url'].'/';
       }
       // Fin
           return $vars;
   }



Find the following code:

public function goPage($url, $p)
   {
       return $url.($p == 1 ? '' : (!strstr($url, '?') ? '?' : '&').'p='.intval($p));
   }



Replace with:

public function goPage($url, $p)
   {
       return ($p == 1 ? '' : (!strstr($url, '?') ? '?' : '&').'p='.intval($p));
   }

Share this post


Link to post
Share on other sites

3) Open Classes/Tools.php

Find the following code:

static public function getPath($id_category, $path = '')
   {
       global $link, $cookie;
       $category = new Category(intval($id_category), intval($cookie->id_lang));
       if (!Validate::isLoadedObject($category))
           die (Tools::displayError());
       if ($category->id == 1)
           return ''.$path.'';
       $pipe = (Configuration::get('PS_NAVIGATION_PIPE') ? Configuration::get('PS_NAVIGATION_PIPE') : '>');
       $category_name = Category::hideCategoryPosition($category->name);
       if ($path != $category_name)
           $path = 'getCategoryLink($category)).'">'.$category_name.' '.$pipe.' '.$path;
       return Tools::getPath(intval($category->id_parent), $path);
   }



Replace with:

           static public function getPath($id_category, $path = '')
   {
       global $link, $cookie;
       $category = new Category(intval($id_category), intval($cookie->id_lang));
       if (!Validate::isLoadedObject($category))
           die (Tools::displayError());
       if ($category->id == 1)
           return ''.$path.'';
       $pipe = (Configuration::get('PS_NAVIGATION_PIPE') ? Configuration::get('PS_NAVIGATION_PIPE') : '>');
       $category_name = Category::hideCategoryPosition($category->name);
       if ($path != $category_name)
           $path = 'getCategoryLink($category->id)).'">'.$category_name.' '.$pipe.' '.$path;
       return Tools::getPath(intval($category->id_parent), $path);
   }



All tested and working in PrestaShop 1.2 B2 (and I assume the final when it's released!)

Share this post


Link to post
Share on other sites
3) Open Classes/Tools.php

Find the following code:

static public function getPath($id_category, $path = '')
   {
       global $link, $cookie;
       $category = new Category(intval($id_category), intval($cookie->id_lang));
       if (!Validate::isLoadedObject($category))
           die (Tools::displayError());
       if ($category->id == 1)
           return ''.$path.'';
       $pipe = (Configuration::get('PS_NAVIGATION_PIPE') ? Configuration::get('PS_NAVIGATION_PIPE') : '>');
       $category_name = Category::hideCategoryPosition($category->name);
       if ($path != $category_name)
           $path = 'getCategoryLink($category)).'">'.$category_name.' '.$pipe.' '.$path;
       return Tools::getPath(intval($category->id_parent), $path);
   }



Replace with:

           static public function getPath($id_category, $path = '')
   {
       global $link, $cookie;
       $category = new Category(intval($id_category), intval($cookie->id_lang));
       if (!Validate::isLoadedObject($category))
           die (Tools::displayError());
       if ($category->id == 1)
           return ''.$path.'';
       $pipe = (Configuration::get('PS_NAVIGATION_PIPE') ? Configuration::get('PS_NAVIGATION_PIPE') : '>');
       $category_name = Category::hideCategoryPosition($category->name);
       if ($path != $category_name)
           $path = 'getCategoryLink($category->id)).'">'.$category_name.' '.$pipe.' '.$path;
       return Tools::getPath(intval($category->id_parent), $path);
   }



All tested and working in PrestaShop 1.2 B2 (and I assume the final when it's released!)





The code you told us to rewrite has an error, it never closes the php code (so it leaves everything else farther down on the page php code, making the website show a white page)

Thanks.

Share this post


Link to post
Share on other sites
  • 2 months later...
  • 3 weeks later...

I get an error on presta 1.2.4

Deprecated: Call-time pass-by-reference has been deprecated in C:\prestashop 1.2.4\classes\Module.php(325) : eval()'d code on line 203

Deprecated: Call-time pass-by-reference has been deprecated in C:\prestashop 1.2.4\classes\Module.php(325) : eval()'d code on line 227

Deprecated: Call-time pass-by-reference has been deprecated in C:\prestashop 1.2.4\classes\Module.php(325) : eval()'d code on line 271

how can i fix this? thanks

Share this post


Link to post
Share on other sites

And yes, Aaron, your fix isn't closed properly, it breaks the site with those fixes, can you tell us how to fix it? i'm particularly worried about the breadcrumb issue! thanks

Share this post


Link to post
Share on other sites
I get an error on presta 1.2.4

Deprecated: Call-time pass-by-reference has been deprecated in C:\prestashop 1.2.4\classes\Module.php(325) : eval()'d code on line 203

Deprecated: Call-time pass-by-reference has been deprecated in C:\prestashop 1.2.4\classes\Module.php(325) : eval()'d code on line 227

Deprecated: Call-time pass-by-reference has been deprecated in C:\prestashop 1.2.4\classes\Module.php(325) : eval()'d code on line 271

how can i fix this? thanks


I am using verion 1.2.4.0. I got same problem as mr_c does.

Share this post


Link to post
Share on other sites
  • 3 weeks later...

Hi Guys,

Use this url http://translate.google.com/translate_t# to convert french posts to English.

I want to remove the id from url. I have tried in .htaccess file.

RewriteRule ^Chinese()$ category.php?id_category=12 [QSA,L,E]
RewriteRule ^Fantasy()$ category.php?id_category=11 [QSA,L,E]

Still, it is displaying category name with id.

Any suggestions....

Share this post


Link to post
Share on other sites

Salut les gars,

Utilisez ce http://translate.google.com/translate_t url # pour convertir les postes français à l'anglais.

Je veux supprimer l'id de l'URL. J'ai essayé dans le fichier. Htaccess.

RewriteRule ^ Chinois () $ category.php? Id_category = 12 [QSA, L, E]
RewriteRule ^ Fantasy () $ category.php? Id_category = 11 [QSA, L, E]

Néanmoins, il est l'affichage du nom catégorie avec id.

Toutes les suggestions ....

Share this post


Link to post
Share on other sites
  • 2 weeks later...

Bonjour,

Tout d'abord merci pour cet excellent module.
Je me suis malgré tout rapidement confronté aux quelques problèmes comme la gestion de la pagination.
Je n'ai d'ailleurs pour ma part, pas eu de soucis avec le fil d'ariane (aucune modification nécessaire dans "Tools.php").
Et j'ai eu le besoin d'ajouter un peu d'ergonomie en vue de l'utilisation par mon client.
Je ne sais pas si ça a déjà été implémenté, mais je n'ai pas trouvé dans ce fil les fichiers incluant les supplier, manufacturer, cms...etc

Bug Pagination
Après avoir chercher un moment, j'ai compris qu'il suffisait d'ajouter [QSA,L,E] à la fin de toutes les règles des catégories et produits pour que le reste fonctionne. Evidemment il faut mettre à jour la fonction "getPaginationLink" dans le fichier "Link.php".


Mes Améliorations
Ce sont des idées très simples liées à mon utilisation, mais qu'il m'a semblé bon de partager.

Base english
Je me suis permis de réécrire les parties de texte en anglais et d'y inclure un fichier fr.php avec les traduction de manière à proposer un module plus "open".

Onglet
J'ai pensé qu'il serait plus ergonomique d'avoir accès à la configuration du module directement dans l'onglet "Catalogue" afin de ne pas avoir sans cesse à naviger entre "Catalogue" et "Modules".

Synchronisation
J'ai également pensé qu'il serait bon d'ajouter une fonctionnalité qui permettrait de recréer toutes les règles des catégories et produits et de regénérer le htaccess automatiquement lors de l'ajout, de la modification ou de la suppression d'un produit.


Je pense qu'il y a encore pas mal d'autres choses qui peuvent encore être améliorées, car ce module me semble incontournable dans une démarche de référencement efficace...

Je ne sais pas si tout cela pourra être utile à d'autre qu'a moi, mais sait-on jamais...
Toutes ces modifications sont incluses dans les fichiers joints.

Version Prestashop
Compatibilité 1.2
J'ai travaillé sur une 1.2.4

Link.php

urlrewritingplus-1.2.zip

Share this post


Link to post
Share on other sites

i have a problem. i Generate All and i get a 500 Error :/

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Share this post


Link to post
Share on other sites

Damned!
I have not had any problem.
I think the .htaccess generation overwrite a specific config...
If you have a backup of your old htaccess file, you should perhaps try to copy and paste the contents into the htaccess content area in the module configuration...

Share this post


Link to post
Share on other sites

You had not this problem before installing my version?
Can you test with this for default htaccess code (in module settings) ?

# URL rewriting module activation
RewriteEngine on

# URL rewriting rules
RewriteRule ^([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)\.jpg$ /img/p/$1-$2$3.jpg [L,E]
RewriteRule ^([0-9]+)(\-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)\.jpg$ /img/c/$1$2.jpg [L,E]
RewriteRule ^lang-([a-z]{2})/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$3&isolang;=$1$5 [L,E]
RewriteRule ^lang-([a-z]{2})/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$2&isolang;=$1$4 [L,E]
RewriteRule ^lang-([a-z]{2})/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /category.php?id_category=$2&isolang;=$1 [QSA,L,E]
RewriteRule ^([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$2$4 [L,E]
RewriteRule ^([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$1$3 [L,E]
RewriteRule ^([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /category.php?id_category=$1 [QSA,L,E]
RewriteRule ^content/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /cms.php?id_cms=$1 [QSA,L,E]
RewriteRule ^([0-9]+)__([a-zA-Z0-9-]*)(.*)$ /supplier.php?id_supplier=$1$3 [QSA,L,E]
RewriteRule ^([0-9]+)_([a-zA-Z0-9-]*)(.*)$ /manufacturer.php?id_manufacturer=$1$3 [QSA,L,E]
RewriteRule ^lang-([a-z]{2})/(.*)$ /$2?isolang=$1 [QSA,L,E]

# Catch 404 errors
ErrorDocument 404 /404.php

Share this post


Link to post
Share on other sites
  • 2 weeks later...

Bonjour et merci pour ce module.

Sauf que, et je ne suis pas blond mais chatain, je n'y arrive pas.

Est-il possible d'avoir une explication quand à son utilisation ???

Merci bcp

caso83@hotmail.com

Share this post


Link to post
Share on other sites

Bonjour,
Oui, sans doute, mais il me faudrait plus de détails sur ce qui pose problème...
Est-ce au niveau de l'installation, de la manipulation ou de la compréhension du fonctionnement...?
Je ferais ce que je peux pour y répondre.

Share this post


Link to post
Share on other sites

Un peu tout je crois.

En fait lorsque je demande une génération automatique des règles, celle-ci se fait sans problème sauf que, lorsque je vais sur la catégorie choisi, l'url n'a pas changé "categorie=?2". Je me demande même à quoi sert l'option URL simplifié....

De même que le serveur sur lequel je suis hébergé plante très souvent lorsque je fais cette manip. Mon hébergeur et ami m'assure que son serveur est paramétré comme n'importe quel autre serveur.

Ce qui m'ennuie le plus c'est qu'à lire les messages cela a l'air vraiment simple.

Merci pour ton aide.

Share this post


Link to post
Share on other sites

En fait, le module se charge d'écrire les règles de d'url rewriting (dans le .htaccess), mais il faut pour cela que prestashop envoi des urls réécrites.
Le fichier "Link.php" (dans le répertoire "classes") sert à ça, il faut soit le remplacer, soit le modifier manuellement (si jamais d'autres modules ont déjà nécessités sa modification). De cette manière, les liens générés lors de l'affichage correspondront aux régles de réécriture.

En revanche, concernant les plantages, je ne sais pas, cela dépendant beaucoup de l'erreur qu'il renvoi... ou des logs.

Après ça, effectivement c'est très simple d'utilisation.

Share this post


Link to post
Share on other sites