Jump to content

Recommended Posts

Всем привет!

Надоело набивать руками ЧПУ, особенно если языков много. Вот решил поправить недоработку разработчиков.

Опишу логику, чтобы любой из вас мог применять это решение не зависимо от выхода новых версий PrestaShop.

 

Необходимо найти файл: www/js/admin.js. На всякий случай, сделайте копию файла admin_old.php

 

В файле есть функция: str2url, вот ее и поправим.

function str2url(str, encoding, ucfirst) ~30 строка

Все что надо сделать, это добавить недостающие символы кириллицы в соответствующие условия замены. При отсутствии буквы латиницы - будем создавать новое условие.

 

Символы кириллицы русского и украинского алфавитов начинаются с \u410 (заглавная А) и заканчиваются \u044F (маленькая я) см. таблицу символов

 

Исходный код:

str = str.replace(/[\u00E7\u010D\u0107\u0106]/g,'c');

работает следующим образом: в тексте ищутся символы с кодировкой \u00E7 или \u010D или \u0107 или \u0106 и заменяются на символ "с". Заменяются ВСЕ символы в тексте.

Как видите, символы кириллицы здесь не опрашиваются. Исправим код таким образом:

str = str.replace(/[\u00E7\u010D\u0107\u0106\u0426\u0446]/g,'c');

Мы добавили большую и маленькую буквы "Ц" (\u0426 и \u0446 соответственно). Теперь они будут преобразовываться в латинскую "с". Как видите, заодно происходит и транслитерация.

 

В заключение приведу исправленную часть кода функции str2url (PrestaShop 1.5.4):

if (PS_ALLOW_ACCENTED_CHARS_URL)
 str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]\\u00A1-\\uFFFF/g,'');
else
{
 str = str.replace(/[\u0105\u0104\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u0410\u0430]/g,'a');
 str = str.replace(/[\u0411\u0431]/g,'b');
 str = str.replace(/[\u00E7\u010D\u0107\u0106\u0426\u0446]/g,'c');
 str = str.replace(/[\u0427\u0447]/g,'ch');
 str = str.replace(/[\u010F\u0414\u0434]/g,'d');
 str = str.replace(/[\u00E8\u00E9\u00EA\u00EB\u011B\u0119\u0118\u0117\u0401\u0404\u0415\u0435\u0451\u0454\u042D\u044D]/g,'e');
 str = str.replace(/[\u0424\u0444]/g,'f');
 str = str.replace(/[\u0413\u0433\u0490\u0491]/g,'g');
 str = str.replace(/[\u0425\u0445]/g,'h');
 str = str.replace(/[\u00EC\u00ED\u00EE\u00EF\u012F\u0406\u0407\u0456\u0457\u0418\u0438\u042B\u044B]/g,'i');
 str = str.replace(/[\u0419\u0439]/g,'j');
 str = str.replace(/[\u041A\u043A]/g,'k');
 str = str.replace(/[\u0142\u0141\u041B\u043B]/g,'l');
 str = str.replace(/[\u041C\u043C]/g,'m');
 str = str.replace(/[\u00F1\u0148\u041D\u043D]/g,'n');
 str = str.replace(/[\u00F2\u00F3\u00F4\u00F5\u00F6\u00F8\u00D3\u041E\u043E]/g,'o');
 str = str.replace(/[\u041F\u043F]/g,'p');
 str = str.replace(/[\u0159\u0155\u0420\u0440]/g,'r');
 str = str.replace(/[\u015B\u015A\u0161\u0421\u0441]/g,'s');
 str = str.replace(/[\u0428\u0448]/g,'sh');
 str = str.replace(/[\u0429\u0449]/g,'sch');
 str = str.replace(/[\u00DF]/g,'ss');
 str = str.replace(/[\u0165\u0422\u0442]/g,'t');
 str = str.replace(/[\u00F9\u00FA\u00FB\u00FC\u016F\u016B\u0173\u0423\u0443]/g,'u');
 str = str.replace(/[\u0412\u0432]/g,'v');
 str = str.replace(/[\u00FD\u00FF]/g,'y');
 str = str.replace(/[\u042E\u044E]/g,'yu');
 str = str.replace(/[\u042F\u044F]/g,'ya');
 str = str.replace(/[\u017C\u017A\u017B\u0179\u017E\u0417\u0437]/g,'z');
 str = str.replace(/[\u0416\u0436]/g,'zh');
 str = str.replace(/[\u00E6]/g,'ae');
 str = str.replace(/[\u0153]/g,'oe');
 str = str.replace(/[\u013E\u013A]/g,'l');
 str = str.replace(/[\u0155]/g,'r');
 str = str.replace(/[\u042A\u044A\u042C\u044C]/g,'');
 str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]/g,'');
}

 

