Андрей Балкин 18 февраля 2016 0 12
Добрый день! Снова нужна помощь. Подскажите как запретить добавлять в корзину больше одного товара, вернее если в корзине уже есть один товар, то при добавлении нового старый стирается а новый добавляется. Думаю что в процессоре нужно получить товар в текущей корзине ($modx->basket->getActiveOrderID(); ) и удалить, но как получить объект корзины.

Вообще в идеале хотелось бы допилить процессор так чтобы можно было из корзины оплачивать товары по отдельности при необходимости ) но это в перспективе — сейчас не могу решить проблему приведенную выше — Help!!!
12 комментариев
Fi1osof1
Fi1osof 18 февраля 2016г в 22:24 #
$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);
}


А в update-процессор дописать метод:
public function beforeSave(){
    if($this->object->quantity > 1){
        $this->object->quantity = 1;
    }
    return parent::beforeSave();
}


Должно сработать.
А
Андрей Балкин 18 февраля 2016г в 22:33 #
Спасибо Николай. Нет имею ввиду вообще товар как сам по себе, не только количество. В корзине должен быть всегда один товар в целом
А
Андрей Балкин 18 февраля 2016г в 22:34 #
Проблему с количеством решал комментирование строчки в add процессоре

// Плюсуем общее количество данного товара в этом заказе
/*$this->setProperty('quantity', $this->getProperty('quantity') + $object->get('quantity')); */
Fi1osof1
Fi1osof 18 февраля 2016г в 22:43 #
Комментирование этой строчки не решает проблему более одного товара в корзине. Тут надо более комплексно подходить. Самое простое решение вот сюда прописать такое:
if(
    $order_id = $modx->basket->getActiveOrderID()
    and $basket = $modx->getObject('Order', $order_id);
){
    foreach($basket->OrderProducts as $OrderProduct){
        $OrderProduct->quantity = 0;
        $OrderProduct->save();
    }
}


Таким образом у вас будет выполняться сброс всех товаров в корзине, и добавляться только один добавляемый.
А тут строчку не надо комментировать, иначе не обновится сброшенный товар, сделайте как я написал.
А
Андрей Балкин 18 февраля 2016г в 22:54 #
Так вообще не добавляет товар в корзину )
Fi1osof1
Fi1osof 18 февраля 2016г в 23:04 #
Ничего больше не подскажу. Может синтаксическая ошибка, может еще что-то. Выделяйте 1000 рублей — залезу, допилю. А так экстрасенсорные ресурсы закончились.
А
Андрей Балкин 18 февраля 2016г в 23:13 #
Самое что интересное в консоли то работает
А
Андрей Балкин 18 февраля 2016г в 23:42 #
Да вы правы синтаксис во всем виноват
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();
    }
}
Fi1osof1
Fi1osof 18 февраля 2016г в 23:48 #
Да, в консоли есть переменная $modx, а в процессоре такой переменной нет, есть только $this->modx
А
Андрей Балкин 19 февраля 2016г в 14:47 #
Николай, как считаешь а все таки в какую сторону копать, чтобы можно было из корзины оплачивать товары по отдельности при необходимости. Из плохих мыслей есть идея отдельной таблицы в базе данных, по сути облегченной корзины… Все таки не хотелось бы, возможно ли такое на уровне процессора решить?
Fi1osof1
Fi1osof 20 февраля 2016г в 05:48 #
Андрей, для того, чтобы подобные глобальные корректировки делать, надо очень четко понимать структуру биллинга (а она довольно обширная и имеет много зависимостей).
Корзина — это Заказ (объект Order). К Заказу имеются связки Заказ-Товар (OrderProduct). И вот здесь сразу подходим к самому важному: оплате. По сути оплата может быть совершенно не связанная с Заказами, то есть она может быть вообще произвольная (Смотрите модель класса Payment, колонка order_id в ней nullable). К слову, даже если order_id указан, в ShopModxBox предусмотрена частичная оплата по заказу.

Резюмирую: вы вообще можете принимать оплату за свои товары без всякого оформления заказа, просто выводя форму для оплаты и написав собственный обработчик принимаемых платежей, к примеру, задействовав form-процессор. А вот пытаться как-то играться с наличием только одного товара в заказе или типа того — не очень эффективный подход.

В общем, все это можно, но если очень хорошо понимаете ShopModxBox и четко представляете себе как это будете делать.
А
Андрей Балкин 18 февраля 2016г в 23:03 #
Вообще я об этом и спрашивал как бы, именно так и хотел сделать, но почему то не сработало
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.