Перейти к содержимому


Правила форума

Внимание!!! Если не можете скачать, пожалуйста ознакомьтесь с условиями получения доступа с файлам форума. Правила форума


Модуль "Связанные товары"


Сообщений в теме: 17

#1 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 14 августа 2012 - 20:04

Модуль позволяет перекрестно связать группу товаров между собой каждый-к-каждому
и показывать ссылки на остальные товары группы в детальном описании каждого товара группы.
Как это выглядит можно посмотреть тут -
http://shop.renacomp...-Q2612A%29.html
- в подробном описании у каждого из этих пяти товаров в блоке "связанные товары" будут
краткие описания оставшихся четырех. Ровно такие же, как в категориях.


Админская часть. Требует VIP-версии ShopCMS, т.к. надо править файл admin.php
-----------------------------------------------------------------------------

1. копируем файлы
crosslink.php -> /core/includes/admin/sub
crosslink_set.php -> /core/includes/admin/sub
crosslink_conf.php -> /core/includes/processor
crosslink.tpl.html -> /core/tpl/user/[шаблон]/blocks (в случае дефолтового шаблона, иначе см. ниже).

comment:
crosslink_simlpe.tpl.html - простейший пример блока для дальнейшей переделки
crosslink_new.tpl.html - пример блока для не совпадающего по переменным шаблона заказчика модуля


2. редактируем admin.php:

2.1 находим строку
// remove product from appended category
и над ней вставляем строку
require_once "core/includes/admin/sub/crosslink_set.php";

2.2 находим блок
<input type=hidden name='save_spwc' value='0' id='save_spwc'>
<input type=hidden name='save_product_for_file' value='0' id='save_product_for_file'>
<input type=hidden name='save_product' value='0' id='save_product'>
<input type=hidden name='save_pictures' value='0' id='save_pictures'>
<input type=hidden name='add_category' value='0' id='add_category'>
<input type=hidden name='save_product_without_closing' value='0' id='spwc'>
<input type=hidden name='AddProductAndOpenConfigurator' value='0' id='AddProductAndOpenConfigurator'>
<input type=hidden name='optionID' value='0' id='optionID'>

и добавляем к нему строку
<input type=hidden name='add_crosslink' value='0' id='add_crosslink'>


2.3 находим последнее вхождение строки data/admin/pixel.gif
и ниже нее вставляем
<?php require_once "core/includes/admin/sub/crosslink.php";?>


2.4 находим строку
if ( in_array($_GET["do"], array( "invoice", "configurator", "wishcat", "wishlist", "wishprod", "get_file" ))) {

и меняем ее на
if ( in_array($_GET["do"], array( "invoice", "configurator", "wishcat", "wishlist", "wishprod", "get_file", "crosslink_conf" ))) {


3. заходим в админке в свойства любого товара, при этом создастся SQL-таблица со связями "товар-товар".
Там же (в свойствах товара) в конце должен появится новый блок "Связанные товары".
Если его нет, значит что-то не так :).

Слева будет окошко с задаваемым фильтром поиска (по умолчанию равен текущему товару) и кнопка "Найти",
по которой показывается результат поиска.

Справа выпадающий список из всех товаров, где можно добавлять связанные товары по одному.

Клиентская часть.
-----------------

(написано на основе дефолтового шаблона в предположении, что недефолтовый отличается не сильно)

1. берем category.tpl.html и копируем его в core/tpl/user/[шаблон]/blocks переименовывая в crosslink.tpl.html

2. удаляем из этого crosslink.tpl.html все лишнее - описания категорий, прикрепленные страницы и прочее - оставляя
только довольно небольшой блок <table>...</table>, откуда вызывается product_brief.tpl.html.

3. добавляем в созданный crosslink.tpl.html в самое начало текст (код)
{php}
$productID = $this->get_template_vars('productID');
$data = db_query("
SELECT pc.crossID AS productID, p.name, p.Price, p.categoryID, p.in_stock, pp.filename AS picture, p.brief_description
FROM ".DB_PRFX."product_crosslink AS pc
LEFT JOIN ".PRODUCTS_TABLE." AS p ON p.productID=pc.crossID
LEFT JOIN ".PRODUCT_PICTURES." AS pp ON p.default_picture=pp.photoID
WHERE pc.productID=$productID AND p.enabled=1 AND p.categoryID>1");
while ($row = db_fetch_assoc($data))
    {
    $row["PriceWithUnit"] = show_price($row["Price"]);
    $r[] = $row;
    }
$this->assign("products_to_show", $r);
$this->assign("products_to_show_counter", count($r));
{/php}


comment-1: строка с "product_to_show_counter" нужна только потому, что автор дефолтового шаблона
для true на последнем элементе цикла {section} почему-то применил кострукцию
$products_to_show_counter eq $smarty.section.u.index+1
вместо применения $smarty.section.u.last

comment-2: не во всех шаблонах в product_brief.tpl.html используются ровно те же имена переменных, что и в дефолтовом,
так что если описание, ссылка или что-то другое не позывается правильно или не показывается вообще - надо разбираться.

4.1 либо добавляем в админке в управлении блоками ("добавить блок из файла") блок crosslink.tpl.html
туда, где хотим его видеть. При этом надо понимать, что что-либо показываться в этом блоке будет
тогда, когда на экране присутствует блок или модуль, для которого задана смарти-переменная productID.
Например, это подробное описание товара и некоторые другие.

4.2 либо в желаемое место файла product_detailed.tpl.html вставляем что-то типа (дописать-переписать по вкусу)

<!--Crosslink-->
{php}
$productID = $this->get_template_vars('productID');
$data = db_query("
SELECT pc.crossID AS productID, p.name, p.Price, p.categoryID, p.in_stock, pp.filename AS picture, p.brief_description
FROM ".DB_PRFX."product_crosslink AS pc
LEFT JOIN ".PRODUCTS_TABLE." AS p ON p.productID=pc.crossID
LEFT JOIN ".PRODUCT_PICTURES." AS pp ON p.default_picture=pp.photoID
WHERE pc.productID=$productID AND p.enabled=1 AND p.categoryID>1");
while ($row = db_fetch_assoc($data))
    {
    $row["PriceWithUnit"] = show_price($row["Price"]);
    $r[] = $row;
    }
$this->assign("products_to_show", $r);
{/php}

{if $products_to_show}
{include file="header.tpl.html" header='Связанные товары и услуги'}
<table cellspacing="0" cellpadding="0" width="100%">
  {section name=u loop=$products_to_show}
  {if $smarty.section.u.index is div by $smarty.const.CONF_COLUMNS_PER_PAGE}<tr>{assign var="helpcounter" value=0}{/if}
  {assign var="helpcounter" value=$helpcounter+1}
  <td width="{math equation="100 / x" x=$smarty.const.CONF_COLUMNS_PER_PAGE format="%d"}%" align="left" valign="top">
  {include file="product_brief.tpl.html" product_info=$products_to_show[u]}
  </td>
    {if ($smarty.section.u.index+1) is div by $smarty.const.CONF_COLUMNS_PER_PAGE || $smarty.section.u.last}
    </tr>
    <tr>
    {section name=e loop=$smarty.const.CONF_COLUMNS_PER_PAGE max=$helpcounter}
    {assign var="idnrecat" value=$smarty.section.u.index-$helpcounter+$smarty.section.e.index+1}
    <td align="left">
    <table cellspacing="0" cellpadding="0" width="100%">
    <tr>
    <td class="hdbot"><a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$products_to_show[$idnrecat].productID}.html{else}index.php?productID={$products_to_show[$idnrecat].productID}{/if}">{$smarty.const.STRING_MOREPR}</a></td>
    </tr>
    </table>
    </td>
    {if $smarty.section.e.index+1 ne $smarty.const.CONF_COLUMNS_PER_PAGE}<td><img src="data/{$smarty.const.TPL}/pixel.gif" class="delim" alt=""></td>{/if}
    {/section}
    </tr>
    {else}
    <td class="delim"><img src="data/{$smarty.const.TPL}/pixel.gif" class="delim" alt=""></td>
    {/if}
  {/section}
</table>
{/if}
<!--Crosslink end-->



Добавление-удаление (в админке в свойствах товара).
--------------------

1. Групповое (слева):
Задаем строку фильтра, нажимаем "Найти". Получаем окно с выборкой по этому фильтру.
В колонке "Add" ставим галочки если надо создать группу.
В колонке "Del" ставим галочки если надо удалить группу.
В группу связанных товаров будут входить все выбранные элементы списка плюс сам основной товар.

comment: Подчеркиваю: создаются связи "каждый-к-каждому", аналогично и удаляются.
Если кому-то не знаком этот термин, то попробую коротко объяснить.
Есть товар-1, в админке которого мы находимся. Набираем в форме "что-нибудь" и получаем окошко со списком из
товар-2
товар-3
товар-4
товар-5
Ставим галки "Add" у товара-2 и товара-3. Сохраняем. Создались связи (слово "товар" опускаю) 1-2, 2-1, 1-3, 3-1, 2-3, 3-2.

Теперь при выводе товара-1 будут показаны "брифы" товара-2 и товара-3,
при выводе товара-2 будут показаны "брифы" товара-1 и товара-3,
а при выводе товара-3 будут показаны "брифы" товара-1 и товара-2.

В админке все эти связи, естественно, будут видны у всех товаров из группы, а не только у товара-1,
тут все товары группы равнозначны.


2. По одному (справа):
Добавляется прямая связь основного товара и выбранного. Обратной связи не добавляется.
При удалении удаляется тоже только прямая связь.
Если хочется создавать/удалять также и обратную связь - раскомментируйте соответствующие строки в
файле crosslink_set.php

comment: У себя я раскомментировал почти сразу после начала использования модуля, это оказалось удобнее.

Прикрепленные файлы

  • Прикрепленный файл  CrossLink.zip   10,26К   33 Количество загрузок:

http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#2 ron

    Пользователь

  • Download User
  • PipPip
  • 14 сообщений
Репутация: 0
Начинающий

Отправлено 09 октября 2012 - 22:21

Цитата

Задаем строку фильтра, нажимаем "Найти". Получаем окно с выборкой по этому фильтру.
Выпадает пустое окно, ниже картинка - что пишет в адресной строке...
Изображение
При выборе по одному, 2 вариант, справа - всё нормально.
В чем может быть проблема?

#3 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 10 октября 2012 - 10:15

Просмотр сообщенияron сказал:

В чем может быть проблема?
Выглядеть ссылка в новом окне долна примерно так: site.ru/admin.php?do=crosslink_conf&productID=736&search=test
Думаю, как и в "живом поиске", дело в кодировках.
1. кодировка браузера, в которой он отправляет введенные данные (для ShopCMS это обычно Windows-1251)
2. кодировка, в которой сервер предполагает полученные данные (для нынешних серверов это почти всегда UTF-8)
3. кодировка, в которой хранятся данные в SQL-базе (Windows-1251, UTF-8, еще что-нибудь).
В данном случае SQL ни при чем, т.к. у Вас уже на этапе &search= пустая строка вместо строки поиска

Это мои предположения, а вовсе не уверенность. Чтобы понять, в кодировке ли дело попробуйте ввести в строке поиска английское слово.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#4 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 166
Мастер

Отправлено 10 октября 2012 - 11:00

Стоит заметить, что при использовании кирилицы и спецсимволов в ajax запросах, разные браузеры отправляют на сервер разную кодировку (opera -- utf-8, chrome/firefox -- 1251), поэтому для строки search стоило бы применить url_encode и decode на стороне скрипта соответсвенно
Изображение Изображение Изображение

#5 ron

    Пользователь

  • Download User
  • PipPip
  • 14 сообщений
Репутация: 0
Начинающий

Отправлено 10 октября 2012 - 11:54

admin.php?do=crosslink_conf&productID=3864&search=oil
admin.php?do=crosslink_conf&productID=3864&search=%EC%FB%EB%EE

Добавил в один товар в заголовок Oil oil
Оба варианта не работают, т.е. вообще ничего не пишет, просто белая страница без исходного кода.

#6 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 10 октября 2012 - 13:01

Просмотр сообщенияeugene_wb сказал:

Стоит заметить, что при использовании кирилицы и спецсимволов в ajax запросах, разные браузеры отправляют на сервер разную кодировку
Я не использовал в этом модуле AJAX. Или использовал, но не знаю об этом, т.к. стал изучать AJAX заметно позже этого модуля :).

Просмотр сообщенияron сказал:

Оба варианта не работают, т.е. вообще ничего не пишет, просто белая страница без исходного кода
Тогда стандартный ход:
пароли к ftp и админке сайта - в личку. В свободное время я посмотрю в чем дело. Гадать дальше мне представляется бесперспективным.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#7 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 166
Мастер

Отправлено 10 октября 2012 - 13:05

Просмотр сообщенияbadisoft сказал:

Я не использовал в этом модуле AJAX. Или использовал, но не знаю об этом, т.к. стал изучать AJAX заметно позже этого модуля
ну это я так написал, на будущее ;)
Изображение Изображение Изображение

