[Решено] Как программно изменить заказ minishop2?

Возникла необходимость написать свой внешний код, который позволил бы изменить заказ (состав товаров). То есть я знаю id заказа, и надо добавить или удалить товары из него. Если кто с этим сталкивался, подскажите как лучше это сделать, процессорами минишопа или еще как.

UPD. Решил вот как. Для начала покопался в самом минишопе, ибо сам он умеет делать то что мне надо через список заказов в админке, а значит у него есть для этого все необходимые педали.

Внешний код дергает внутренний сниппет. Во внутреннем сниппете для начала сделал авторизацию, дабы потом не было проблем с правами при использовании процессоров минишопа:

$data = array(
        'username' => 'user', // юзер должен обладать правами менеджера магазина, как минимум
        'password' => 'pass', // настройку прав тут не буду описывать, равно как и безопасность
        'rememberme' => true,
        'login_context' => 'mgr' // логинимся в админку
    );
    $response = $modx->runProcessor('/security/login', $data);
    $user = $modx->getObject('modUser', array('username' => $data['username']));
    $modx->user = $user;  // без этого не фурычит!!!
После этого можно спокойно вызывать процессоры минишопа. Под изменением заказа подразумеваю добавление, удаление и изменение количества товаров. Соответственно дергаю процессоры:
  • core/components/minishop2/processors/mgr/orders/product/create.class.php (добавление)
  • core/components/minishop2/processors/mgr/orders/product/remove.class.php (удаление )
  • core/components/minishop2/processors/mgr/orders/product/update.class.php (изменение количества)
Какие они принимают параметры, можно посмотреть прямо в коде процессоров, смотри везде, где встречаются $this->getProperty(...). Приведу пример с изменением количества, остальные по аналогии.

// за кадром осталось получение id товара, его количества и цены за штуку
    $res = $modx->runProcessor(
        'mgr/orders/product/update', 
        array(
            'id' => $product_id, // тут внимательнее, нужен id товара из таблицы prefix_ms2_order_products,
            'count' => $count, // это количество, которое надо установить
            'price' => $price // это цена товара за штуку. сумму процессор посчитает сам
        ),
        array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/') 
    );
    return $res->response;
Вот так. Если кому чего осталось непонятно, пишите, я расшифрую еще подробнее. Надеюсь кому-то поможет данное решение.
gruzoveek
13 июня 2018, 12:04
modx.pro
2
1 928
0

Комментарии: 4

Кирилл Киселев
18 октября 2018, 09:21
0
А как передавать сам заказ? Если передать просто товар, то не факт, что в нужном тебе заказе поменяется.
    Кирилл Киселев
    18 октября 2018, 09:33
    0
    UPD:
    Понял. Нужно просто идентификатор самого товара из таблицы передавать.
      gruzoveek
      18 октября 2018, 22:40
      0
      да, товары, которые находятся в конкретном заказе, лежат в таблице ms2_order_products
    Евгений Лазарев
    01 ноября 2020, 15:32
    0
    Подскажите. А есть ли возможность программно изменить состав заказа но не через processor? При таком решении не работает событие msOnUpdateOrder — оно просто не отлавливается поскольку обновление делается в обход.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4