Надеюсь мое решение пригодилось. Всем успехов

Edited by skeef (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...

Отличное дополнение! А можно добавить эту транслитерацию к производителям,? А то на страницы с русскоязычными производителями отображаюстя только артикул и черточка /35_- И вручную их поправить тоже не представляется возможным.

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

Всем привет!

Надоело набивать руками ЧПУ, особенно если языков много. Вот решил поправить недоработку разработчиков.

Опишу логику, чтобы любой из вас мог применять это решение не зависимо от выхода новых версий PrestaShop.

 

Необходимо найти файл: www/js/admin.js. На всякий случай, сделайте копию файла admin_old.php

 

В файле есть функция: str2url, вот ее и поправим.

function str2url(str, encoding, ucfirst) ~30 строка

Все что надо сделать, это добавить недостающие символы кириллицы в соответствующие условия замены. При отсутствии буквы латиницы - будем создавать новое условие.

 

Символы кириллицы русского и украинского алфавитов начинаются с \u410 (заглавная А) и заканчиваются \u044F (маленькая я) см. таблицу символов

 

Исходный код:

str = str.replace(/[\u00E7\u010D\u0107\u0106]/g,'c');

работает следующим образом: в тексте ищутся символы с кодировкой \u00E7 или \u010D или \u0107 или \u0106 и заменяются на символ "с". Заменяются ВСЕ символы в тексте.

Как видите, символы кириллицы здесь не опрашиваются. Исправим код таким образом:

str = str.replace(/[\u00E7\u010D\u0107\u0106\u0426\u0446]/g,'c');

Мы добавили большую и маленькую буквы "Ц" (\u0426 и \u0446 соответственно). Теперь они будут преобразовываться в латинскую "с". Как видите, заодно происходит и транслитерация.

 

В заключение приведу исправленную часть кода функции str2url (PrestaShop 1.5.4):

if (PS_ALLOW_ACCENTED_CHARS_URL)
 str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]\\u00A1-\\uFFFF/g,'');
