Использование изображений товаров для списка производителей

#
Использование изображений товаров для списка производителей
Здравствуйте.
Недавно начала изучать HostCMS
Возник следующий вопрос. Есть ли возможность при отображении списка производителей в интернет-магазине отображать не изображение производителя, а изображение товара, у которого в свойствах указан соответствующий производитель?
Идея выглядит, как я думаю, как расширение класса Shop_Producer_Controller_Show, где при формировании списка производителей для отображения для каждого производителя мы делаем запрос к БД, получаем первый продукт с изображением и добавляем в элемент списка новое поле с ссылкой на изображение, но какие именно методы и поля надо перегрузить - не могу понять.
Прошу помочь с решением этой проблемы.
Модератор
#
Re: Использование изображений товаров для списка производителей
Вам нужно использовать хук на генерацию производителя, https://www.hostcms.ru/documentation/modules/core/events/
производитель будет shop_producer.onBeforeGetXml, там вы будете выбирать товар этого производителя и добавлять нужные данные производителю.
#
Re: Re: Использование изображений товаров для списка производителей
Я имел ввиду работу только в фронтэнд части системы динамически, то есть система перед рендером страницы подхватывает изображение первого товара этого производителя с картинкой и заменяет этой картинкой изображение самого производителя.
Примерно как-то так
$oShop = Core_Entity::factory('Shop', Core_Array::get(Core_Page::instance()->libParams, 'shopId'));

$oShop_Producers = $oShop->Shop_Producers;
$oShop_Producers
    ->queryBuilder()
    ->where('shop_producers.active', '=', 1)
    ->clearOrderBy()
    ->orderBy('RAND()');
    
$oShop_Producers = $oShop_Producers->findAll();
foreach ($oShop_Producers as $oShop_Producer) {
    echo '<pre style="display:none">';
    print_r($oShop_Producer->id);
    echo '</pre>';    
    $oShop_Items = $oShop->Shop_Items;
    $oShop_Items
        ->queryBuilder()
        ->where('shop_items.active', '=', 1)
        ->where('shop_items.smallImage', '=', 1)
        ->where('shop_items.producerId', '=', $oShop_Producer->id)
        ->limit(1)
        ->clearOrderBy()
        ->orderBy('id');
    $oShopItemWithImg = $oShop_Items->findAll();
}

// что-то наподобие
// $oShop->Shop_Producers->addField(producerId,fieldname,fieldvalue)

И потом стандартно
$Shop_Producer_Controller_Show = new Shop_Producer_Controller_Show($oShop);
Core_Page::instance()->object = $Shop_Producer_Controller_Show;
Модератор
#
Re: Использование изображений товаров для списка производителей
maxakagaret,
я вам именно про фронтенд и решение задачи отвечал.
#
Re: Использование изображений товаров для списка производителей
Спасибо, за ответ. Разобрался.

Приведу подробное решение для тех, кто задастся тем же вопросом
В директории /modules/shop/producer/ создаем файл observer.php
Содержимое файла:

<?php
class Shop_Producer_Observer
{
    static public function onBeforeGetXml($object, $args, $options)
    {
//Выбираем все продукты
        $oShopItems = Core_Entity::factory('Shop', $object->shop_id)->Shop_Items;
//Строим запрос для выбора только продуктов текущего производителя, активных, имеющих картинки
        $oShopItems
            ->queryBuilder()
            ->select("*")
            ->where("shop_producer_id", "=", $object->id)
            ->where("image_small", "!=", "")
            ->where("active", "=", 1);
// Берем первый попавшийся продукт
        $productsOfProducer = $oShopItems->find();
// Строим объект продукта, чтобы получить путь к картинке  
        $oShopItem = Core_Entity::factory('Shop_Item', $productsOfProducer->id);
// Добавляем тэги в производителя с нужными данными
        $object->addXmlTag('productImageDir', $oShopItem->getItemPath());
        $object->addXmlTag('productImageUrl', $oShopItem->getItemHref());
        $object->addXmlTag('productImage', $productsOfProducer->image_small);
    }
}
?>


Далее открываем файл bootstrap.php в корневой директории и добавляем
Core_Event::attach('shop_producer.onBeforeGetXml', array('Shop_Producer_Observer', 'onBeforeGetXml'));

в любом месте после
Core::init();
date_default_timezone_set(Core::$mainConfig['timezone']);
Модератор
#
Re: Использование изображений товаров для списка производителей
Полагаю так будет корректнее
class Shop_Producer_Observer
{
   static public function onBeforeGetXml($oShop_Producer, $args, $options)
   {
      // Ссылка на все товары магазина
      $oShop_Items = $oShop_Producer->Shop->Shop_Items;
      
      // Ограничения для выбора только продуктов текущего производителя, активных, имеющих картинки
      $oShop_Items
         ->queryBuilder()
         ->where("shop_producer_id", "=", $oShop_Producer->id)
         ->where("image_small", "!=", "")
         ->where("active", "=", 1);
         
      // Берем первый попавшийся продукт
      $oShop_Item = $oShop_Items->getFirst();
      
      if ($oShop_Item)
      {
         // Добавляем тэги в производителя с нужными данными
         $oShop_Producer
            ->addXmlTag('productImageDir', $oShop_Item->getItemPath())
            ->addXmlTag('productImageUrl', $oShop_Item->getItemHref())
            ->addXmlTag('productImage', $productsOfProducer->image_small);
      }
   }
}
#
Re: Re: Использование изображений товаров для списка производителей
Да, спасибо, такая запись значительно лучше моего варианта.
Авторизация