#8 ron

    Пользователь

  • Download User
  • PipPip
  • 14 сообщений
Репутация: 0
Начинающий

Отправлено 10 октября 2012 - 13:25

...если до Вас не доходят СМС - попробуйте перечитать их ещё раз...
файл crosslink_conf.php я положил не в /core/includes/pocessor, а в /core/includes/admin/sub
sorry ^_^

#9 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 10 октября 2012 - 14:54

Просмотр сообщенияeugene_wb сказал:

ну это я так написал, на будущее
В свете моих других вопросов? :)
Спасибо, там оно пришлось к месту, не знал. Я как раз разбираюсь, как бы извратиться, чтобы <textarea>, передаваемую функцией $.ajax через POST на каком-либо этапе сконвертировать в нужную кодировку.

Просмотр сообщенияbadisoft сказал:

1. Групповое (слева): Задаем строку фильтра, нажимаем "Найти". Получаем окно с выборкой по этому фильтру.
После написания модуля у меня была идея (она явно напрашивалась после реального использования модуля) сделать строку фильтра как в "живом фильтре с картинками", но наоборот :). Там отделенные пробелом слова берутся по И, т.е. название должно содержать каждое слово фильтра, а тут надо сделать по ИЛИ, чтобы в выборку попадал товар, содержащий любое из слов фильтра. Таким образом удастся "огрупить" товары, никак не пересекающиеся по названию. Это не сложно.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#10 fastik

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 161 сообщений
Репутация: 11
Начинающий
  • ГородТирасполь