else
{
 str = str.replace(/[\u0105\u0104\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u0410\u0430]/g,'a');
 str = str.replace(/[\u0411\u0431]/g,'b');
 str = str.replace(/[\u00E7\u010D\u0107\u0106\u0426\u0446]/g,'c');
 str = str.replace(/[\u0427\u0447]/g,'ch');
 str = str.replace(/[\u010F\u0414\u0434]/g,'d');
 str = str.replace(/[\u00E8\u00E9\u00EA\u00EB\u011B\u0119\u0118\u0117\u0401\u0404\u0415\u0435\u0451\u0454\u042D\u044D]/g,'e');
 str = str.replace(/[\u0424\u0444]/g,'f');
 str = str.replace(/[\u0413\u0433\u0490\u0491]/g,'g');
 str = str.replace(/[\u0425\u0445]/g,'h');
 str = str.replace(/[\u00EC\u00ED\u00EE\u00EF\u012F\u0406\u0407\u0456\u0457\u0418\u0438\u042B\u044B]/g,'i');
 str = str.replace(/[\u0419\u0439]/g,'j');
 str = str.replace(/[\u041A\u043A]/g,'k');
 str = str.replace(/[\u0142\u0141\u041B\u043B]/g,'l');
 str = str.replace(/[\u041C\u043C]/g,'m');
 str = str.replace(/[\u00F1\u0148\u041D\u043D]/g,'n');
 str = str.replace(/[\u00F2\u00F3\u00F4\u00F5\u00F6\u00F8\u00D3\u041E\u043E]/g,'o');
 str = str.replace(/[\u041F\u043F]/g,'p');
 str = str.replace(/[\u0159\u0155\u0420\u0440]/g,'r');
 str = str.replace(/[\u015B\u015A\u0161\u0421\u0441]/g,'s');
 str = str.replace(/[\u0428\u0448]/g,'sh');
 str = str.replace(/[\u0429\u0449]/g,'sch');
 str = str.replace(/[\u00DF]/g,'ss');
 str = str.replace(/[\u0165\u0422\u0442]/g,'t');
 str = str.replace(/[\u00F9\u00FA\u00FB\u00FC\u016F\u016B\u0173\u0423\u0443]/g,'u');
 str = str.replace(/[\u0412\u0432]/g,'v');
 str = str.replace(/[\u00FD\u00FF]/g,'y');
 str = str.replace(/[\u042E\u044E]/g,'yu');
 str = str.replace(/[\u042F\u044F]/g,'ya');
 str = str.replace(/[\u017C\u017A\u017B\u0179\u017E\u0417\u0437]/g,'z');
 str = str.replace(/[\u0416\u0436]/g,'zh');
 str = str.replace(/[\u00E6]/g,'ae');
 str = str.replace(/[\u0153]/g,'oe');
 str = str.replace(/[\u013E\u013A]/g,'l');
 str = str.replace(/[\u0155]/g,'r');
 str = str.replace(/[\u042A\u044A\u042C\u044C]/g,'');
 str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]/g,'');
}

 

Надеюсь мое решение пригодилось. Всем успехов

 

Другое решение:

 

в admin.js добавить функцию:

String.prototype.translit = (function(){
var L = {
  'А':'A','а':'a','Б':'B','б':'b','В':'V','в':'v','Г':'G','г':'g',
  'Д':'D','д':'d','Е':'E','е':'e','Ё':'Yo','ё':'yo','Ж':'Zh','ж':'zh',
  'З':'Z','з':'z','И':'I','и':'i','Й':'Y','й':'y','К':'K','к':'k',
  'Л':'L','л':'l','М':'M','м':'m','Н':'N','н':'n','О':'O','о':'o',
  'П':'P','п':'p','Р':'R','р':'r','С':'S','с':'s','Т':'T','т':'t',
  'У':'U','у':'u','Ф':'F','ф':'f','Х':'Kh','х':'kh','Ц':'Ts','ц':'ts',
  'Ч':'Ch','ч':'ch','Ш':'Sh','ш':'sh','Щ':'Sch','щ':'sch','Ъ':'_','ъ':'_',
  'Ы':'Y','ы':'y','Ь':"_",'ь':"_",'Э':'E','э':'e','Ю':'Yu','ю':'yu',
  'Я':'Ya','я':'ya', ' ':'-', ',':'_'
	},
	r = '',
	k;
for (k in L) r += k;
r = new RegExp('[' + r + ']', 'g');
k = function(a){
	return a in L ? L[a] : '';
};
return function(){
	return this.replace(r, k);
};
})();

 

затем переименовать функцию str2url в str2url_old и добавить сл. функцию:

 

function str2url(str,encoding,ucfirst)
{
return str2url_old(str,encoding,ucfirst).translit();
}

 

Все

Link to comment
Share on other sites

Другое решение:

 

в admin.js добавить функцию:

String.prototype.translit = (function(){
var L = {
  'А':'A','а':'a','Б':'B','б':'b','В':'V','в':'v','Г':'G','г':'g',
  'Д':'D','д':'d','Е':'E','е':'e','Ё':'Yo','ё':'yo','Ж':'Zh','ж':'zh',
  'З':'Z','з':'z','И':'I','и':'i','Й':'Y','й':'y','К':'K','к':'k',
  'Л':'L','л':'l','М':'M','м':'m','Н':'N','н':'n','О':'O','о':'o',
  'П':'P','п':'p','Р':'R','р':'r','С':'S','с':'s','Т':'T','т':'t',
  'У':'U','у':'u','Ф':'F','ф':'f','Х':'Kh','х':'kh','Ц':'Ts','ц':'ts',
  'Ч':'Ch','ч':'ch','Ш':'Sh','ш':'sh','Щ':'Sch','щ':'sch','Ъ':'_','ъ':'_',
  'Ы':'Y','ы':'y','Ь':"_",'ь':"_",'Э':'E','э':'e','Ю':'Yu','ю':'yu',
  'Я':'Ya','я':'ya', ' ':'-', ',':'_'
	},
	r = '',
	k;
for (k in L) r += k;
r = new RegExp('[' + r + ']', 'g');
k = function(a){
	return a in L ? L[a] : '';
};
return function(){
	return this.replace(r, k);
};
})();

 

затем переименовать функцию str2url в str2url_old и добавить сл. функцию:

 

function str2url(str,encoding,ucfirst)
{
return str2url_old(str,encoding,ucfirst).translit();
}

 

Все

 

Не работает на 1.5.4.1

Link to comment
Share on other sites

Так кто-нибудь имеет представление о том, как сделать чтобы списки производителей, да и вообще все свойства и атрибуты, которые попадают в урл переводились в латиницу? Если нужно, то отблагодарю, если нужно то финансово.

Link to comment
Share on other sites

  • 2 months later...

У меня Преста 1,5,4,1 описанный выше способ не работает - получаются киррилические урлы. В чем может быть дело?

 

Символы в URL как-то связаны с языками в настройках админки? У меня там только русский.

Edited by Alex-on2 (see edit history)
Link to comment
Share on other sites

У меня Преста 1,5,4,1 описанный выше способ не работает - получаются киррилические урлы. В чем может быть дело?

 

Символы в URL как-то связаны с языками в настройках админки? У меня там только русский.

Не связаны.

И для корректной работы нужны ещё правки

Link to comment
Share on other sites

Подскажите, пожалуйста, как поправить отображение символов вот таким образом?

<a href="http://site.ru/153-ружья-для-подводной-охоты" title="">Ружья для подводной охоты</a>

Ни локализатор, ни описанные выше способы, как я понимаю, не затрагивают проблемы и ума не приложу, как решить.

Edited by v3t3r (see edit history)
Link to comment
Share on other sites

за вознаграждение настрою всё что связано с чпу и не только.

Сколько стоит ?

 

В локализаторе все это уже есть.

Я же обьяснил, локализатор скачал и что с ним дальше делать я не в курсе !!! (новичок) я .....

как поставить локализатор ??

Link to comment
Share on other sites

Сколько стоит ?

 

 

Я же обьяснил, локализатор скачал и что с ним дальше делать я не в курсе !!! (новичок) я .....

как поставить локализатор ??

 

Локализатор не исправит этого.

тк тут модуль чпу без id

а по цене в скайп.

Link to comment
Share on other sites

  • 2 months later...

Не работает на 1.5.4.1

http://www.prestashop.com/forums/topic/250023-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81-%D1%87%D0%BF%D1%83-manufacturer/ Метод от Absent на 100% работает! (presta 1.5.6) Чтоб ссылки не были битыми и не было 404 ошибки - надо после дописки в tools.php зайти в настройку модуля многоуровневой навигации и переиндексить всё и будет всем счастье! Ура, заработало!!!

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