ankfrv
@ankfrv

Как создать макет страницы товара, отличный от других?

Прошу тряпками не бросаться — я не программист, просто собираю магазина на Опенкарт.
Итак, будущий магазин будет иметь два вида обработки заказа — традиционный (купить → корзина → оформление → оплата → завершение) и через менеджера (заказать звонок → оформление в телефонном режиме). Соответственно, некоторые товары должны иметь не кнопку корзины, а кнопку заказа звонка, ну и по мелочи отличаться — часть информации там не нужна, из макета хорошо бы удалить.

Далее, создаю копию product.tpl и называю его, скажем, zakaz.tpl. Проделываю то же с контроллером: product.php → zakaz.php. Меняю в обоих файлах все «product/product» на «product/zakaz» (возможно, ошибка уже где-то тут).

Иду в админку, добавляю макет Zakaz (product/zakaz). Иду в товар, меняю ему дизайн с Product на Zakaz.

Пытаюсь редактировать zakaz.tpl, например, удаляю кнопку купить — ровным счетом никакого эффекта.

Кто дурак я уже понял. Как решить проблему с макетом?
  • Вопрос задан
  • 1766 просмотров
Пригласить эксперта
Ответы на вопрос 4
@oleg_plotnik
Разработчик
Столкнулся со схожей проблемой. Решения в интернете не устроили. Сделал свой вариант, может кому пригодится.
Добавляем в catalog\model\catalog\product.php новую функцию
// получение пути шаблона
public function getProductLayoutRoute($layout_id) {
	$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "layout_route WHERE layout_id = '" . (int)$layout_id . "'");
	if ($query->num_rows) {
		return $query->row['route'];
	} else {
		return "";
	}
}


Меняем в catalog\controller\product\product.php строку
$this->response->setOutput($this->load->view('product/product', $data));

на
$layout_id = $this->model_catalog_product->getProductLayoutId($product_id);
if($layout_id) {
	$route = $this->model_catalog_product->getProductLayoutRoute($layout_id);
	// проверяем существование файла шаблона
	$filepath = DIR_TEMPLATE . $this->config->get('config_theme') . '/template/' . $route . '.tpl';
	if(file_exists($filepath)) {
		$this->response->setOutput($this->load->view($route, $data));
	} else {
		$this->response->setOutput($this->load->view('product/product', $data));
	}
} else {
	$this->response->setOutput($this->load->view('product/product', $data));
}


Далее, создаем копию product.tpl и называем его, скажем, zakaz.tpl. Контроллер копировать НЕ надо.
В админке добавляем макет Zakaz, указываем путь к новому файлу шаблона product/zakaz (без tpl). Идем в товар, меняю ему дизайн с Product на Zakaz.
Ответ написан
glk92
@glk92
Веб-разработчик
Просто клонированием product.tpl не обойдется, нужно так же клонировать контроллеры, модели и языковые файлы, дорабатывать общий контроллер, прикручивать какой-то костыль в админ панели для вывода того или иного шаблона...

Можно сделать проще.
Варианты:

1) Вывод стилей по условию:

Создаем два разных файла стилей css,
В product.tpl пишем условие по которому будет выводится тот или другой файл стилей, возможно с привязкой к product_id

2) Вывод варианта верстки по условию:

Пишем условие, также с привязкой по product_id
И делаем два варианта верстки... Можно заморочиться, чтобы верстка была в разных файлах, чтобы не путаться в product.tpl

3) Сам не пробывал, не знаю подойдет ли Вам этот вариант, но вроди бы то что нужно

https://opencartforum.com/files/file/591-%D1%81%D0...
Ответ написан
Комментировать
@amfetamine
просто создаёте в таблице oc_product столбец, который характеризует какой из 2 шаблонов будет использоваться, в админке добавляете чек, в контроллере ставите условие по параметру из бд для выбора шаблона, клонируете шаблон product.tpl и в клонированном шаблоне делаете необходимые изменения.
и все, и никакой головной боли
Ответ написан
Комментировать
halfhope
@halfhope
Я когда-то писал модуль "Персонализованные шаблоны"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы