Добавление своего шаблона статьи в Open Cart 2.0

По умолчанию Open Cart предоставляет всего один шаблон для всех текстовых страниц. Иногда его не хватает. Однако Open Cart позволяет довольно несложно добавлять свои шаблоны. Как добавить свой шаблон (схему) для статьи в Open Cart 2.0?

Первый этап - это создание файлов шаблона и контроллера

Добавим, к примеру, свой шаблон для страницы портфолио.

1) В catalog/controller/information/ создаем файл portfolio.php (копируем из information.php).

2) Открываем этот файл и меняем в самом верху название класса с ControllerInformationInformation на ControllerInformationPortfolio. Название класса должно соответствовать пути до файла контроллера controller/information/portfolio.php.

3) В этом же файле portfolio.php внизу, где определяется путь до шаблонов, меняем название файла шаблона с information.tpl на portfolio.tpl.

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/information/portfolio.tpl')) {
	$this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/information/portfolio.tpl', $data));
} else {
	$this->response->setOutput($this->load->view('default/template/information/portfolio.tpl', $data));
}

4) В папке с шаблонами страниц /template/information/ создаем файл portfolio.tpl

Второй этап - создаем новую схему

В админке идем: Шестеренка -> Дизайн -> Макеты.
Нажимаем на "Добавить". Задаем название схемы и прописываем путь к контроллеру information/portfolio. При желании ниже можно подключить модули, которые должны отображаться на странице.

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

Смотрим, что получилось. Если у Вас ЧПУ не включены, то всё замечательно. В противном случае имеем проблему: страница портфолио доступна по адресу типа site.ru/index.php?route=information/portfolio&information_id=xx (xx - число, id статьи), а по адресу site.ru/index.php?route=information/information&information_id=xx отображается эта же страница, но с дефолтным шаблоном статьи. И именно ко второму адресу применяется модуль ЧПУ. Т.е., если Вы задали этой странице ЧПУ, скажем, portfolio, то по адресу site.ru/portfolio будет по-прежнему отображаться дефолтный шаблон.

Изменения в модуле ЧПУ

Чтобы страницы с новыми шаблонами стали доступны при включенном модуле ЧПУ, нужно в файле catalog/controller/common/seo_url.php сделать следующие правки.
В блоке

if (!isset($this->request->get['route'])) {
	...
}

найти ту часть, которая относится к статьям, т.е. if(isset($this->request->get['information_id'])) {...} и дописать в неё выбор route в зависимости от заданной схемы.

1) Получим id схемы по id статьи:

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "information_to_layout WHERE information_id = '" . $this->request->get['information_id'] . "'");
$layout_id = $query->row['layout_id'];

2) Получим route (т.е. путь к контроллеру) по id схемы

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "layout_route WHERE layout_id = '" . $layout_id . "'");
$this->request->get['route'] = $query->row['route'];

Всё вместе:

if (!isset($this->request->get['route'])) {
	if (isset($this->request->get['product_id'])) {
		$this->request->get['route'] = 'product/product';
	} elseif (isset($this->request->get['path'])) {
		$this->request->get['route'] = 'product/category';
	} elseif (isset($this->request->get['manufacturer_id'])) {
		$this->request->get['route'] = 'product/manufacturer/info';
	} elseif (isset($this->request->get['information_id'])) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "information_to_layout WHERE information_id = '" . $this->request->get['information_id'] . "'");
		if ($query->num_rows) {
			$layout_id = $query->row['layout_id'];
			$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "layout_route WHERE layout_id = '" . $layout_id . "'");
			if ($query->num_rows) {
				$this->request->get['route'] = $query->row['route'];
			} else {
				$this->request->get['route'] = 'information/information';
			}
		} else {
			$this->request->get['route'] = 'information/information';
		}
	}
}

Теперь контент-менеджер может сам выбирать в админке шаблоны для статей.

Способ попроще

В интернете нашла способ попроще - точнее, он облегчает жизнь программисту и усложняет контент-менеджеру. Способ заключается в том, что в контроллер information.php просто добавляется выбор шаблона в зависимости от id статьи:

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/information/information_'.$information_id.'.tpl')) {
	$this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/information/information_'.$information_id.'.tpl', $data));
} elseif (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/information/information.tpl')) {
	$this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/information/information.tpl', $data));
} else {
	$this->response->setOutput($this->load->view('default/template/information/information.tpl', $data));
}

В /template/information/ нужно будет для некоторых статей создать файлы с именами типа information_42.tpl, где 42 - это id статьи.

В этом случае контент-менеджер не может сам назначать разные шаблоны статьям из админки. И если двум статьям нужно сделать одинаковый шаблон, придется делать два файла с одинаковым содержимым и с разными именами, скажем information_42.tpl и information_135.tpl.

Оставить комментарий

Ваш e-mail не будет опубликован