Отложенные товары - в отдельный заказ.

#
Отложенные товары - в отдельный заказ.
Есть в интернет-магазине отличная штука - отложенный товар. Ее, видимо, можно использовать по-разному, а лично я в своем проекте использовал ее для того чтобы пользователь мог изъявить свое желание купить товар которого сейчас нет в наличии, но его можно привезти под заказ.
Однако, есть желание руководства, чтобы откладываемые товары оформлялись в отдельный заказ. Потому что когда отложенные и покупаемые товары лежат в одном заказе, становится неудобно контролировать процесс оплаты и отправки покупок и заказов.

Стало быть метод ProcessOrder тут уже не катит.
Вопрос - а как тогда? Брать содержимое корзины, разделять по наличию флага postpone, создавать два заказа и вставлять в них соответствующие товары и однаковую инфу о пользователе? Есть тут какие-нибудь подводные камни?
Заказов не беру. Консультирую редко.
#
Re: Отложенные товары - в отдельный заказ.
В ходе экспериментов, выяснилось что я где-то не понял логику системы - отложенные товары вообще не попадают в оформляемый заказ.
В связи с чем сформулирую свой вопросу немного иначе: как сделать, чтобы отложенные товары таки можно было оформить в виде заказа, при чем отдельно от тех, которые не имеют флага postpone?
Заказов не беру. Консультирую редко.
Модератор
#
Re: Отложенные товары - в отдельный заказ.
Kotoff001,
при заказе "отложенные" товары не попадают в заказ. В случае, если Вам нужно их заказать - по некоторому действию Вам нужно "пройтись" по корзине и отложенные товары сделать обычными, после чего оформить заказ.
#
Re: Отложенные товары - в отдельный заказ.
Хорошо.
Вот, к примеру, у меня в корзине два товара, один из которых отмечен как отложенный.
Я начинаю оформлять заказ, ввожу все данные, выбираю адрес, доставку и плат.систему, вызываю
$shop->ExecSystemsOfPayHandler(to_int($system_of_pay_id))

и у меня создается новый заказ. В корзине остается только один, отложенный товар. Затем я вызываю
$shop->GetItemsFromCart($site_users_id, $shop_id);

Из полученного массива беру значения shop_items_catalog_item_id и shop_cart_item_quantity, заполняю массив параметров и вызываю
InsertToCart($unpostpone_param);

и снова вызываю
$shop->ExecSystemsOfPayHandler(to_int($system_of_pay_id))

И получаю второй заказ... точно такой же как первый! То есть во второй заказ сохраняются не те товары, у которых я только что снял флаг postpone, а те, у которых его изначально не было, несмотря даже не то, что этих товаров уже нет в корзине!
Почему?
Интересно, что если обновить страницу, то в корзине отображается тот товар, у которого я вручную снимал флаг postpone, при чем отображается НЕотложенным (что правильно) и его можно спокойно внести в заказ обычным порядком.
Есть ощущение, что содержимое корзины, попадающее в заказ при вызове ProcessOrder() где-то кешируется, и потом мешает :-/
Заказов не беру. Консультирую редко.
#
Re: Отложенные товары - в отдельный заказ.
Kotoff001 писал(а):
Из полученного массива беру значения shop_items_catalog_item_id и shop_cart_item_quantity, заполняю массив параметров и вызываю
- вы пробовали распечатать то, что вам метод GetItemsFromCart вернул? Что там в корзине после оформления основного заказа?
#
Re: Отложенные товары - в отдельный заказ.
Значения, возвращаемые методом GetItemsFromCart я разумеется пробовал распечатывать, а иначе какая может быть отладка?

А вот чего я раньше не пробовал делать - так это внимательно читать код, размещенный в настройках типовой динамической страницы!
Проблема решилась после того как в настройках ТДС я нашел блок, читающий корзину из кукисов на первом шаге процедуры оформления. После того как я вставил этот же блок между ручной очисткой флагов postpone и вызовом платежного хендлера для оформления второго заказа, система заработала именно так, как мне и хотелось!

На всякий случай, приведу здесь получившийся у меня фрагмент кода, вдруг кому пригодится, или вы подскажете что-нибудь еще поправить.


