Работа с полями адреса в классе msOrderHandler

Добрый день! Столкнулся со следующей проблемой: нужно написать плагин, заменяющий при отправке заказа в minishop2 поле 'comment', но перезаписать поле не получается.

Создан плагин по событию msOnBeforeCreateOrder и написан такой код:
<?php
$tmp = $order->get();

if (!empty($tmp['comment'])) {
    $tmp['comment'] = 'новый текст комментария';
    $order->set($tmp);
}
Метод get() отрабатывает и получает массив с данными заказа, а вот метод set() ничего не делает и дальше в базу пишется первоначальный комментарий.
Пробовал методы remove() и add() чтобы переписать значение, но тоже никакого результата.
Пробовал указанный выше код добавить прямо в функцию submit() в msOrderHandler с тем же результатом: get() работает, остальные методы — нет.
Есть какие-нибудь еще идеи?
Виктор
24 марта 2016, 12:42
modx.pro
3 628
0

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

Виктор
25 марта 2016, 10:39
0
Уточню. Зря грешил на методы, все они работают и все что нужно в объекте меняют, но в базу все равно пишется первоначальный текст. Видимо, надо что-то править в классе все-таки.
    Павел Гвоздь
    25 марта 2016, 10:59
    +1
    github.com/bezumkin/miniShop2/blob/130ce15abe6f6a32b42001e8f3c9c220ee81f338/core/components/minishop2/model/minishop2/msorderhandler.class.php#L371

    Я бы сделал так:
    $msOrder->set('comment', 'новый текст комментария');
    В плагине на событие msOnBeforeCreateOrder, естественно…
      Виктор
      25 марта 2016, 11:14
      0
      <?php
      $tmp = $order->get();
      
      if (!empty($tmp['comment'])) {
      	$msOrder->set('comment', 'новый текст комментария');
      }
      Спасибо за попытку, но в базе все равно старый текст ((
        Павел Гвоздь
        25 марта 2016, 11:18
        0
        Зачем вот это?
        $tmp = $order->get();
        if (!empty($tmp['comment'])) {
        Тогда уж так, раз с объектом msOrder работаем:
        if ($msOrder->comment) {
          Виктор
          25 марта 2016, 11:25
          0
          Да хрен с ним, с условием. Вот такой код плагина
          <?php
              $msOrder->set('comment', 'новый текст комментария');
          Тоже не работает.

          А в чем принципиальная разница использовать $order или $msOrder?
          И вообще вот думаю может надо событие какое-нибудь другое выбрать?
    ck
    ck
    26 марта 2016, 19:39
    +1
    Всё ведь правильно, только не забывайте про метод save().

    set() — устанавливает значение одного из полей объекта.
    save() — сохраняет все изменения в объекте.

    Подробно здесь.
      Виктор
      28 марта 2016, 11:09
      0
      Только сейчас смог проверить предложенные решения.
      Предложенный Гвоздем способ работал с самого начала, но не так как мне нужно.
      Дело в том, что меняется комментарий на вкладке «Заказ», а мне нужно изменить комментарий на вкладке «Адрес», поэтому я и не заметил результат. То есть мне нужно изменять то, что подставляется в плейсхолдер [[+address.comment]]

      Но наконец-то меняется хоть что-то! Пойду копать в этом направлении.
        Виктор
        28 марта 2016, 12:13
        2
        0
        Вот так заработало:

        $address = $msOrder->getOne('Address');
        $address->set('comment', 'новый текст комментария');
        Всем спасибо за помощь!

        P.S. Немного подправил название тикета.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          10