Минимальная цена для каждый группы

#
Минимальная цена для каждый группы
Здравствуйте!
Задача - вывести в xml минимальную цену каждой категории.

Получаю массив ID групп в $assocgroup, а дальше вывожу в assoc все данные по этой группе, но не понимаю как получить по каждой из этих групп минимальную цену.


$oAssocShopGroupsXmlEntity = Core::factory('Core_Xml_Entity')->name('assoc');
    $Shop_Controller_Show->addEntity($oAssocShopGroupsXmlEntity);
    $oShopGroups = Core_Entity::factory('Shop_Group');
    $oShopGroups->queryBuilder()
        ->select('shop_groups.*')
        ->where('shop_groups.id', 'IN', $assocgroup)
        ->clearOrderBy();
    $aShopGroups = $oShopGroups->findAll();

    foreach ($aShopGroups as $oShopGroup){
        $oAssocShopGroupsXmlEntity->addEntity($oShopGroup->addForbiddenTags(array('text', 'description')));
    }


Я нашёл метод addMinMaxPrice( ) для Shop_Controller_Show, однако он добавляет эти min_price и max_price для корня, а не локально для сущности assoc и его групп.

По факту в XML вот это


<assoc>
      <shop_group id="652">
         <shop_id>3</shop_id>
         <siteuser_id>0</siteuser_id>
         <parent_id>645</parent_id>
         <name>Шлифмашины</name>
         <description></description>
         <image_large>group_652.jpg</image_large>
         <image_small>small_group_652.jpg</image_small>
         <sorting>0</sorting>
         <indexing>1</indexing>
         <subgroups_count>0</subgroups_count>
         <subgroups_total_count>0</subgroups_total_count>
         <items_count>2</items_count>
         <items_total_count>2</items_total_count>
         <active>1</active>
         <siteuser_group_id>-1</siteuser_group_id>
         <path>shlifmashiny</path>
         <seo_title></seo_title>
         <seo_description></seo_description>
         <seo_keywords></seo_keywords>
         <seo_group_title_template></seo_group_title_template>
         <seo_group_keywords_template></seo_group_keywords_template>
         <seo_group_description_template></seo_group_description_template>
         <seo_item_title_template></seo_item_title_template>
         <seo_item_keywords_template></seo_item_keywords_template>
         <seo_item_description_template></seo_item_description_template>
         <user_id>19</user_id>
         <image_large_width>100</image_large_width>
         <image_large_height>100</image_large_height>
         <image_small_width>100</image_small_width>
         <image_small_height>100</image_small_height>
         <guid>720BBD3F-12CF-4B1A-B79F-8AD81D58EDB2</guid>
         <url>/shop/elektroinstrument/shlifmashiny/</url>
         <dir>/upload/shop_3/6/5/2/group_652/</dir>
      </shop_group>
...
...
...
</assoc>



Как получить для каждой группы его минимальную цену и передать это в XML?
Ускорение сайтов / Любые работы по сайту / Обращайтесь в nivaks-studio.ru
Модератор
#
Re: Минимальная цена для каждый группы
nikolajgromkov писал(а):
Как получить для каждой группы его минимальную цену и передать это в XML?

Так посмотрите как считается минимальная цена для группы в addMinMaxPrice() и используйте код у себя. У вас же готовое решение перед глазами.
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Минимальная цена для каждый группы
Окей, хорошо. По вашему намеку я получил минимальные цены групп, но минимальные цены всё равно выводятся в корне xml http://prntscr.com/il8ms5

Сделал цикл и вызвал для каждой группы чуть измененный код addMinMaxPrice.
Задача: в конце цикла поменять addEntity у контроллера магазина именно на сопутствующие группы в assoc узле. Объясните этот момент.


