Доработаем SEF URL в OpenCart

Доработаем алгоритм создание человекопонятных ссылок в OpenCart
Пришла мысль, что SEF (ЧПУ) ссылки нужны всегда, а при создании товара в OpenCart их приходится вводить вручную и не всегда про это вспоминаешь.

Так вот, предлагаю идею по оптимизации данного процесса.

Идея состоит в том, что ссылки будут генерироваться автоматически, используя ID товара и… (там уже Вам решать что использовать).

Итак, немного изменим модули!

В файл admin/model/catalog/product.php, добавим функцию транслитерации, чтоб ссылки состояли из Латинских букв
private function translit($string) {
        $table = array(
            'А' => 'A',
            'Б' => 'B',
            'В' => 'V',
            'Г' => 'G',
            'Д' => 'D',
            'Е' => 'E',
            'Ё' => 'YO',
            'Ж' => 'ZH',
            'З' => 'Z',
            'И' => 'I',
            'Й' => 'J',
            'К' => 'K',
            'Л' => 'L',
            'М' => 'M',
            'Н' => 'N',
            'О' => 'O',
            'П' => 'P',
            'Р' => 'R',
            'С' => 'S',
            'Т' => 'T',
            'У' => 'U',
            'Ф' => 'F',
            'Х' => 'H',
            'Ц' => 'C',
            'Ч' => 'CH',
            'Ш' => 'SH',
            'Щ' => 'CSH',
            'Ь' => '',
            'Ы' => 'Y',
            'Ъ' => '',
            'Э' => 'E',
            'Ю' => 'YU',
            'Я' => 'YA',
            'а' => 'a',
            'б' => 'b',
            'в' => 'v',
            'г' => 'g',
            'д' => 'd',
            'е' => 'e',
            'ё' => 'yo',
            'ж' => 'zh',
            'з' => 'z',
            'и' => 'i',
            'й' => 'j',
            'к' => 'k',
            'л' => 'l',
            'м' => 'm',
            'н' => 'n',
            'о' => 'o',
            'п' => 'p',
            'р' => 'r',
            'с' => 's',
            'т' => 't',
            'у' => 'u',
            'ф' => 'f',
            'х' => 'h',
            'ц' => 'c',
            'ч' => 'ch',
            'ш' => 'sh',
            'щ' => 'csh',
            'ь' => '',
            'ы' => 'y',
            'ъ' => '',
            'э' => 'e',
            'ю' => 'yu',
            'я' => 'ya',
        );

        $output = str_replace(array_keys($table), array_values($table), $string);

        return $output;
    }

за-тем в том же файле в функциях addProduct() и editProduct() вместо строчек
if ($data['keyword']) {
            $this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int) $product_id . "', keyword = '" . $this->db->escape($data['keyword']) . "'");
        }
вставим
if ($data['keyword']) {
            /* скрипт автоматической генерации sef-url */
            /* массив символов, которые нужно заменить или удалить (заменить на пустой символ) из SEF-URL */
            $replaces = array(
                '.' => '',
                ',' => '',
                ' ' => '-',
                '?' => '',
                '!' => '',
                ':' => '',
                ';' => '',
                "/" => '-',
                "\\" => '-',
                '&' => '',
                '"' => '',
                "'" => '',
                '#' => ''
            );
            $data['keyword'] = strtolower($data['keyword']);
            $data['keyword'] = str_replace(array_keys($replaces), array_values($replaces), $data['keyword']);
            $data['keyword'] = $this->translit($data['keyword']);
            $data['keyword'] = (int) $product_id.'-'.$data['keyword'];
        } else {
            $data['keyword'] = (int) $product_id; // если вручную не указана SEF ссылка, используем ИД продукта. Или что другое на Ваш выбор!

        }
        /* сохраняем в БД */
        $this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int) $product_id . "', keyword = '" . $this->db->escape($data['keyword']) . "'");


теперь изменим вывод этой строки в форме добавления/редактирования товара в OpenCart
находим файл admin/view/template/catalog/product_form.tpl, находим строки
<tr>
    <td><?php echo $entry_keyword; ?></td>
    <td><input type="text" name="keyword" value="<?php echo $keyword; ?>" /></td>
</tr>
и зменяем на
<tr>
    <td><?php echo $entry_keyword; ?></td>
    <td><?php echo $product_id; ?>-<input type="text" name="keyword" value="<?php echo $keyword; ?>" /></td>
</tr>


теперь подготовим вывод, чтоб ИД товара у нас не фигурировал в строке ввода.
В файле admin/controller/catalog/product.php, после строк
$this->data['product_id'] = (int) $product_id; // добавлено благодаря kitabu
if(isset($this->request->post['keyword'])) {
            $this->data['keyword'] = $this->request->post['keyword'];
    } elseif (!empty($product_info)) {
            $this->data['keyword'] = $product_info['keyword'];
    } else {
            $this->data['keyword'] = '';
    }

добавим регулярное выражение для вырезки ИД из строки, чтоб избежать дублирования (так как ИД товара автоматически туда добавляется).
$keyword_pattern = '/^\d+[\-]?/';
$this->data['keyword'] = preg_replace($keyword_pattern, '', $this->data['keyword']);


Удачного кодинга!

По вопросам доработки OpenCart Вы можете обратиться в нашу WEB студию Веб студия ILIGAN
  • +1
  • 03 декабря 2012, 13:08
  • igorrius

Комментарии (6)

RSS свернуть / развернуть
Здравствуйте
Сделано всё как описано, однако выдаёт ошибку в админке возле SEO URL:
Notice: Undefined variable: product_id in /***/***/***.com.ua/www/admin/view/template/catalog/product_form.tpl on line 166
0
Думаю, что проблема в том, что в шаблоне нет переменной $product_id. Возможно я забыл дописать её в код. Для решения просто в контроллере дописываем строчку
$data['product_id'] = (int) $product_id;
0
Прошу прощения, вот такую строчку нужно добавить в контроллер
$this->data['product_id'] = (int) $product_id;
0
что то пошло не так

SEO URL:
Должно быть уникальным на всю систему. Notice: Undefined variable: product_id in /сайт/public_html/admin/view/template/catalog/product_form.tpl on line 171

ocStore Версия 1.5.5.1.1
0
  • avatar
  • keks
  • 01 марта 2014, 19:29
Да, похоже на то)
У Вас не пришёл product_id.

В контроллер добавили строчку?
$this->data['product_id'] = (int) $product_id;
0
да< ошибки нет… теперь перед окном SEO URL:
Должно быть уникальным на всю систему. 0- [пустое поле]

и названия не генерируются… сео про должно быть включено?
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
comments powered by Disqus