Изменение схемы у категории (OpenCart v. 1.5.6)

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Суть задачи — изменить отображение шаблона у определенной категории.

Нашел вроде бы решение задачи тут

Но данный вариант отлично подходит если движек сайта без доп. модулей и плюшек.

И так, приступим.

Постановка задачи

Нужен отдельный шаблон для категории «Плитки»

Решение

1. Создаем контролер

catalog/controller/product/category_plitka.php

category_plitka.php — содержимое файла идентично файлу category.php

делаем правки

эту строку


class ControllerProductCategory extends Controller {

заменяем это


class ControllerProductCategoryPlitka extends Controller {

Изменяем подключение шаблона в функции public function index()

До


public function index() {

. . .

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/category.tpl')) {
$this->template = $this->config->get('config_template') . '/template/product/category.tpl';
} else {
$this->template = 'default/template/product/category.tpl';
}

. . .

После


public function index() {

. . .

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/category_plitka.tpl')) {
$this->template = $this->config->get('config_template') . '/template/product/category_plitka.tpl';
} else {
$this->template = 'default/template/product/category.tpl';
}

. . .

2. Если нужен отдельный языковой файл для нашего контроллера, создаем его и подключаем.

catalog/language/russian/product/category_plitka.php

Правка в файле контроллера


public function index() {

. . .

$this->language->load('product/category_plitka');

. .

}

3. Создаем шаблон для нового контроллера

catalog/view/theme/default/template/product/category_plitka.tpl

category_plitka.tpl — содержимое файла идентично файлу category.tpl, разве что в заголовок выведем «Новый шаблон», чтоб для начала хоть как то видеть что новый шаблон выводится




<h1>Новый шаблон</h1>



4. Создаем в админ панеле новую схему
Создание новой схемы в OpenCart

5. Назначаем созданную схему нужной категории
Назначение схемы для категорииТеперь cms будет воспринимать новый шаблон, НО если будите делать переход на страницы категории где назначен новый шаблон, скорей всего вы его  не увидите. А если перейдете по прямой ссылке /index.php?route=product/category_plitka&path=ID_категории, то шаблон загрузится, но если активированы чпу урлы (например SEO_PRO) то шаблона не увидите.

6. Правим контроллер заголовка

catalog/controller/common/header.php

добавляем функцию, которая по ID категории вернет его схему


private function getLayoutPath($categoryID) {
$sql_query = "SELECT route FROM " . DB_PREFIX . "layout_route INNER JOIN " . DB_PREFIX . "category_to_layout ON " . DB_PREFIX . "layout_route.layout_id = " . DB_PREFIX . "category_to_layout.layout_id WHERE " . DB_PREFIX . "category_to_layout.category_id = " . (int) $categoryID . " AND " . DB_PREFIX . "category_to_layout.store_id = '" . (int) $this->config->get('config_store_id') . "'";
$query = $this->db->query($sql_query);
if ($query->num_rows) {
return $query->row['route'];
} else {
return 'product/category';
}
}

и заменяем строки


. . .

'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])

. . .

'href' => $this->url->link('product/category', 'path=' . $category['category_id'])

. . .

на следующие


. . .

'href' => $this->url->link($this->getLayoutPath($category['category_id']), 'path=' . $category['category_id']. '_' . $child['category_id'])

. . .

'href' => $this->url->link($this->getLayoutPath($category['category_id']), 'path=' . $category['category_id'])

. . .

То есть вместо параметра ‘product/category’ ставим функцию которая возвращает текущую схему категории

Опять таки, на этом этапе ждут сюрпризы.

Если на сайте установлены модули которые перебивают настройки контролера header.php, например модуль на vqmod, то те правки что сделали будут затерты и шаблона не отобразится.

Так же, как правило сами ссылки на категории отображаются в модуле категорий, который тоже надо исправить.

7. Правим контроллер модуля категорий

catalog/controller/module/category.php

Действия аналогичны что в пункте 6, где правили контроллер заголовка header.php

Казалось бы все.

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

8. Правим контроллер seo_url.php

catalog/controller/common/seo_url.php

Добавляем в конце файла функцию


private function getLayoutPath($categoryID) {
$sql_query = "SELECT route FROM " . DB_PREFIX . "layout_route INNER JOIN " . DB_PREFIX . "category_to_layout ON " . DB_PREFIX . "layout_route.layout_id = " . DB_PREFIX . "category_to_layout.layout_id WHERE " . DB_PREFIX . "category_to_layout.category_id = " . (int) $categoryID . " AND " . DB_PREFIX . "category_to_layout.store_id = '" . (int) $this->config->get('config_store_id') . "'";
$query = $this->db->query($sql_query);
if ($query->num_rows) {
return $query->row['route'];
} else {
return 'product/category';
}
}

Далее исправляем функцию index()


public function index() {
// Add rewrite to url class
if ($this->config->get('config_seo_url')) {
$this->url->addRewrite($this);
}

// Decode URL
if (isset($this->request->get['_route_'])) {
$parts = explode('/', $this->request->get['_route_']);
$CatLayout = 'product/category'; // вводим новую переменную
foreach ($parts as $part) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");

if ($query->num_rows) {
$url = explode('=', $query->row['query']);

if ($url[0] == 'product_id') {
$this->request->get['product_id'] = $url[1];
}

if ($url[0] == 'category_id') {
$CatLayout = $this->getLayoutPath($url[1]); // заносим результат в переменную
if (!isset($this->request->get['path'])) {
$this->request->get['path'] = $url[1];
} else {
$this->request->get['path'] .= '_' . $url[1];
}
}

if ($url[0] == 'manufacturer_id') {
$this->request->get['manufacturer_id'] = $url[1];
}

if ($url[0] == 'information_id') {
$this->request->get['information_id'] = $url[1];
}
} else {
$this->request->get['route'] = 'error/not_found';
}
}

if (isset($this->request->get['product_id'])) {
$this->request->get['route'] = 'product/product';
} elseif (isset($this->request->get['path'])) {
$this->request->get['route'] = $CatLayout; // подставляем полученный ранее результат
} elseif (isset($this->request->get['manufacturer_id'])) {
$this->request->get['route'] = 'product/manufacturer/info';
} elseif (isset($this->request->get['information_id'])) {
$this->request->get['route'] = 'information/information';
}

if (isset($this->request->get['route'])) {
return $this->forward($this->request->get['route']);
}
}
}

Если после все этого, у вас все-равно не отобразился новый шаблон, пройдитесь еще раз по пунктам, ничего ли не упустили и очищайте кеш (это зачастую является причиной не корректного отображения).

Данное решение было использовано на рабочем проекте, были выявлены доп. модули которые перебивали контроллер header.php (п.6) и контроллер модуля category.php (п.7), это модули на vqmod, tm_header.xml, tm_module_category.xml. Так же исправлен контроллер seo_url.php, так как на сайте был активирован SEO_PRO.

В заключении.

На решение задачи и выявление всех этих подводных камне ушло примерно 3 дня. Возможно кому то это поможет, и он/она не будет себе мозг выносить а решит уже быстрее, благодаря подсказке.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *