Изменение цены в minishop2 при добавлении в корзину

#MODx, #MODx Revo, #ms2, #minishop, #custom
Изменение цены в minishop2 при добавлении в корзину

Часто при разработке интернет-магазина возникает ситуация, когда некоторые товары надо положить в корзину с отличной от первоначальной цене. Давайте рассмотрим, как это сделать, используя для организации магазина на 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']));

Для сохранения изменений надо:

  1. переписать значение в поле $currentProduct['price']
  2. передать 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

Автор статьи: Екатерина Шушкевич.

Руководитель проектов, технический директор, практикующий разработчик, преподаватель. Опыт в WEB-разработке — более 15 лет.

Поделиться в соцсетях:

Статьи по теме

MODX Revo - Access Denied

Как в MODX Revo побороть ошибку "Доступ запрещен" для политики доступа. Ошибка возникает при сохранении ресурса - 200 OK, Access denied

Читать далее ...