Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.
Вывод похожих товаров в списках товаров.
-
19 декабря 2014 г.
-
Здравствуйте! Прошу помочь с выводом похожих товаров в списках товаров.
Небольшое описание СУТИ:
На сайте имеется 2 категории товаров: НАБОРЫ и БЛЮДА. Продаваться будут только НАБОРЫ, которые состоят из 3-5 БЛЮД.
Т.е. сначала добавляем N-количество БЛЮД в каталог с определенными характеристиками (вес, рецепт, время приготовления и т.д.)
Затем добавляем НАБОР, например НАБОР КЛАССИЧЕСКИЙ, и в него через «похожие товары» добавляем 3-5 из БЛЮД, указываем у НАБОРА некоторые характеристики (кол-во персон, …) и указываем цену за НАБОР.
В каталоге необходимо выводить только НАБОРЫ, т.к. их продаем, а БЛЮДА будут отображаться только как состав набора, т.е. через «похожие товары».
На данный момент необходимо, чтобы на главной странице выводились только НАБОРЫ с указанием НАЗВАНИЯ, ЦЕНЫ, ХАРАКТЕРИСТИК и с отображением БЛЮД вместе с их параметрами. Т.е. получается, что в списке товаров (НАБОРОВ) у каждого товара еще и его «похожие товары» отображались.
Вывод товаров только категории НАБОРЫ сделал путем указания атрибута cat_id в шаблонном теге вывода блока некоторых товаровКод<insert name="show_block" module="shop" count="4" images="1" sort="date" cat_id="10" >
ТЕПЕРЬ ВОПРОС - Как вывести у каждого НАБОРА в этом блоке на главной странице список его БЛЮД?
Обращался в ТП… ребята помогают, НО т.к. я только начинаю работать с этой CMS… и долгое время работал с другой системой, то сложно пока вникнуть… поэтому еще и сюда пишу. Надеюсь, что на форуме больше советчиков будет :) да и думаю, что решение этой задачи пригодится в будущем кому нибудь.
Вот что ответила ТП, и как я пытался реализовать это, но не вышло пока:
Тег show_block_rel работает только с текущим товаром. ID товара он берет из переменной $this->diafan->_route->show. Можно добавить к тегу дополнительный атрибут, например shop_id, который подставлять вместо переменной $this->diafan->_route->show в функции show_block_rel() в shop.model.php. И нужно убрать ограничение "блок выводиться только для страницы товара" - в show_block_rel() shop.php.
После уточняющих от меня вопрос поступили следующие ответы:- Если Вы выводите этот блок внутри блока товаров, то в шаблоне у Вас выводиться цикл по товарам foreach($result["rows"] as $row){...}. И ID товара внутри этого цикла - $row["id"].
- Сначала вызывается функция show_block_rel в shop.php в ней Вы получите shop_id в виде $attributes["shop_id"]. Затем это значение передавайте в аналогичную фунцию в shop.model.php. В функции show_block_rel нужно заменить и другие упоминания $this->diafan->_route->show на принятый атрибут.
- Ограничение в контроллере функция show_block_rel в shop.php. Смотрите код: if ($this->diafan->_site->module != "shop" || ! $this->diafan->_route->show) return false;
Вот что сделано мною по данным указаниям:
1. В shop.php в функции show_block_rel в строке $attributes = $this->get_attributes(…); в конце добавил shop_id:Код$attributes = $this->get_attributes($attributes, 'count', 'images', 'images_variation', 'template', 'shop_id');
и ниже прописал:Код$shop_id = $attributes["shop_id"];
2. Также в файле shop.php временно закомментировал ограничение
//if ($this->diafan->_site->module != "shop" || ! $this->diafan->_route->show)
// return false;
3. Затем в файле shop.model.php в функции show_block_rel в конце добавил $shop_id:
Кодpublic function show_block_rel($count, $images, $images_variation, $param, $shop_id)
затем вместо "good_id" => $this->diafan->_route->show указал "good_id" => $shop_id,
и еще в двух местах ниже в данной функции $this->diafan->_route->show заменил на $shop_id
4. Далее в файле shop.view.show_block.php …
Там где выводится название товара вместо NAME указал ID… - это так… для теста… действительно отображается ID товара… вернул на место NAME…
Далее… после вывода названия и ссылки товара вставил строку с тегом вывода похожих товаров:
Кодecho $this->htmleditor('<insert name="show_block_rel" module="shop" count="10" images="1">');
Результата естественно нет, т.к. не указан атрибут shop_id. Теперь в тег добавляем атрибут shop_id:
Кодecho $this->htmleditor('<insert name="show_block_rel" module="shop" count="10" images="1" shop_id="102">');
(указал вручную ID товара… для теста)
В результате НИЧЕГО! Пробовал вместо 102 указать $row["id"] - тоже без результата.
В общем выходит, что я что то не доделал или не так делаю. Подскажите что не верно?
Заранее СПАСИБО!
P.S. Прошу сильно не ругать за столь большой текст, т.к. пытался полностью изложить, чтобы всё понятно было... и не ругать за такие вопросы, т.к. человек новый в данной системе... трудновато перестроиться с другой, на которой долго очень работал... НО видно, что данная CMS довольно хороша и гибка, только теперь нужно изучать и делать :) -
-
-
-
23 декабря 2014 г.
-
Цитатаи ниже прописал:
Код
$shop_id = $attributes["shop_id"];
Значит еще ниже исправьте
$this->model->show_block_rel($count, $images, $images_variation, $shop_id);
Далее в модели
Код
$cache_meta = array(
"name" => "block_rel",
"count" => $count,
"lang_id" => _LANG,
"good_id" => $shop_id,
"images" => $images,
"images_variation" => $images_variation,
"role_id" => $this->diafan->_users->role_id ? $this->diafan->_users->role_id : 0,"discounts" => $this->person_discount_ids,
"time" => $time
);
и
Код
. " GROUP BY e.id"
. ' ORDER BY e.id DESC',
$shop_id, $time, $time, 0, $count
);
И, наверное, этого должно быть достаточно.
---
По "многотексту" - задача не сложная, и быстрее бы решилась при более правильно и конкретно сформированном вопросе. Это ж форум, уточнить можно, если будут встречные вопросы. -
-
-
-
23 декабря 2014 г.
-
Спасибо, за ответ! Но я это уже сделал всё... ниже в посте написал чем дополнил... и полное содержание этих функций в shop.php и в shop.model.php привел - там всё это уже есть, НО всё-равно пока не работает. :(
-
-
-
-
23 декабря 2014 г.
-
Z:homekolbasawwwmodulesshopshop.php on line 196 and defined Z:homekolbasawwwmodulesshopshop.model.php:1544
покажите -
-
-
-
23 декабря 2014 г. , редакция: 23 декабря 2014 г.
-
shop.php on line 196Код
$this->model->show_block_rel($count, $images, $images_variation, $shop_id); /*строка 196*/
shop.model.php:1544Кодpublic function show_block_rel($count, $images, $images_variation, $param, $shop_id) /*строка 1544*/
Ниже в посте, если в кода этих функций нажать "показать весь код", там подписаны тоже эти строки, и другие строки с ошибками тоже -
-
-
-
20 декабря 2014 г. , редакция: 23 декабря 2014 г.
-
Включил режим разработки и выводит такие сообщения:Код
Missing argument 4 for Shop_model::show_block_rel(), called in Z:homekolbasawwwmodulesshopshop.php on line 196 and defined Z:homekolbasawwwmodulesshopshop.model.php:1544
Missing argument 5 for Shop_model::show_block_rel(), called in Z:homekolbasawwwmodulesshopshop.php on line 196 and defined Z:homekolbasawwwmodulesshopshop.model.php:1544
Undefined variable: shop_id Z:homekolbasawwwmodulesshopshop.model.php:1553
Undefined variable: param Z:homekolbasawwwmodulesshopshop.model.php:1556
Undefined variable: shop_id Z:homekolbasawwwmodulesshopshop.model.php:1577
Undefined variable: param Z:homekolbasawwwmodulesshopshop.model.php:1588
Затем в shop.php в строке 196 дописал $shop_id:Код$this->model->show_block_rel($count, $images, $images_variation, $shop_id);
Теперь выводятся такие сообщения:КодMissing argument 5 for Shop_model::show_block_rel(), called in Z:homekolbasawwwmodulesshopshop.php on line 196 and defined Z:homekolbasawwwmodulesshopshop.model.php:1544
Undefined variable: shop_id Z:homekolbasawwwmodulesshopshop.model.php:1553
Undefined variable: shop_id Z:homekolbasawwwmodulesshopshop.model.php:1577
Undefined offset: 1 Z:homekolbasawwwmodulesshopshop.model.php:1616
Вот содержание этих функций и номера строк с ошибками:
Функция show_block_rel в файле shop.phpКодpublic function show_block_rel($attributes)
{
// if ($this->diafan->_site->module != "shop" || ! $this->diafan->_route->show)
// return false;
$attributes = $this->get_attributes($attributes, 'count', 'images', 'images_variation', 'template', 'shop_id');
$count = $attributes["count"] ? intval($attributes["count"]) : 3;
$images = intval($attributes["images"]);
$images_variation = $attributes["images_variation"] ? strval($attributes["images_variation"]) : 'medium';
$shop_id = $attributes["shop_id"];
$this->model->show_block_rel($count, $images, $images_variation, $shop_id); /*строка 196*/
$this->model->result();
echo $this->diafan->_tpl->get('show_block_rel', 'shop', $this->model->result, $attributes["template"]);
}
Функция show_block_rel в файле shop.model.phpКодpublic function show_block_rel($count, $images, $images_variation, $param, $shop_id) /*строка 1544*/
{
$time = mktime(23, 59, 0, date("m"), date("d"), date("Y"));
//кеширование
$cache_meta = array(
"name" => "block_rel",
"count" => $count,
"lang_id" => _LANG,
"good_id" => $shop_id, /*строка 1553*/"images" => $images,
"images_variation" => $images_variation,
"param" => $param,
"role_id" => $this->diafan->_users->role_id ? $this->diafan->_users->role_id : 0,
"discounts" => $this->person_discount_ids,
"time" => $time
);
if (! $this->result = $this->diafan->_cache->get($cache_meta, "shop"))
{
$this->result["rows"] = DB::query_range_fetch_all(
"SELECT e.id, e.[name], e.[anons], e.timeedit, e.site_id, e.brand_id, e.no_buy, e.article,"
." e.hit, e.new, e.action, e.is_file FROM {shop} AS e"
. " INNER JOIN {shop_rel} AS r ON e.id=r.rel_element_id AND r.element_id=%d"
.($this->diafan->configmodules("rel_two_sided") ? " OR e.id=r.element_id AND r.rel_element_id=".$shop_id : '')
. ($this->diafan->_users->role_id ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='shop' AND a.element_type='element'" : "")
. " WHERE e.[act]='1' AND e.trash='0'"
." AND e.date_start<=%d AND (e.date_finish=0 OR e.date_finish>=%d)"
. " AND (e.access='0'"
. ($this->diafan->_users->role_id ? " OR e.access='1' AND a.role_id=".$this->diafan->_users->role_id : '')
. ")"
. " GROUP BY e.id"
. ' ORDER BY e.id DESC',
$shop_id, $time, $time, 0, $count /*строка 1577*/
);
$this->elements($this->result["rows"], 'block', array("count" => $images, "variation" => $images_variation));
$this->diafan->_cache->save($this->result, $cache_meta, "shop");
$params = array();
if ($param)
{
$param = explode('&', $param);
foreach ($param as $p)
{
if(strpos($p, '>=') !== false)
{
$operator = '>=';
}
elseif(strpos($p, '<=') !== false)
{
$operator = '<=';
}
elseif(strpos($p, '<>') !== false)
{
$operator = '<>';
}
elseif(strpos($p, '>') !== false)
{
$operator = '>';
}
elseif(strpos($p, '<') !== false)
{
$operator = '<';
}
else
{
$operator = '=';
}
list($id, $value) = explode($operator, $p, 2); /*строка 1616*/
$id = preg_replace('/[^0-9]+/', '', $id);
if ( ! empty($params[$id]))
{
if (is_array($params[$id]))
{
$params[$id][] = $value;
$operators[$id][] = $operator;
}
else
{
$params[$id] = array($params[$id], $value);
$operators[$id] = array($operators[$id], $operator);
}
}
else
{
$params[$id] = $value;
$operators[$id] = $operator;
}
}
}
}
foreach ($this->result["rows"] as &$row)
{
$this->prepare_data_element($row);
}
foreach ($this->result["rows"] as &$row)
{
$this->format_data_element($row);
}
}
Подскажите пожалуйста что и как… как передать атрибут в функцию… что не так? Я новичок в PHP… поэтому так туго понимаю моменты. -
-
-
-
- Андрей (R4W)
- 140
-
23 декабря 2014 г.
-
Прикольный логин kolbasa
-
-
-
-
-
21 декабря 2014 г.
-
2 дня ни одного ответа... похоже или знающие заняты... или я не в той ветке вопрос задал... :/
-
-
-
-
21 декабря 2014 г.
-
Ребята, прошу вас помочь, кто знает! Я думаю уже почти цель достигнута... немного не хватает. Тех поддержка молодцы... подсказали хорошо, но ... у них и без того много наверное работы, чем разжевывать :)...
-
-
-
-
22 декабря 2014 г.
-
Основная проблема конечно вот в этомЦитатаЯ новичок в PHP
Момент второй: Вы действительно много написали и хотите сразу решение. Только от того, что Вы написали всё, включая "в shop.php в строке 196 дописал $shop_id" вообще не легче. Потому, что удержать всю информацию в голове ни у кого не получится, а иначе надо садиться и начинать делать всё то же самое. То есть, выполнять Вашу работу, реализовывать этот функционал. А кто захочет потратить час-другой из своего рабочего времени, просто чтобы написать Вам ответ?
Или закажите разработку у тех, кто не новичок в РНР, или разбейте проблему на участки и сформулируйте простые последовательные вопросы. По одному! -
-
-
-
22 декабря 2014 г. , редакция: 22 декабря 2014 г.
-
Виталий, это понятно, что проблема "в Новичке" - я об этом сразу и написал, да и тему создал в соответствующем разделе.
По поводу того, что много написал - это да... не отрицаю, но не просил сразу решение, я же не написал "хочу сделать то-то - напишите мне плиз полностью решение...". Как раз таки наоборот, я хотел разобраться с этим сам, сначала ТП просил о помощи - она помогла (радует... ТП на Диафан). Затем, не смог до конца решить задачу и решил попросить помощи и совета на форуме.
К тому же, полистав форум, видел довольно очень подробные и по пунктам расписанные ответы... 1. сделать то-то там-то, 2. написать то-то, вставить то-то... и т.д. кстати, среди них не мало и Ваших Виталий ответов.
И соответственно, как раз таки наоборот моя цель была не "нагрузить" форумчан работой.., чтобы мне всё прям расписали, а постараться изложить более ПОЛНО суть и что уже сделано... и рассчитывал, что "Знающие" глянут на картину в целом и увидят чего не хватает для решения задачи... и дадут совет или ответ.
НО, как говорится... "хотел как лучше - получилось как всегда"!
По поводу заказа разработки... тоже согласен и в дальнейшем буду заказывать сложные вещи, но в данный момент уже кое что сделано, и хотелось бы уже решить эту задачу. -
-
-
-
23 декабря 2014 г.
-
Ане прощес сделать 2 категории 1 - наботы, а вторая сами блюда и категорию блюда скрывть? или я щадачу не так понял
-
-
-
-
23 декабря 2014 г.
-
Так и есть... у меня две категории... НАБОРЫ и БЛЮДА. выводятся только НАБОРЫ, а блюда добавляются в НАБОРЫ через "похожие товары".
Теперь нужно чтобы выводился список НАБОРОВ и сразу видно было что входит в НАБОР, т.е. список БЛЮД.
Вот тут можно наглядно посмотреть смысл - http://domavkusnee.ru/menu/
Т.е. НАБОРЫ - это меню основное, меню лайт, новогодее на сайте примере. А БЛЮДА - эта сами блюда входящие в состав наборов.
Как то так -
-
-
-
- Степан (idxdoc)
- 334
-
25 ноября 2016 г. , редакция: 25 ноября 2016 г.
-
Наверняка кому то пригодится готовый рабочий код:
Работаем с 4 файлами: shop.php, shop.model.php, shop.view.id.php, shop.view.list.php (Этот файл может быть любым, в зависимости где Вам нужно выводить похожие товары)
Итак:
В файле shop.php в функции show_block_rel меняем эту строчку:Код$attributes = $this->get_attributes($attributes, 'count', 'images', 'images_variation', 'template');
На эту:Код$attributes = $this->get_attributes($attributes, 'count', 'images', 'images_variation', 'template', 'shop_id');
Ниже дописываем:Код$shop_id = $attributes["shop_id"];
Еще ниже меняем эту строчку:Код$this->model->show_block_rel($count, $images, $images_variation);
На эту:Код$this->model->show_block_rel($count, $images, $images_variation, $shop_id);
В файле shop.model.php в функции show_block_rel в скобки дописываем $shop_id, в итоге получаем:Кодpublic function show_block_rel($count, $images, $images_variation, $shop_id)
Затем в $cache_meta меняемКод"good_id" => $this->diafan->_route->show,
НаКод"good_id" => $shop_id,
Ниже в запросе меняемКод$this->diafan->_route->show
На $shop_id, их должно быть 2 (версия 6.0.4.1)
После нужно не забыть поменять шаблонный тег вывода похожих товара в карточке товара, дополнив его атрибутомКодshop_id="'.$result["id"].'"
Иначе шаблонный тег работать не будет.
После всего проделанного мы можем написать данный код в любом местеКод<insert name="show_block_rel" module="shop" images="1" shop_id="1">
Единственное я указал shop_id=1, вам нужно будет как то получать туда id товара, но это уже другая тема, для моей цели я использовал ajax. -
-
Поблагодарили: Максим (web-prosto), Михаил (ZzzBep), Валерий Викторович (Sherrlok)
-
-
Новости
-
18 июня
-
В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
-
24 апреля
-
В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
-
12 января
-
После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке.
Блоги
-
24.04.2024
-
Выпустили новую сборку DIAFAN.CMS 7.1.4.
Блоги
-
12.01.2024
-
В данном руководстве познакомим вас с панелью управления DIAFAN.CMS