Изменение цены товара в магазине в зависимости от свойств

#
Re: Изменение цены товара в магазине в зависимости от свойств
УРА!!!!!!!!!!!! получилось
задача решена (блин пол дня искал переменную shop_items_catalog_price)
если кому интересно решение - пишите выложу здесь (показать действие пока не могу, т.к. сайт в разработке)
#
Re: Изменение цены товара в магазине в зависимости от свойств
aromat,
Очень интересно увидеть ваше решение, будьте так добры.
Делись своими знаниями. Это путь к бессмертию.
#
Re: Изменение цены товара в магазине в зависимости от свойств
частично решение подсмотрено на http://shop.arkilesma.ru, частично написано самостоятельно.
поехали:
выбор свойств товара влияющих на цену (в моем случае это размер и покрытие матраса) у меня реализовано выпадающими списками (как это сделать можно прочитать в теме http://www.hostcms.ru/forums/17/3096/page-2/, на второй странице описано как это сделать при помощи радио кнопок, а чуть ниже как реализовать при помощи выпадающего списка).

1. в xsl карточки товара (файл 56.xsl) для каждого выпадающего списка добавляем действие

<select name="property135" id="property135" onchange="return RefreshItemPrice('{/shop/path}', {@id}, '1' + '&amp;property135=' + GetSelectValue('property135') + '&amp;property136=' + GetSelectValue('property136'))">

у меня property135 и property136 - это свойства отвечающие за размер и материал покрытия матраса (т.е. замените их на свои)

2. в этом же 56.xsl в span обрамляющий цену товара добавляем id с названием, для того, что бы к нему можно было обратиться из javascript
<span style="font-size: 18pt; font-weight: bold; color: #333333;" id="tovar_price">


3. в файл hostcms.js, который лежит в /templates/папка_с_тепмлейтом_который_вы_используете (у меня /templates/template1/ - дефолтный дизайн) дописываете пару функций, которые будут обрабатывать onchange наших списков

function callbackfunction_RefreshItemPrice(responseJS)
{
   // Результат принят
   sended_request = false;

   if (typeof responseJS != 'undefined')
   {
      // Данные.
      if (typeof responseJS.cart != 'undefined')
      {
         var little_cart = document.getElementById('tovar_price');

         if (little_cart)
         {
            // Создадим скрытый SPAN для IE, в который поместим текст + скрипт.
            // Если перед <script> не будет текста, нехороший IE не увидит SCRIPT
            var span = document.createElement("span");
            span.style.display = 'none';
            span.innerHTML = "Stupid IE. " + responseJS.cart;

            runScripts(span.getElementsByTagName('SCRIPT'));

            little_cart.innerHTML = responseJS.cart;
         }
         else
         {
            alert('Ошибка!');
         }
      }
   }
}


function RefreshItemPrice(shop_path, item_id, item_count)
{
   cmsrequest = shop_path + 'cart/?ajax_refresh_price_item_id=' + item_id + '&count=' + item_count;

   // Отправляем запрос backend-у
   sendRequest(cmsrequest, 'get', callbackfunction_RefreshItemPrice);
}


4. в код настроек(именно настроек!!!) типовой динамической страницы для корзины (или через админку или файл /hostcmsfiles/lib/lib_7/lib_config_7.php) дописываем код

/* AJAX изменение цены товара в зависимости от характеристик */
if (isset ($_GET['ajax_refresh_price_item_id']))
{
   $property_array = array ();
   $key_property_array = array ();
   if (isset ($_GET) && count($_GET))
   {
      foreach ($_GET as $key => $val)
      {
         if (preg_match("'^property([\d]*?)$'si", $key, $preg))
         {
            $property_array[$preg[1]] = $val;
         }
      }
   }
   $param = array ();
   $param['shop_id'] = $shop_id;
   $param['item_id'] = to_int($_GET['ajax_refresh_price_item_id']);
   $param['user_id'] = $site_users_id;
   // Все модификации товара
   $all_modifications = $shop->GetAllModificationItems($param['item_id'], array('shop_items_catalog_is_active' => 1));
   if ($all_modifications)
   {
        foreach ($all_modifications as $key => $value)
        {
          $item_propertys_value = array ();
          // Получаем значения всех доп.свойств
          foreach ($property_array as $id => $v)
          {
            $list_property_value = $shop->GetValueItemProperty(to_int($value['shop_items_catalog_item_id']), $id);
            // Получаем значение элемента списка
     

            $item_propertys_value[$id] = to_int($list_property_value['shop_properties_items_value']);

          }
          // Если у модификации совпали все переданные свойства, возвращаем идентификатор модификации
          $array_diff = array_diff_assoc($property_array, $item_propertys_value);
          if (!count($array_diff))
          {
            $param['item_price'] = $value['shop_items_catalog_price'];
            break;
          }
        }
   }
   // Число товаров передаем, если посетитель кладет в корзину больше одного товара
   if (to_int($_GET['count']) > 0)
   {
   $param['count'] = to_int($_GET['count']);
   }
   // Отображаем корзину
   $JsHttpRequest = new JsHttpRequest(SITE_CODING);
   ob_start();
   $little_cart_html = $param['item_price'];
   $GLOBALS['_RESULT'] = array (
   'cart' => $little_cart_html
   );

   echo $JsHttpRequest->LOADER;
   exit ();
}


вот, вроде, и все)
по моему ничего не пропустил) если будет ругаться - пишите, буду искать пропущенные куски кода)
#
Re: Изменение цены товара в магазине в зависимости от свойств
aromat,