Отправлено 14 февраля 2013 - 16:03

не отображаются фотографии связанных товаров, у меня в категории используются big картинки, может в этом проблема?

#11 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 14 февраля 2013 - 16:29

Скорее всего да.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#12 fastik

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 161 сообщений
Репутация: 11
Начинающий
  • ГородТирасполь

Отправлено 17 февраля 2013 - 17:24

и еще хотел спросить, кто-то замечал дикие тормоза после установки этого модуля?

#13 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 18 февраля 2013 - 11:25

Просмотр сообщенияfastik сказал:

и еще хотел спросить, кто-то замечал дикие тормоза после установки этого модуля?
Я не замечал, но, возможно, на больших базах это из-за сложного запроса - селекта с двумя джойнами. Разбейте его на два-три раздельных.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#14 Арти

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 54 сообщений
Репутация: 1
Начинающий

Отправлено 09 января 2015 - 16:27

доброго времени суток ! всех с наступившем новым годом ! Сложился такой вопрос поставил данный модуль на сайт вроде все работает ! РS. на сайте стоит модуль чпу и почему то он не генерирует адреса на товарах привязанных ,

вроде как нашел строку отвечает за слово подробнее
[/size][size=4]<td class="hdbot"><a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$products_to_show[$idnrecat].productID}.html{else}index.php?productID={$products_to_show[$idnrecat].productID}{/if}">{$smarty.const.STRING_MOREPR}</a></td>


