Суть задачи — изменить отображение шаблона у определенной категории.
Нашел вроде бы решение задачи тут
Но данный вариант отлично подходит если движек сайта без доп. модулей и плюшек.
И так, приступим.
Постановка задачи
Нужен отдельный шаблон для категории «Плитки»
Решение
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. Создаем в админ панеле новую схему
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 дня. Возможно кому то это поможет, и он/она не будет себе мозг выносить а решит уже быстрее, благодаря подсказке.