Спасибо, работает. Вот только все эти радости перестают работать, как только добавляешь больше двух модификаций. Даже если без изменения цены, а просто передать их в корзину. Не сталкивались?
Делись своими знаниями. Это путь к бессмертию.
#
Re: Изменение цены товара в магазине в зависимости от свойств
должны работать!
просто надо передавать больше параметров. посмотрите пример http://shop.arkilesma.ru/shop/arki_laminate/item_186/
#
Re: Изменение цены товара в магазине в зависимости от свойств
<xsl:when test="modifications/item/property[@xml_name='sila']/node() or modifications/item/property[@xml_name='radius']/node() or modifications/item/property[@xml_name='opt']/node() or modifications/item/property[@xml_name='os']/node() or modifications/item/property[@xml_name='color']/node()">
                     
                     <!-- Ссылку на добавление в корзины выводим, если:
                     type = 0 - простой тип товара
                     type = 1 - электронный товар, при этом остаток на складе больше 0 или -1,
                     что означает неограниченное количество -->
                     <xsl:if test="type = 0 or (type = 1 and (eitem_count > 0 or eitem_count = -1))">
                        <p>
                           <input type="text" size="3" value="1" id="count_{@id}"/>
                           <a href="{/shop/path}cart/?action=add&amp;item_id={@id}" onclick="return AddIntoCart('{/shop/path}', {@id}, document.getElementById('count_{@id}').value + '&amp;property139=' + GetSelectValue('property139') + '&amp;property133=' + GetSelectValue('property133') + '&amp;property140=' + GetSelectValue('property140') + '&amp;property141=' + GetSelectValue('property141') + '&amp;property142=' + GetSelectValue('property142'))" style="text-decoration: none;"><img alt="В корзину" title="В корзину" src="/hostcmsfiles/images/cart.gif" style="margin: 0px 0px -4px 10px" />
                           </a>
                        </p>
                     </xsl:if>

Я вот так добавляю модификации в корзину, но так они не передаются, а когда передаю только первые две то они работают и передаются. Не могу понять в чем проблема.
Делись своими знаниями. Это путь к бессмертию.
#
Re: Изменение цены товара в магазине в зависимости от свойств
R_www писал(а):
R_www

посмотрите вот здесь http://www.hostcms.ru/forums/17/3096/page-2/ девятое сообщение сверху, оно состоит из двух частей, т.е. изменения надо делать в нескольких файлах
#
Re: Изменение цены товара в магазине в зависимости от свойств
Я все сделал как там. Просто когда две модификации, все работает, но если добавить ещё хотя бы одну, то товар кладется в корзину без модификации.
Делись своими знаниями. Это путь к бессмертию.
#
Re: Изменение цены товара в магазине в зависимости от свойств
и настройки корзины изменили?
и в добавлении в корзину три параметра, вместо двух прописали?
#
Re: Изменение цены товара в магазине в зависимости от свойств
Я выше привел код добавления в корзину. Там прописаны пять параметров, которые мне нужны,но они не передаются, если оставить только два, то передаются.
Делись своими знаниями. Это путь к бессмертию.
Авторизация