Автор Тема: Advanced search - как транслитерировать URL для SEO страниц  (Прочитано 54 раз)

29 Сентября 2016, 13:05:27
  • Новичок
  • *
  • Сообщений: 17
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Advanced search 4 нагенерировал SEO страницы со странными урлами
"срок поставки - 1 неделя";"http://proj18.tt/s/1/-1-"
"в наличии";"http://proj18.tt/s/2/-"
"на заказ";"http://proj18.tt/s/3/-"
"срок поставки - 1 месяц";"http://proj18.tt/s/4/-1-"
"Орех тёмный";"http://proj18.tt/s/5/-"
"Белый";"http://proj18.tt/s/6/"
"Кофе";"http://proj18.tt/s/7/"
"Груша бразильская";"http://proj18.tt/s/8/-"
"Орех бискотто";"http://proj18.tt/s/9/-"
"Дуб чёрный";"http://proj18.tt/s/10/-"
ну и так далее

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

Не подскажете ли, можно ли как-то решить проблему? Что надо сделать, чтобы advanced search научился транслитерации?
29 Сентября 2016, 13:29:51
Ответ #1
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 85948
  • Репутация: +25399/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Для того чтобы модуль мог осуществить транслитерацию, вам нужно создать свой класс транслит кириллица-латиница и заменить используемый метод в модуле Advanced search 4.
