и показывать ссылки на остальные товары группы в детальном описании каждого товара группы.
Как это выглядит можно посмотреть тут -
http://shop.renacomp...HP-Q2612A).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: У себя я раскомментировал почти сразу после начала использования модуля, это оказалось удобнее.