Четверг, 02 Май 2019 19:31

Настройка ЧПУ модуля новостей Opencart 2.3.x

Не думал я, что простой по свойствам (как мне казалось) модуль, доставит мне столько хлопот. Я конечно же признателен разработчику за то, что он сделал этот модуль бесплатным, но количество костылей, с которыми я сталкиваюсь не первый день разбирая модуль признаться начало раздражать.

На этот раз у меня ЧПУ у новостей «отвалилось», хотя здесь сложно сказать, что оно именно отвалилось, если оно изначально даже не прицепилось. Есть форум, где обсуждают сей модуль, там же нашёл решение. И тут понеслось. Первое – в моей версии Opencart не был установлен SeoPro (ЧПУ при этом работало и на стандартном модуле).

Установил, теперь собственно, что стало поводом для этого обзора, то что файлы модуля SeoPro оказались совсем в другом каталоге. Перед тем, как приступить – обязательно сделайте резервную копию!

По обзору, что я читал они должны, были быть в каталоге:

catalog/controller/common/seo_pro.php

у меня же файл оказался по другому пути:

catalog/controller/startup/seo_pro.php

Далее, поиск строки в обзоре ничего не дал, потому что пробелы образовались, которых в файле модуля не было, без пробелов ищем так:

foreach($data as $key => $value) {

Перед этой строкой добавляем:

$is_news = false;

После чего ищем(здесь, как в обзоре):

case 'path':

Перед, добавляем:

case 'news_id':
    $queries[] = $key . '=' . $value;
    unset($data[$key]);
    $postfix = 1;
    $is_news = true;
    break;

upd.: добавлю ещё пару моментов в этом же файле, ищем:

} elseif (isset($this->request->get['information_id'])) {
    $this->request->get['route'] = 'information/information';

добавляем:

} elseif (isset($this->request->get['news_id'])) {
    $this->request->get['route'] = 'information/news';

Теперь ищем:

$seo_url .= '/' . rawurlencode($aliases[$query]);

Меняем на:

if ($is_news) {
      $seo_url .= '/all-news/' . rawurlencode($aliases[$query]);
    } else {
      $seo_url .= '/' . rawurlencode($aliases[$query]);
    }

Теперь правим файл админ-панели, путь отличается, Вам сюда:

admin/controller/catalog/news.php

(в оригинале статьи вместо catalog указано module)

И этот блок:

if (isset($this->request->post['keyword'])) {
      $this->data['keyword'] = $this->request->post['keyword'];
    } elseif (isset($news_info)) {
      $this->data['keyword'] = $news_info['keyword'];
    } else {
      $this->data['keyword'] = '';
    }

Заменяем на этот:

function translitIt($str)
    {
      $tr = array
      (
        "А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
        "Д"=>"d","Е"=>"e","Ж"=>"j","З"=>"z","И"=>"i",
        "Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
        "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
        "У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch",
        "Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
        "Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
        "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
        "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
        "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
      );
      $seo_name = preg_replace('/\%/', ' procent ', strtr($str, $tr));
      $seo_name = preg_replace('/\@/', ' sobaka ', $seo_name);
      $seo_name = preg_replace('/\&/', ' i ', $seo_name);
      $seo_name = preg_replace('/\+/', ' plus ', $seo_name);
      $seo_name = preg_replace('/\s[\s]+/', '-', $seo_name);
      $seo_name = preg_replace('/[\s\W]+/', '-', $seo_name);
      $seo_name = preg_replace('/^[\-]+/', '', $seo_name);
      $seo_name = preg_replace('/[\-]+$/', '', $seo_name);
      return $seo_name;
    }
    if (isset($this->request->post['keyword'])){
      $this->data['keyword'] = utf8_strtolower($this->request->post['keyword']);
    }elseif (!empty($news_info['keyword'])){
      $this->data['keyword'] = utf8_strtolower($news_info['keyword']);
    }else{
      if (!empty($this->data['news_description'][1]['title'])){
        $this->data['keyword'] = utf8_strtolower(translitIt($this->data['news_description'][1]['title']));
      }else{
        $this->data['keyword'] = '';
      }
    }

Кстати очень рекомендую проверить совпадают ли кодировки Вашего сервера и этого файла (для примера, у меня на сервере кодировка UTF-8, а модуль по умолчанию установился с кодировкой ANSI), оно как бы ничего страшного просто у Вас при несовпадении кодировок вместо кириллицы кракозёбры выплывут, подумаешь, велика беда.

Последний этап.

Открываем ПУ базой данных (PHPMyAdmin (Mysql)) и вводим следующий запрос:

INSERT INTO префикс_url_alias (query, keyword) VALUES ('information/news', 'all-news');

Вместо слова «префикс_» подставьте префикс, который Вы использовали при создании магазина. Если Вы не имеете опыта программиста и даже малейшего представления, как работает база данных MySQL – оооооооооочень рекомендую – обратитесь к специалисту, лезть в эту воду, не зная броду – не то, на чём следует экономить.

sql-запрос на добавление данных

Далее, удаляем файлы кэша, путь system/storage/cache.

sql-запрос на добавление данных

Открываем Админ-панель Opencart > Модификаторы > Очистить/Обновить.

У Вас «слетит» модуль новостей, не пугайтесь, открываем Модули > Новости, новый добавлять не надо – редактируем уже созданный, нажимаем сохранить, вернётся модуль обратно в каталог.

Если у Вас уже были созданы материалы в модуле – зайдите в каждый и «сохраните», чтобы система переписала к нему путь (ЧПУ).

Проверяем.

З.ы. за основу обзора взял инфу отсюда: ссылка на источник

Спонсоры: