Добрый день! Снова нужна помощь. Подскажите как запретить добавлять в корзину больше одного товара, вернее если в корзине уже есть один товар, то при добавлении нового старый стирается а новый добавляется. Думаю что в процессоре нужно получить товар в текущей корзине ($modx->basket->getActiveOrderID(); ) и удалить, но как получить объект корзины.
Вообще в идеале хотелось бы допилить процессор так чтобы можно было из корзины оплачивать товары по отдельности при необходимости ) но это в перспективе — сейчас не могу решить проблему приведенную выше — Help!!!
$modx->basket->getActiveOrderID() возвращает именно ID корзины, но не саму корзину. То есть чтобы получить объект корзины, надо сделать так:
if($order_id = $modx->basket->getActiveOrderID()){ $basket = $modx->getObject('Order', $order_id); }
Но это так, к слову.
Если говорить о вашем вопросе, и если я правильно понимаю, что главное — это чтобы товаров было только по 1 штуке максимум, то сделать надо так:
1. В add-процессоре после $this->setDefaultProperties() дописать:
if($this->getproperty('quantity') > 1){ $this->setProperty('quantity', 1); }
public function beforeSave(){ if($this->object->quantity > 1){ $this->object->quantity = 1; } return parent::beforeSave(); }
Должно сработать.
Спасибо Николай. Нет имею ввиду вообще товар как сам по себе, не только количество. В корзине должен быть всегда один товар в целом
Проблему с количеством решал комментирование строчки в add процессоре
// Плюсуем общее количество данного товара в этом заказе
/*$this->setProperty('quantity', $this->getProperty('quantity') + $object->get('quantity')); */
Комментирование этой строчки не решает проблему более одного товара в корзине. Тут надо более комплексно подходить. Самое простое решение вот сюда прописать такое:
if( $order_id = $modx->basket->getActiveOrderID() and $basket = $modx->getObject('Order', $order_id); ){ foreach($basket->OrderProducts as $OrderProduct){ $OrderProduct->quantity = 0; $OrderProduct->save(); } }
Таким образом у вас будет выполняться сброс всех товаров в корзине, и добавляться только один добавляемый.
А тут строчку не надо комментировать, иначе не обновится сброшенный товар, сделайте как я написал.
Так вообще не добавляет товар в корзину )
Вообще я об этом и спрашивал как бы, именно так и хотел сделать, но почему то не сработало
Ничего больше не подскажу. Может синтаксическая ошибка, может еще что-то. Выделяйте 1000 рублей — залезу, допилю. А так экстрасенсорные ресурсы закончились.
Самое что интересное в консоли то работает
Да вы правы синтаксис во всем виноват
if( $order_id = $this->modx->basket->getActiveOrderID() and $basket = $this->modx->getObject('Order', $order_id) ){ foreach($basket->OrderProducts as $OrderProduct){ $OrderProduct->quantity = 0; $OrderProduct->save(); } }
Да, в консоли есть переменная $modx, а в процессоре такой переменной нет, есть только $this->modx
Николай, как считаешь а все таки в какую сторону копать, чтобы можно было из корзины оплачивать товары по отдельности при необходимости. Из плохих мыслей есть идея отдельной таблицы в базе данных, по сути облегченной корзины… Все таки не хотелось бы, возможно ли такое на уровне процессора решить?
Андрей, для того, чтобы подобные глобальные корректировки делать, надо очень четко понимать структуру биллинга (а она довольно обширная и имеет много зависимостей).
Корзина — это Заказ (объект Order). К Заказу имеются связки Заказ-Товар (OrderProduct). И вот здесь сразу подходим к самому важному: оплате. По сути оплата может быть совершенно не связанная с Заказами, то есть она может быть вообще произвольная (Смотрите модель класса Payment, колонка order_id в ней nullable). К слову, даже если order_id указан, в ShopModxBox предусмотрена частичная оплата по заказу.
Резюмирую: вы вообще можете принимать оплату за свои товары без всякого оформления заказа, просто выводя форму для оплаты и написав собственный обработчик принимаемых платежей, к примеру, задействовав form-процессор. А вот пытаться как-то играться с наличием только одного товара в заказе или типа того — не очень эффективный подход.
В общем, все это можно, но если очень хорошо понимаете ShopModxBox и четко представляете себе как это будете делать.