/* НеПоказываем страницу доступных платежных систем! */ // Вместо этого оформляем покупку и заказ в отдельные документы!
   elseif (isset($_POST['step_3']))
   {
      /* Обрабатываем полученные данные о типе доставки */
      $_SESSION['cond_of_delivery'] = to_int($_POST['cond_of_delivery']);
      /* Расчитываем цену доставки */
      /* Получаем данные о магазине */
      $shop_row = $shop->GetShop($shop_id);
      $row = $shop->GetCondOfDelivery($_SESSION['cond_of_delivery']);
      /* идентификатор валюты магазина */
      $shop_currency_id = to_int($shop_row['shop_currency_id']);
      $coefficient = $shop->GetCurrencyCoefficientToShopCurrency($row['shop_currency_id'], $shop_currency_id);
      $price_delivery = sprintf("%.2f", $row['shop_cond_of_delivery_price'] * $coefficient);
      $_SESSION['cond_of_delivery_price'] = $price_delivery;
      
      /*** Переходим к оформлению заказов ***/
            
      //оформим основной заказ
     
      $system_of_pay_id = 1; //будем принудительно вызывать обработчик платежной системы №1
     
      if (to_int($system_of_pay_id) != 0)
      {
          if (!$shop->ExecSystemsOfPayHandler(to_int($system_of_pay_id)))
          {
            show_error_message("Не найден обработчик платежной системы с номером ".to_int($_POST['system_of_pay_id']));
          }
      }
      else
      {
          show_error_message('Ошибка! Не указана ни одна платежная система.');
      }      
            
      $a_row = $shop->GetItemsFromCart($site_users_id, $shop_id);
            
      //снимем флаг postpone у товаров оставшихся в корзине, если таковой установлен
      //если вдруг у товара нет флага postpone, то удалим этот товар из корзины
      if (isset($a_row))
      {
         $postpone_param['user_id'] = $site_users_id;
         $postpone_param['shop_id'] = $shop_id;
         $postpone_param['postpone'] = 0;
         $del_param['shop_id'] = $shop_id;
         $del_param['site_user_id'] = $site_users_id;
         foreach ($a_row as $key => $value) //здесь $key это товар, а $value  - массив его свойств.
         {             
            if ($value['shop_cart_flag_postpone'] === 1)
            {
               $postpone_param['item_id'] = $value['shop_items_catalog_item_id'];               
               $postpone_param['count'] = $value['shop_cart_item_quantity'];
               $shop->InsertToCart($postpone_param);
            }
            else
            {
               $del_param['item_id'] = $value['shop_items_catalog_item_id'];   
               $shop->DeleteCart($del_param);
            }      
         }
      }
      /** фрагмент кода, вставленный из настроек ТДС **/
      /* Читаем массив из кукисов */
      if (!empty($_COOKIE['CART']))
      {
         $session_cart = array();
         $postpone_items = array();
         $cart_from_cookies = $shop->GetCookieCart();
         $items = to_array($cart_from_cookies[$shop_id]);
         foreach ($items as $key => $value)
         {
            if ($value['shop_cart_flag_postpone'])
            {
               /* Оставляем товар в корзине кукисов */
               $postpone_items[$key] = $value;
            }
            else
            {
               /* Добавляем в корзину сессии */
               $session_cart[$key] = $value;
            }
         }
         
         /* Добавляем данные в сессию */
         $_SESSION['CART'][$shop_id] = $session_cart;
         /* Если массив с отложенными товарами не пуст - сохраняем его в кукисы */
         if (count($postpone_items) > 0)
         {
            $cart_from_cookies[$shop_id] = $postpone_items;
         }
         else
         {
            /* Удалям целиком кукисы карзины для данного магазина */
            unset($cart_from_cookies[$shop_id]);
         }
         /* Сохраняем данные */
         $shop->SetCookieCart($cart_from_cookies, time() + 31536000, '/');
      }
/** конец фрагмента кода, вставленный из настроек ТДС **/
      

       //оформим второй заказ.
      if (to_int($system_of_pay_id) != 0)
      {
          if (!$shop->ExecSystemsOfPayHandler(to_int($system_of_pay_id)))
          {
            show_error_message("Не найден обработчик платежной системы с номером ".to_int($_POST['system_of_pay_id']));
          }
      }
      else
      {
          show_error_message('Ошибка! Не указана ни одна платежная система.');
      }
   
   }
Заказов не беру. Консультирую редко.
Авторизация