Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Думаем о масштабируемости или как вывести последние заказанные товары?

Казалось бы - простая задача - вывести список товаров.

Для начала надо получить ID товаров для передачи в фильтр компонента.  Собственно, в этом и затык.

1. Можно дернуть через CSaleBasket::GetList последние товары с ненулевым ORDER_ID. Но как узнать дату заказа этих корзин? Дергать сначала заказы? А как узнать сколько заказов дернуть, чтобы набрать всего 10 товаров? В любом случае, два запроса, не айс.

2. Сортировать ненулевые корзины по дате вставки или дате обновления тоже не вариант. Действия с заказом апдейтит поле обновления, а дата вставки может быть очень старой. Не вариант.

3. Писать свой запрос с JOIN одной таблицы к другой? Пошел с этой стороны, но что-то как ни колдовал, на 500т. корзин и 150т. заказов время варьировалось до 0.6 секунд. Недопустимо для одного запроса.

4. Неужели придется при заказе инсертить товары в отдельный инфоблок? Не очень хочется избыточных данных.

5. Можно было и дальше колдовать с п.3, но что-то мне не понравилось. Решил я через доп.свойство инфоблока и обработчик на оформлении заказа. Заводим св-во тип число "LAST_ORDER_ID". И вешаем такой обработчик на завершение оформления в одношаговом компоненте:
   public static function OnSaleComponentOrderOneStepCompleteHandler($ID, $arOrder, $arParams) {
      if ($ID>0 && CModule::IncludeModule('iblock')) {
         $rsCart = CSaleBasket::GetList(array(), array('ORDER_ID' => $ID));
         while ($arCart = $rsCart->Fetch()) {
            if ($arCart['MODULE']=='catalog' && $arCart['PRODUCT_ID']>0) {
               CIBlockElement::SetPropertyValueCode($arCart['PRODUCT_ID'], 'LAST_ORDER_ID', $ID);
            }
         }
      }
   }
Готово!

2013_10_14_20_32.png

Осталось отсортировать сколько надо товаров по этому полю и вывести их. Это и будут "последние заказанные товары".

Причем тут масштабируемость? А код из п.3 летал на нулевой коробке, но на магазине с тысячами заказов и корзин, он встал. Всегда смотрите в будущее и проводите хотя бы минимальные тесты. Имейте сервер с нагрузочной средой под рукой.  

 

 

Источник: http://dev.1c-bitrix.ru/community/webdev/user/11948/blog/8633/

Назад в раздел

Подписаться на новые материалы раздела:














CAPTCHA