Post by S_Layer » Sat Sep 13, 2014 7:44 am

доброго времени суток!

вот какой вопрос:
предположим есть две категории товаров: телевизоры и телефоны.
как сделать так, что бы все товары из категории "телевизоры" показывались одной схемой, а все "телефоны" другой схемой. тоесть что бы можно было менять внешний вид страниц каждого товара по своему усмотрению.
создание новой схемы (с созданием файлов в контроллере и темплейте), набросом на товары этих схем не помогло, всеравно все товары показываются схемой product/product

заранее благодарен

Newbie

Posts

Joined
Sat Sep 13, 2014 7:39 am

Post by Antoni4 » Tue Sep 16, 2014 11:09 am

Я сейчас всё проверил, и сделал вывод, что авторы ОпенКарта эту функциональность до конца не доделали. (но с ними я это ещё не уточнял).

1. Создаём новую схему (с созданием файлов в контроллере и темплейте).
controller\product\product_tv.php
view\product\product_tv.tpl

2. Заходим в отдел схемы и добавляем новую схему:
new_layout01.jpg

Adding new layout 01 - new_layout01.jpg (140.87 KiB) Viewed 5273 times

new_layout02.jpg

Adding new layout 02 - new_layout02.jpg (94.68 KiB) Viewed 5273 times

3. Пристёгиваем новую схему к продукту.
new_layout0304.jpg

Adding new layout 03 + 04 - new_layout0304.jpg (288.51 KiB) Viewed 5273 times

4. Теперь, что-бы это всё работало добавляем код:

Файл: controller/product/product.php

Code: Select all

$layout_route = $this->model_catalog_product->getProductLayout($this->request->get['product_id']);		

if(!empty($layout_route) && $layout_route != 'product/product')
{
    $this->redirect($this->url->link($layout_route, $url . '&product_id=' . $this->request->get['product_id']));
}
Файл: model/catalog/product.php

Code: Select all

public function getProductLayout($product_id) 
{
    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_layout INNER JOIN " . DB_PREFIX . "layout_route ON " .  DB_PREFIX . "product_to_layout.layout_id = " . DB_PREFIX . "layout_route.layout_id WHERE product_id = '" . (int)$product_id . "' AND " . DB_PREFIX . "product_to_layout.store_id = '" . (int)$this->config->get('config_store_id') . "'");
		
    if ($query->num_rows) {
        return $query->row['route'];
    } else {
        return  '';
    }

}

User avatar
New member

Posts

Joined
Sat Sep 29, 2012 7:03 am

Post by Antoni4 » Tue Sep 16, 2014 11:12 am

Пристёгиваю оба файла, что-бы было понятно где добавлять код.

modified product controller

modified product model

Схемы на категории настраиваются аналогично.

User avatar
New member

Posts

Joined
Sat Sep 29, 2012 7:03 am

Post by Antoni4 » Wed Sep 17, 2014 12:30 am

Я задал этот вопрос в другом отделе форума, и мне объяснили что "layout overwrite" позволяет определять какие модули будут отображаться на странице продукта или категории, а не для того что бы полностью сменить шаблон.

Когда мы создаём новую схему (layout) (назовём её Product TV и прописываем рут (route) как product/product), то в отделе модулей теперь можно пристёгивать определённые модули к этой новой схеме.

Допустим к стандартной схеме Product у нас пристёгнуты модули А,Б,В.
К новой схеме Product TV мы пристёгиваем модули А,Г,Д.

То-есть если у нас продукт А находится под стандартной схемой то на его странице будут отображаться модули А,Б,В.
А если продукт Б находится под новой схемой то на его странице будут отображаться модули А,Г,Д.

Вот оригинальный ответ:
You are using it wrong.

All layout override actually does is give you a different named layout to assign modules to. It DOES NOT change templates. So if your main product page say always has a bestsellers module in your right hand column, but you have a single product you do NOT want to show that module on for some reason.

You would go to layouts, create a new one called say "nobestsellers" with the same route as the product layout has and save.

Then when you add that product you don't want it on, you select layout override on the design table from edit > product and select "no bestsellers". And save.

So then the bestseller mod would show on every page that uses the standard product layout but NOT the product you selected the layout override on.

Naturally, you could target different modules, banners, whatever, on that product by editing the banners module and adding one to the "nobestsellers" layout, etc.

Layouts are actually pretty powerful once you wrap your head around how they work, but if you want totally different templates, it takes more work.
Если вы всё же хотите полностью сменить шаблон определенного типа продукта то я так понял что этой функции в стандартном ОпенКарте нет. По хорошему, что бы не нарушать оригинальное назначение схем ОпенКарта, нужно писать новую функциональность для смены шаблона продукта.

User avatar
New member

Posts

Joined
Sat Sep 29, 2012 7:03 am
Who is online

Users browsing this forum: No registered users and 6 guests