Адаптация обратного вывода сопутствующих товаров под HostCms v. 6

#
Адаптация обратного вывода сопутствующих товаров под HostCms v. 6
Приветствую, уважаемые форумчане.
В разделе полезных решений на базе HostCms v. 5 нашёл замечательное решение, созданное Kotoff'ым, позволяющее отображать товары, для которых текущий товар является сопутствующим.  
Мой сайт работает на HostCms v. 6, поэтому буду адаптировать под него.
Столкнулся со следующей проблемой: Метод GenXml4Item отсутствует в Api 6.
Пробовал использовать getXml(), но получаю xml вида
<shop_country_location_city_area_id>0</shop_country_location_city_area_id>
<address></address>
<user_id>24</user_id>
<guid></guid>
</shop_warehouse>
</shop>


Последующий код расположен в 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
у Вас объект товара сам по себе сущность и сам себе генерирует XML, поэтому контроллеру через ->addEntity() можете добавлять $oShop_Item
#
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 можно так:
<xsl:if test="count(associated/shop_item) &gt; 0">
         <h2>Сопутствующие товары для <xsl:value-of disable-output-escaping="yes" select="name"/></h2>
                 <xsl:apply-templates select="associated/shop_item"/>
      </xsl:if>
      <xsl:if test="count(/shop/tying_hosts/shop_item) &gt; 0">
         <h2>Данный товар является сопутствующим для:</h2>
            <xsl:apply-templates select="/shop/tying_hosts/shop_item"/>
      </xsl:if>



Конечно, вам нужно будет создать 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');

// Добавляем XML-сущность контроллеру показа
$Shop_Controller_Show->addEntity($oTyingItemsXmlEntity);

//Применяем ограничение через queryBuilder()
$oShop_Item_Associated = Core_Entity::factory('Shop_Item_Associated');
$oShop_Item_Associated
   ->queryBuilder()
   ->where('shop_item_associated.shop_item_associated_id', '=', Core_Page::instance()->object->item);

//Получаем массив товаров
$aShop_Item_Associated = $oShop_Item_Associated->findAll(FALSE);
foreach ($aShop_Item_Associated as $oShop_Item_Associate)
{
   $oShop_Item = Core_Entity::factory('Shop_Item', $oShop_Item_Associate->shop_item_id);

   // Добавляем потомком XML-сущности
   $oTyingItemsXmlEntity->addEntity(
      $oShop_Item
         ->clearEntities()
         ->showXmlAssociatedItems(FALSE)
         ->showXmlModifications(FALSE)
         ->showXmlComments(FALSE)
   );
}
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Адаптация обратного вывода сопутствующих товаров под HostCms v. 6
alexander.egorov, большая вам благодарность за время и код Я ещё очень слабо ориентируюсь в api и тдсках. буду учиться)
Модератор
#
Re: Адаптация обратного вывода сопутствующих товаров под HostCms v. 6
TemaLesnik,

Пожалуйста.
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Адаптация обратного вывода сопутствующих товаров под HostCms v. 6
alexander.egorov, спасибо за лаконичную версию кода на api 6 )
Заказов не беру. Консультирую редко.
Авторизация