Часто при разработке интернет-магазина возникает ситуация, когда некоторые товары надо положить в корзину с отличной от первоначальной цене. Давайте рассмотрим, как это сделать, используя для организации магазина на MODX Revo модуль minishop2 (ms2). Добавление товаров в корзину при использовании этого приложения происходит аяксом при указании у формы класса ms2_form. Внутри которой указываются параметры id товара и его количество (count). Изменить цену за счет поля формы, к примеру, input name="price" не удастся.
Настройка ms2 для использования произвольной цены при добавлении в корзину.
Есть два пути для изменнеия цены: создание плагина и сниппета. Опишем оба из них.
Метод 1: Использование плагина
Создаем плагин и вешаем его на событие msOnAddToCart (На вкладке "Системные события" чекаем нужное событие). В обработку мы получим два параметра:
- $cart - корзина с товарами,
- $key - ключ нашего текущего товара в этой корзине.
Берем в переменную все товары из таблицы и достаем нужный нам товар:
$products = $cart->get();
$currentProduct = $products[$key];
В $currentProduct будет находиться ассоциативный массив. Узнать, что там лежит, можно выведя его содержимое в Журнал Ошибок MODX:
$modx->log(1, 'current product: '.print_r($currentProduct,1));
Взять всю инфомрацию о товаре можно, прочитав его из базы:
$productData = $modx->getObject('msProduct', $currentProduct['id']));
Для сохранения изменений надо:
- переписать значение в поле $currentProduct['price']
- передать ms2 корзину, с которой мы работали в
нашей локальной переменной, а именно:
$cart->set($products);
Метод 2: Ипользование сниппета
Для переопределения цены товара при добавлении в корзину модуль ms2 использует специальный сниппет. Указать имя
которого нужно в системных параметрах приложения. А именно создать параметр по имени
ms2_price_snippet. Сниппет должен возвращать цену товара.
В нём доступны все параметры,
которые были переданы в форме. Допустим, мы указали, что новая цена будет в параметре "price", создав в форме
поле <input type="hidden" name="price" value="123"/>
.
Тогда код сниппета, который обрабатывает добавление новой цены, будет следующим:
if (isset($_REQUEST['price']) && !empty($_REQUEST['price']) ){
return intval($_REQUEST['price']);
}
return $product->get('price');
Важно
Сниппет модификатора цены применяется не только перед добавлением в корзину. Он также применяется при отображении товаров через сниппет msProduct. Так что надо быть осторожнее с использованием одноименных параметров. А лучше повесить дополнительный флаг в плагине перед добавлением в корзину.
Количество просмотров: 7 305