Адаптация обратного вывода сопутствующих товаров под HostCms v. 6
Приветствую, уважаемые форумчане.
В разделе полезных решений на базе HostCms v. 5 , созданное Kotoff'ым, позволяющее отображать товары, для которых текущий товар является сопутствующим.
Мой сайт работает на HostCms v. 6, поэтому буду адаптировать под него.
Столкнулся со следующей проблемой: Метод отсутствует в Api 6.
Пробовал использовать getXml(), но получаю xml вида
Последующий код расположен в lib_6.php (Типовой динамической странице Интернет-магазина).
Привожу исходный, рабочий код Kotoff'а (HostCMS v.5) и код на стадии адаптации(к HostCMS v.6)
// проверим, не является ли этот товар сопутствющим для других
$query = 'SELECT `shop_items_catalog_item_id` FROM `shop_intermediate_table` WHERE `sho_shop_items_catalog_item_id` = ' .
to_int($GLOBALS['shop_item_path']['item']);
$DataBase = &singleton('DataBase');
$tying_hosts = $DataBase->select($query);
if ($DataBase->get_count_row() > 0 && $tying_hosts) {
$xml_host = '';
$host_param['xml_show_tying_products'] = false;
$host_param['xml_show_modification'] = false;
$host_param['xml_show_comments'] = false;
while ($host_item = mysql_fetch_assoc($tying_hosts)) {
$host_row = $shop->GetItem($host_item['shop_items_catalog_item_id']);
$xml_host .= $shop->GenXml4Item(0, $host_row, $site_users_id, $host_param);
}
$param['external_xml'] = '<tying_hosts>' . $xml_host . '</tying_hosts>';
Вот на этом этапе адаптации я застрял:
// Проверим, не является ли этот товар сопутствющим для других
//Получаем ид текущего товара
if (is_object(Core_Page::instance()->object) && get_class(Core_Page::instance()->object) == 'My_Shop_Controller_Show')
{//Проверяем, что это объект контроллера магазина (будьте внимательны, у меня он называется My_Shop_Controller_Show, у вас может называться иначе.)
$iItem = intval(Core_Page::instance()->object->item);//Получаем id товара
$query = 'SELECT `shop_item_id` FROM `shop_item_associated` WHERE `shop_item_associated_id` = ' .
to_int($iItem); //Собираем товары, с которыми ассоциирован данный товар
print_r("<p>");print_r($query);print_r("</p>"); //Дебаг
$DataBase = &singleton('DataBase');
$tying_hosts = $DataBase->select($query);
if ($DataBase->get_count_row() > 0 && $tying_hosts) {
$xml_host = '';
$host_param['xml_show_tying_products'] = false;
$host_param['xml_show_modification'] = false;
$host_param['xml_show_comments'] = false;
while ($host_item = mysql_fetch_assoc($tying_hosts)) {
print_r("<p>Номер товара");print_r($host_item['shop_item_id']);print_r("</p>");//Дебаг
$host_row = $Shop_Controller_Show->getEntity($host_item['shop_item_id']); //Получаем сущность (товар) $xml_host .= $Shop_Controller_Show->getXml($host_row);//Тут необходимо сформировать валидный XML
print_r("<p>getXml: ");print($Shop_Controller_Show->getXml($host_row));print_r("</p>");//Дебаг
print_r("<p>row: ");print($host_row);print_r("</p>");//Дебаг
}
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('tying_hosts')->value($xml_host));//Добавляем секцию tying_hosts в xml
}
Подскажите пожалуйста, в чём моя ошибка (почему я получаю xml с экранированными символами, да ещё и не валидный)? Может быть кто-то уже адаптировал это решение для версии 6?
Re: Адаптация обратного вывода сопутствующих товаров под HostCms v. 6
HostCMS, благодарю, вы помогли мне закончить адаптацию решения
Выкладываю код адаптированного решения сюда. Напоминаю, что автором решения является Kotoff, я же просто адаптировал его под версию HostCMS v.6
Если администрация форума посчитает нужным переместить тему в полезные решения для hostcms v 6 - да будет так.
Итак, для того чтобы в HostCMS v.6 выводились товары, для которых текущий товар является сопутствующим, необходимо: В Типовой динамической странице интернет магазина (lib_6.php), внести следующие изменения:
Перед самым последним $Shop_Controller_Show вставить код:
// Проверим, не является ли этот товар сопутствющим для других
//Получаем ид текущего товара
if (is_object(Core_Page::instance()->object) && get_class(Core_Page::instance()->object) == 'My_Shop_Controller_Show')
{//Проверяем, что это объект контроллера магазина (будьте внимательны, у меня он называется My_Shop_Controller_Show, у вас может называться иначе.)
$iItem = intval(Core_Page::instance()->object->item);//Получаем id товара
$query = 'SELECT `shop_item_id` FROM `shop_item_associated` WHERE `shop_item_associated_id` = ' .
to_int($iItem); //Собираем ид товаров, с которыми ассоциирован данный товар
$DataBase = &singleton('DataBase');
$tying_hosts = $DataBase->select($query);
$countRow=$DataBase->get_count_row();
if ($countRow > 0 && $tying_hosts)
{
$xml_host = '';
$host_param['xml_show_tying_products'] = false;
$host_param['xml_show_modification'] = false;
$host_param['xml_show_comments'] = false;
$oTyingItems=Core::factory('Core_Xml_Entity')->name('tying_hosts'); //Создаём переменную в которой лежит узел xml tying_hosts
while ($host_item = mysql_fetch_assoc($tying_hosts))
{//Для каждого из связанных товаров делаем следуюее:
$oShopItem = Core_Entity::factory('Shop_Item', $host_item['shop_item_id']); //Генерируем xml товара
$oTyingItems->addEntity($oShopItem); //Добавляем его к ранее созданному узлу
}
$Shop_Controller_Show->addEntity($oTyingItems); //Добавлем узел к контроллеру
}
}
Теперь в xml появится узел /shop/tying_hosts/ где и будут размещены shop_item'ы Обработать их в xsl можно так:
Конечно, вам нужно будет создать template для отображения /shop/tying_hosts/shop_item
В моём случае xsl вывода товара очень громоздкий и во избежания дублирования массивного кода я сделал так:
<!-- Шаблон для вывода сопутствующих товаров -->
<xsl:template match="associated/shop_item">
<xsl:call-template name="showItem"></xsl:call-template>
</xsl:template>
<!-- Шаблон для вывода товаров, по отношению к которым этот товар является сопутствующим-->
<xsl:template match="/shop/tying_hosts/shop_item">
<xsl:call-template name="showItem"></xsl:call-template>
</xsl:template>
<xsl:template name="showItem">
<div class="itemContaner">
...
</div>
</xsl:template>
Re: Адаптация обратного вывода сопутствующих товаров под HostCms v. 6
TemaLesnik,
Боженьки, не нужно так писать в ТДС.
1. Проверка:
if (is_object(Core_Page::instance()->object) && get_class(Core_Page::instance()->object) == 'My_Shop_Controller_Show')
лишняя, вы и так в ТДС. Она будет уместна при вызове из макета, например.
2. Прямые запросы к БД - дурной тон. В системе есть queryBuilder().
Проситите конечно, но у вас получилась смесь бульдога с носорогом. Тут и код от 5-й версии, и от 6-й. Если ваш код скопирует человек у которого отключен режим эмуляции он будет давать ошибки.
Вот так будет лучше:
//Создаём переменную в которой лежит узел xml tying_hosts
$oTyingItemsXmlEntity = Core::factory('Core_Xml_Entity')->name('tying_hosts');