foreach ($assocgroup as $group) {
      
      $iCurrentShopGroup = intval($group);

      $aSubGroupsID = $Shop_Controller_Show->fillShopGroup($oShop->id, $group); // добавляем текущую группу в массив
      $aSubGroupsID[] = $group;

      $aShop_Currencies = Core_Entity::factory('Shop_Currency')->findAll();

      $query_currency_switch = 'price';
      foreach ($aShop_Currencies as $oShop_Currency)
      {
         // Получаем коэффициент пересчета для каждой валюты
         $currency_coefficient = Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency(
            $oShop_Currency, $oShop->Shop_Currency
         );

         $query_currency_switch = "IF (`shop_items`.`shop_currency_id` = '{$oShop_Currency->id}', IF (shop_discounts.value, IF(shop_discounts.type, price * {$currency_coefficient} - shop_discounts.value, price * (100 - shop_discounts.value) * {$currency_coefficient} / 100), shop_items.price * {$currency_coefficient}), {$query_currency_switch})";
      }

      $current_date = date('Y-m-d H:i:s');

      $oSubMinMaxQueryBuilder = Core_QueryBuilder::select(array(Core_QueryBuilder::expression($query_currency_switch), 'absolute_price'))
         ->from('shop_items')
         ->where('shop_items.deleted', '=', 0)
         ->where('shop_items.shop_id', '=', $oShop->id)
         ->where('shop_items.active', '=', 1)
         ->open()
         ->where('shop_items.shop_group_id', 'IN', $aSubGroupsID)
         ->where('shop_items.shortcut_id', '=', 0);

      if ($Shop_Controller_Show->modificationsList)
      {
         $oCore_QueryBuilder_Select_Modifications = Core_QueryBuilder::select('shop_items.id')
            ->from('shop_items')
            ->where('shop_items.deleted', '=', 0)
            ->where('shop_items.active', '=', 1)
            ->where('shop_items.shop_group_id', '=', $iCurrentShopGroup);

         // Стандартные ограничения для товаров
         $Shop_Controller_Show->_applyItemConditionsQueryBuilder($oCore_QueryBuilder_Select_Modifications);

         $oSubMinMaxQueryBuilder
            ->setOr()
            ->where('shop_items.shop_group_id', '=', 0)
            ->where('shop_items.modification_id', 'IN', $oCore_QueryBuilder_Select_Modifications);
      }

      if ($Shop_Controller_Show->filterShortcuts)
      {
         $oCore_QueryBuilder_Select_Shortcuts = Core_QueryBuilder::select('shop_items.shortcut_id')
            ->from('shop_items')
            ->where('shop_items.deleted', '=', 0)
            ->where('shop_items.active', '=', 1)
            ->where('shop_items.shop_group_id', '=', $iCurrentShopGroup)
            ->where('shop_items.shortcut_id', '>', 0);

         // Стандартные ограничения для товаров
         $Shop_Controller_Show->_applyItemConditionsQueryBuilder($oCore_QueryBuilder_Select_Shortcuts);

         $oSubMinMaxQueryBuilder
            ->setOr()
            ->where('shop_items.id', 'IN', $oCore_QueryBuilder_Select_Shortcuts);
      }

      $oSubMinMaxQueryBuilder
         ->close()
         ->leftJoin('shop_item_discounts', 'shop_items.id', '=', 'shop_item_discounts.shop_item_id')
         ->leftJoin('shop_discounts', 'shop_item_discounts.shop_discount_id', '=', 'shop_discounts.id', array(
            array('AND (' => array('shop_discounts.end_datetime', '>=', $current_date)),
            array('OR' => array('shop_discounts.end_datetime', '=', '0000-00-00 00:00:00')),
            array('AND' => array('shop_discounts.start_datetime', '<=', $current_date)),
            array(')' => NULL)
         ))
         ->groupBy('shop_items.id');

      $oMinMaxQueryBuilder = Core_QueryBuilder::select(
         array(Core_QueryBuilder::expression('MIN(t.absolute_price)'), 'min'),
         array(Core_QueryBuilder::expression('MAX(t.absolute_price)'), 'max')
      )
      ->from(array($oSubMinMaxQueryBuilder, 't'));

      $rows = $oMinMaxQueryBuilder->asAssoc()->execute()->current();

      $oShop_Controller = Shop_Controller::instance();

      $Shop_Controller_Show->addEntity(
         Core::factory('Core_Xml_Entity')
            ->name('min_price')
            ->value(
               floor($rows['min'])
            )
      );
   }


Я понимаю что, addEntity можно вызвать для группы например так:


$currentgroup = Core_Entity::factory('Shop_Group', $group);
      
      $currentgroup->addEntity(
         Core::factory('Core_Xml_Entity')
            ->name('min_price')
            ->value(
               floor($rows['min'])
            )
      );


Но это не то. Нужно именно для <assoc>
Ускорение сайтов / Любые работы по сайту / Обращайтесь в nivaks-studio.ru
#
Re: Минимальная цена для каждый группы
В первом сообщении у вас есть
foreach ($aShopGroups as $oShopGroup){
        $oAssocShopGroupsXmlEntity->addEntity($oShopGroup->addForbiddenTags(array('text', 'description')));
    }


Внутри его и добавляйте для каждого $oShopGroup нужный тег .
«Не выходи из комнаты, не совершай ошибку…»
#
Re: Минимальная цена для каждый группы
Добавил, ничего не произошло

$oShopGroup->addEntity(Core::factory('Core_Xml_Entity')->name('min_price')->value(floor($rows['min'])));
$oAssocShopGroupsXmlEntity->addEntity($oShopGroup);


