Положить в корзину сразу несколько товаров

#
Положить в корзину сразу несколько товаров
Надо реализовать механизм заказа товара таким образом, чтобы пользователь не просто заказывал товар, а выбирал его комплектацию, которая по сути состоит сразу из нескольких разных товаров.

Имеем базовый товар - швейную машину. Вместе с ней в комплекте приобретаются стол и мотор. Пользователь на странице товара выбирает, надо ли комплектовать машину столом и мотором, и какими именно.

Например,


    Мотор:
  • Вариант 1
  • Вариант 2



    Стол:
  • Вариант 1
  • Вариант 2


На самом деле компонентов может быть больше, чем 2.

Отмечая чекбоксами и радиобаттонами нужное, пользователь выбирает подходящую ему комплектацию. При этом в корзину отправляется не один товар, а соответственно три: сама машина, стол и мотор (если отмечено, что их надо заказать).

Вопрос №1: Как реализовать комплектацию? Примерно понятно, что это сопутствующие товары. Но надо как-то реализовать их группировку по категориям.

Вопрос №2: Как положить сразу несколько товаров в корзину?

Коллеги, если кто-то похожее уже делал, подскажите, пожалуйста: в какую сторону копать?
#
Re: Положить в корзину сразу несколько товаров
Вопрос №2 в итоге реализовал так.

1) Список комплектующих, которые надо добавить в корзину вместе с основным товаром, передаются в виде строкового массива через запятую:

(function(jQuery){
   // Функции без создания коллекции
   jQuery.extend({
      addIntoCart: function(path, shop_item_id, count){
         
         var items = CheckB('group1');
         
         $.clientRequest({path: path + '?add=' + shop_item_id + '&compl=' + items + '&count=' + count, 'callBack': $.addIntoCartCallback, context: $('#little_cart')});
         return false;
      },
      addIntoCartCallback: function(data, status, jqXHR)
      {
         $.loadingScreen('hide');
         jQuery(this).html(data);
      },
      addCompare: function(path, shop_item_id, object){
         $(object).toggleClass('current');
         $.clientRequest({path: path + '?compare=' + shop_item_id, 'callBack': function(){
               $.loadingScreen('hide');
            }, context: $('#little_cart')});
         $('#compareButton').show();
         return false;
      }
   });
})(jQuery);

function CheckB(CheckBox){
var value = [];

   
CheckBox = document.getElementsByName(CheckBox);
for (var i = 0; i < CheckBox.length; i++){
if (CheckBox[i].checked){
value.push(CheckBox[i].value);

}
}
return value;
}



2) В ТДС "корзина" функция добавления товара в корзину модифицируется следующим образом:

if (Core_Array::getRequest('add'))
{
   $shop_item_id = intval(Core_Array::getRequest('add'));
   $compl_array = Core_Array::getRequest('compl');

   if ($shop_item_id)
   {
      $oShop_Cart_Controller = Shop_Cart_Controller::instance();
      $oShop_Cart_Controller
         ->shop_item_id($shop_item_id)
         ->quantity(Core_Array::getRequest('count', 1))
         ->add();
         
      if ($compl_array)
      {
         
         $compl_array=explode(',',$compl_array);
          foreach($compl_array as $item)
          {
            $oShop_Cart_Controller
            ->shop_item_id($item)
            ->quantity(Core_Array::getRequest('count', 1))
            ->add();
          }
      }

   }


Остается вопрос, который пока никак не получается решить: как реализовать вывод связанных товаров с группировкой по категориям?
#
Re: Положить в корзину сразу несколько товаров
Получилось.

Если вкратце, то так:

<xsl:key name="dep" match="associated/shop_item" use="shop_group_id"/>

<xsl:template match="shop_item">
<!-- ... -->
<xsl:apply-templates select="associated/shop_item" />
</xsl:template>

<xsl:template match="associated/shop_item">
      <xsl:if test="not(shop_group_id=preceding-sibling::shop_item/shop_group_id)">
         
         <ul>
            <!--  отбор по ключу
            -->
            <li><input type="radio" name="group{shop_group_id}" value="0"/>Не включать в комплектацию</li>
            <xsl:apply-templates mode="second" select="key('dep',shop_group_id)">            </xsl:apply-templates>
         </ul>
      </xsl:if>
      
      
   </xsl:template>
   
   <xsl:template match="shop_item" mode="second">
      <li>
         <!-- Название сопутствующего товара -->
         <input type="radio" name="group{shop_group_id}" value="{@id}"/><a href="{url}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>,
         <!-- Цена сопутствующего товара -->
         <xsl:value-of select="price"/><xsl:text> </xsl:text><xsl:value-of disable-output-escaping="yes" select="currency"/>
      </li>
   </xsl:template>
   

Авторизация