30 Сентября 2016, 12:53:01
Ответ #2
  • Новичок
  • *
  • Сообщений: 17
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Я нашел подходящий кусок кода в файле C:\OpenServer\domains\proj18.tt\modules\pm_advancedsearch4\js\admin.js и внес изменения
Но не помогло почему-то:
function ASStr2url(e) {
str = $jqPm(e).val();
str = str.toUpperCase();
str = str.toLowerCase();

//str = str.replace(/[\u0105\u0104\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5]/g, 'a');
//str = str.replace(/[\u00E7\u010D\u0107\u0106]/g, 'c');
//str = str.replace(/[\u010F]/g, 'd');
//str = str.replace(/[\u00E8\u00E9\u00EA\u00EB\u011B\u0119\u0118]/g, 'e');
//str = str.replace(/[\u00EC\u00ED\u00EE\u00EF]/g, 'i');
//str = str.replace(/[\u0142\u0141]/g, 'l');
//str = str.replace(/[\u00F1\u0148]/g, 'n');
//str = str.replace(/[\u00F2\u00F3\u00F4\u00F5\u00F6\u00F8\u00D3]/g, 'o');
//str = str.replace(/[\u0159]/g, 'r');
//str = str.replace(/[\u015B\u015A\u0161]/g, 's');
//str = str.replace(/[\u00DF]/g, 'ss');
//str = str.replace(/[\u0165]/g, 't');
//str = str.replace(/[\u00F9\u00FA\u00FB\u00FC\u016F]/g, 'u');
//str = str.replace(/[\u00FD\u00FF]/g, 'y');
//str = str.replace(/[\u017C\u017A\u017B\u0179\u017E]/g, 'z');
//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(/[^a-z0-9\s\'\:\/\[\]-]/g, '');
//str = str.replace(/[\s\'\:\/\[\]-]+/g, ' ');
//str = str.replace(/[ ]/g, '-');
//str = str.replace(/[-]/g, '-');

    str = str.replace(/[\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u0101\u0103\u0105\u0430]/g, 'a');
    str = str.replace(/[\u0431]/g, 'b');
    str = str.replace(/[\u00E7\u0107\u0109\u010D\u0446]/g, 'c');
    str = str.replace(/[\u010F\u0111\u0434]/g, 'd');
    str = str.replace(/[\u00E8\u00E9\u00EA\u00EB\u0113\u0115\u0117\u0119\u011B\u0435\u044D]/g, 'e');
    str = str.replace(/[\u0444]/g, 'f');
    str = str.replace(/[\u011F\u0121\u0123\u0433\u0491]/g, 'g');
    str = str.replace(/[\u0125\u0127]/g, 'h');
    str = str.replace(/[\u00EC\u00ED\u00EE\u00EF\u0129\u012B\u012D\u012F\u0131\u0438\u0456]/g, 'i');
    str = str.replace(/[\u0135\u0439]/g, 'j');
    str = str.replace(/[\u0137\u0138\u043A]/g, 'k');
    str = str.replace(/[\u013A\u013C\u013E\u0140\u0142\u043B]/g, 'l');
    str = str.replace(/[\u043C]/g, 'm');
    str = str.replace(/[\u00F1\u0144\u0146\u0148\u0149\u014B\u043D]/g, 'n');
    str = str.replace(/[\u00F2\u00F3\u00F4\u00F5\u00F6\u00F8\u014D\u014F\u0151\u043E]/g, 'o');
    str = str.replace(/[\u043F]/g, 'p');
    str = str.replace(/[\u0155\u0157\u0159\u0440]/g, 'r');
    str = str.replace(/[\u015B\u015D\u015F\u0161\u0441]/g, 's');
    str = str.replace(/[\u00DF]/g, 'ss');
    str = str.replace(/[\u0163\u0165\u0167\u0442]/g, 't');
    str = str.replace(/[\u00F9\u00FA\u00FB\u00FC\u0169\u016B\u016D\u016F\u0171\u0173\u0443]/g, 'u');
    str = str.replace(/[\u0432]/g, 'v');
    str = str.replace(/[\u0175]/g, 'w');
    str = str.replace(/[\u00FF\u0177\u00FD\u044B]/g, 'y');
    str = str.replace(/[\u017A\u017C\u017E\u0437]/g, 'z');
    str = str.replace(/[\u00E6]/g, 'ae');
    str = str.replace(/[\u0447]/g, 'ch');
    str = str.replace(/[\u0445]/g, 'kh');
    str = str.replace(/[\u0153]/g, 'oe');
    str = str.replace(/[\u0448]/g, 'sh');
    str = str.replace(/[\u0449]/g, 'ssh');
    str = str.replace(/[\u044F]/g, 'ya');
    str = str.replace(/[\u0454]/g, 'ye');
    str = str.replace(/[\u0457]/g, 'yi');
    str = str.replace(/[\u0451]/g, 'yo');
    str = str.replace(/[\u044E]/g, 'yu');
    str = str.replace(/[\u0436]/g, 'zh');
  str = str.replace(/[ ]/g, '-');
str = str.replace(/[-]/g, '-');
   
$jqPm(e).val(str)

return true;
}
30 Сентября 2016, 13:10:37
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 13135
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
admin.js - для админки, для фронтенда должен быть другой файл.
Метод ASStr2url когда применяется?
30 Сентября 2016, 15:42:43
Ответ #4
  • Новичок
  • *
  • Сообщений: 17
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Я пока с админкой и пытаюсь разобраться.
Насколько я понял, метод ASStr2url  вызывается, когда вручную вводится что-нибудь на странице Редактировать страницу продуктов в поле Дружественные URL адреса (ЧПУ)).
Поскольку, я вручную ничего и не ввожу, а хочу автоматически страниц нагенерировать, то кандидатом на выполнение стал код из файла \modules\pm_advancedsearch4\pm_advancedsearch4.php
public static function str2url($str) {
if (function_exists('mb_strtolower'))
$str = mb_strtolower($str, 'utf-8');
$str = trim($str);
$str = preg_replace('/[\x{0105}\x{0104}\x{00E0}\x{00E1}\x{00E2}\x{00E3}\x{00E4}\x{00E5}]/u','a', $str);
$str = preg_replace('/[\x{00E7}\x{010D}\x{0107}\x{0106}]/u','c', $str);
$str = preg_replace('/[\x{010F}]/u','d', $str);
$str = preg_replace('/[\x{00E8}\x{00E9}\x{00EA}\x{00EB}\x{011B}\x{0119}\x{0118}]/u','e', $str);
$str = preg_replace('/[\x{00EC}\x{00ED}\x{00EE}\x{00EF}]/u','i', $str);
$str = preg_replace('/[\x{0142}\x{0141}\x{013E}\x{013A}]/u','l', $str);
$str = preg_replace('/[\x{00F1}\x{0148}]/u','n', $str);
$str = preg_replace('/[\x{00F2}\x{00F3}\x{00F4}\x{00F5}\x{00F6}\x{00F8}\x{00D3}]/u','o', $str);
$str = preg_replace('/[\x{0159}\x{0155}]/u','r', $str);
$str = preg_replace('/[\x{015B}\x{015A}\x{0161}]/u','s', $str);
$str = preg_replace('/[\x{00DF}]/u','ss', $str);
$str = preg_replace('/[\x{0165}]/u','t', $str);
$str = preg_replace('/[\x{00F9}\x{00FA}\x{00FB}\x{00FC}\x{016F}]/u','u', $str);
$str = preg_replace('/[\x{00FD}\x{00FF}]/u','y', $str);
$str = preg_replace('/[\x{017C}\x{017A}\x{017B}\x{0179}\x{017E}]/u','z', $str);
$str = preg_replace('/[\x{00E6}]/u','ae', $str);
$str = preg_replace('/[\x{0153}]/u','oe', $str);
$str = preg_replace('/[^a-zA-Z0-9\s\'\:\/\[\]-]/','', $str);
$str = preg_replace('/[\s\'\:\/\[\]-]+/',' ', $str);
$str = preg_replace('/[ ]/','-', $str);
$str = preg_replace('/[\/]/','-', $str);
$str = strtolower($str);
return $str;
}

Но меня смущает, что в этой функции представлен далеко не весь алфавит: есть a,c,d,e,i,l,n,o,r,s,t,u,y,z и еще несколько
Буквы m например нет
30 Сентября 2016, 18:03:00
Ответ #5
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 32991
  • Репутация: +26759/-0
    • Просмотр профиля
В этом модуле транслит для букв с аксантами. Поэтому и нет m.
30 Сентября 2016, 18:43:41
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 13135
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Файл admin.js загружается? Фунция ASStr2url работает?