собственно и такой код тоже не добавляет

$oAssocShopGroupsXmlEntity->addEntity($oShopGroup->addEntity(Core::factory('Core_Xml_Entity')->name('min_price')->value(floor($rows['min']))));


в переменной $oShopGroup стоит элемент массива из $oShopGroups


$oShopGroups = Core_Entity::factory('Shop_Group');
    $oShopGroups->queryBuilder()
        ->select('shop_groups.*')
        ->where('shop_groups.id', 'IN', $assocgroup)
        ->clearOrderBy();
    $aShopGroups = $oShopGroups->findAll();


Думал, может нельзя к $oShopGroup напрямую addEntity вызывать, однако ошибок никаких не последовало

но вот в теме https://www.hostcms.ru/forums/2/7899/ в 4 сообщении указано


Core::factory('Core_Xml_Entity')
         ->name('param')
         ->addAttribute('id', $key)
         ->addEntity(
               Core::factory('Core_Xml_Entity')->name('name')->value($value['name'])
          )


нужно просто ->addAttribute добавлять?

и мне кажется вся загвоздка именно в $oShopGroup, что я что-то не получил в переменной.
Ускорение сайтов / Любые работы по сайту / Обращайтесь в nivaks-studio.ru
#
Re: Минимальная цена для каждый группы
Есть прогресс,
Если написать вот так, то цена как минимум выводится под каждой группой http://prntscr.com/ilmvey

$oAssocShopGroupsXmlEntity
         ->addEntity($oShopGroup)
         ->addEntity(Core::factory('Core_Xml_Entity')
            ->name('min_price')
        ->value(floor($rows['min']))
      );


Однако я не понимаю почему так, ведь везде на форуме вижу такую конструкцию: добавляется группа через entity следом за ней идёт entity для элемента. У меня же всё также написано, просто группа изначально берётся из цикла foreach, а не вызывается через Core::factory('Core_Xml_Entity')


$Informationsystem_Controller_Show->addEntity(
      Core::factory('Core_Xml_Entity')
         ->name('informationsystem_group_id')
         ->value(intval(Core_Page::instance()->object->group))
   )->addEntity(
      Core::factory('Core_Xml_Entity')
         ->name('informationsystem_item_id')
         ->value(intval(Core_Page::instance()->object->item))
   );
Ускорение сайтов / Любые работы по сайту / Обращайтесь в nivaks-studio.ru
#
Re: Минимальная цена для каждый группы
Никто не знает?
Ускорение сайтов / Любые работы по сайту / Обращайтесь в nivaks-studio.ru
Модератор
#
Re: Минимальная цена для каждый группы
После группы вы добавляете элемент самому контроллеру. Если вы хотите добавлять данные внутри группы, то вместо

$oAssocShopGroupsXmlEntity
         ->addEntity($oShopGroup)
         ->addEntity(Core::factory('Core_Xml_Entity')
            ->name('min_price')
        ->value(floor($rows['min']))
      );

используете
$oAssocShopGroupsXmlEntity
         ->addEntity($oShopGroup
            ->addEntity(Core::factory('Core_Xml_Entity')
            ->name('min_price')
            ->value(floor($rows['min'])
         )
       )
      );


или в более читаемом виде:
$oShopGroup->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('min_price')
      ->value(floor($rows['min']))
);

$oAssocShopGroupsXmlEntity->addEntity($oShopGroup);
#
Re: Минимальная цена для каждый группы
Вы же просто повторили моё сообщение от 01.03.2018. Посмотрите внимательно. Вот вставил еще этот вариант написания http://prntscr.com/iq4loo. В XML нету min_price http://prntscr.com/iq4mhs. Посмотрите скриншоты. В этом и проблема, что при таком написании данные в XML не попадают, хотя должны.
Ускорение сайтов / Любые работы по сайту / Обращайтесь в nivaks-studio.ru
Модератор
#
Re: Минимальная цена для каждый группы
nikolajgromkov,
полагаю причина более, чем банальная. Данная группа, как объект, выводится в контроллере в общем списке групп, когда она там добавляется, то вызывается метод clearEntities() и все добавленные дочерние элементы удаляются. Чтобы этого избежать, можно сделать следующий финт ушами:
// Получим уже другой объект
$oCloneShopGroup = clone $oShopGroup;
// Установим ему прежний ID и добавим дочерний элемент
$oCloneShopGroup
   ->id($oShopGroup->id)
   ->addEntity(
      Core::factory('Core_Xml_Entity')
        ->name('min_price')
        ->value(floor($rows['min']))
   );

$oAssocShopGroupsXmlEntity->addEntity($oCloneShopGroup);
Авторизация