а по установке чпу вроде ее надо заменить на

{$products_to_show[$idnrecat]|@fu_make_url}


но вроде это не все так как товары привязанные имеют ссылку
Скрытый текст

подскажите пожалуйста где еще надо поправить ? Заранее спасибо !

#15 pit4l

    Пользователь

  • Пользователи
  • PipPip
  • 10 сообщений
Репутация: 2
Начинающий

Отправлено 13 февраля 2018 - 17:27

Может быть автор еще заходит в тему, или кто-то другой подскажет.
Если выбирать товары через поиск (групповой выбор), то связь каждый к каждому создается только для тех товаров, которые будут в окне результатов поиска. Т.е. заходим в карточку товара "товар 000". Набираем в поиске "товар 100", создаем связь с ним. Набираем в поиске "товар 200", создаем связь с ним. Теперь товары 100 и 200 связаны с 000 каждый к каждому. Но товар 100 не связан с 200. И чтобы связать их все в группу, нужно задать такой поиск, чтобы в него сразу попали все нужные товары. Как сделать, чтобы связи создавались при добавлении через поиск по одному товару.

#16 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 13 февраля 2018 - 17:53

Цитата

Как сделать, чтобы связи создавались при добавлении через поиск по одному товару.
Ваше желание создать связь 100-200 после создания связей 000-100 и 000-200 понятно.
Но вовсе не всем и не всегда нужно автоматическое создание связи 2-3 при наличии 1-2 и 1-3.
Насколько я помню, в модуле такое не реализовано.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#17 pit4l

    Пользователь

  • Пользователи
  • PipPip
  • 10 сообщений
Репутация: 2
Начинающий

Отправлено 13 февраля 2018 - 21:06

По моему, наоборот. Я столкнулся с этим на реальном использовании модуля. Товаров 1000+, как связать товары с разным названием? Пока я просто задаю в поиске слово, которое есть в названии у всех нужных товаров. И из длинного списка долго выбираю нужные. Там выше еще предлагался вариант - в поиске указывать слова для отбора через ИЛИ. Вот это было бы еще удобнее. Подскажите, как это можно реализовать?

#18 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 14 февраля 2018 - 16:18

Цитата

Товаров 1000+, как связать товары с разным названием?
Если хочется связать "каждый-с-каждым" несколько совершенно разнородных по названию товаров, которые невозможно получить путем одного поискового запроса, то процесс должен быть двухступенчатым.
1. собрать список товаров. Прямым выбором, несколькими поисками или еще как-то - не важно. В результате должен быть искомый список товаров.
2. сделать связи "каждый-с-каждым" для этого списка.

Цитата

Там выше еще предлагался вариант - в поиске указывать слова для отбора через ИЛИ. Вот это было бы еще удобнее. Подскажите, как это можно реализовать?
Я и модуль-то почти не помню, а Вы хотите, чтобы я за пять минут по памяти набросал решение.
В общем случае, очевидно, изменить поисковый запрос.
Там наверняка слова (разделенные пробелом) ищутся по И.
Ообычно я именно так делаю, да и в shopCMS штатный поиск с такой же логикой.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)