Работа с полями адреса в классе msOrderHandler
Добрый день! Столкнулся со следующей проблемой: нужно написать плагин, заменяющий при отправке заказа в minishop2 поле 'comment', но перезаписать поле не получается.
Создан плагин по событию msOnBeforeCreateOrder и написан такой код:
Пробовал методы remove() и add() чтобы переписать значение, но тоже никакого результата.
Пробовал указанный выше код добавить прямо в функцию submit() в msOrderHandler с тем же результатом: get() работает, остальные методы — нет.
Есть какие-нибудь еще идеи?
Создан плагин по событию msOnBeforeCreateOrder и написан такой код:
<?php
$tmp = $order->get();
if (!empty($tmp['comment'])) {
$tmp['comment'] = 'новый текст комментария';
$order->set($tmp);
}
Метод get() отрабатывает и получает массив с данными заказа, а вот метод set() ничего не делает и дальше в базу пишется первоначальный комментарий.Пробовал методы remove() и add() чтобы переписать значение, но тоже никакого результата.
Пробовал указанный выше код добавить прямо в функцию submit() в msOrderHandler с тем же результатом: get() работает, остальные методы — нет.
Есть какие-нибудь еще идеи?
Комментарии: 10
Уточню. Зря грешил на методы, все они работают и все что нужно в объекте меняют, но в базу все равно пишется первоначальный текст. Видимо, надо что-то править в классе все-таки.
github.com/bezumkin/miniShop2/blob/130ce15abe6f6a32b42001e8f3c9c220ee81f338/core/components/minishop2/model/minishop2/msorderhandler.class.php#L371
Я бы сделал так:
Я бы сделал так:
$msOrder->set('comment', 'новый текст комментария');
В плагине на событие msOnBeforeCreateOrder, естественно… <?php
$tmp = $order->get();
if (!empty($tmp['comment'])) {
$msOrder->set('comment', 'новый текст комментария');
}
Спасибо за попытку, но в базе все равно старый текст ((
Зачем вот это?
$tmp = $order->get();
if (!empty($tmp['comment'])) {
Тогда уж так, раз с объектом msOrder работаем:if ($msOrder->comment) {
Да хрен с ним, с условием. Вот такой код плагина
А в чем принципиальная разница использовать $order или $msOrder?
И вообще вот думаю может надо событие какое-нибудь другое выбрать?
<?php
$msOrder->set('comment', 'новый текст комментария');
Тоже не работает.А в чем принципиальная разница использовать $order или $msOrder?
И вообще вот думаю может надо событие какое-нибудь другое выбрать?
Как вариант вот — github.com/bezumkin/miniShop2/blob/130ce15abe6f6a32b42001e8f3c9c220ee81f338/core/components/minishop2/model/minishop2/msorderhandler.class.php#L378
Там тоже есть объект msOrder, но после изменения поля comment его надо будет сохранить:
Там тоже есть объект msOrder, но после изменения поля comment его надо будет сохранить:
$msOrder->set('comment', 'новый текст комментария');
$msOrder->save();
Ты бы хоть ответил, помогли тебе или нет…
Всё ведь правильно, только не забывайте про метод save().
set() — устанавливает значение одного из полей объекта.
save() — сохраняет все изменения в объекте.
Подробно здесь.
set() — устанавливает значение одного из полей объекта.
save() — сохраняет все изменения в объекте.
Подробно здесь.
Только сейчас смог проверить предложенные решения.
Предложенный Гвоздем способ работал с самого начала, но не так как мне нужно.
Дело в том, что меняется комментарий на вкладке «Заказ», а мне нужно изменить комментарий на вкладке «Адрес», поэтому я и не заметил результат. То есть мне нужно изменять то, что подставляется в плейсхолдер [[+address.comment]]
Но наконец-то меняется хоть что-то! Пойду копать в этом направлении.
Предложенный Гвоздем способ работал с самого начала, но не так как мне нужно.
Дело в том, что меняется комментарий на вкладке «Заказ», а мне нужно изменить комментарий на вкладке «Адрес», поэтому я и не заметил результат. То есть мне нужно изменять то, что подставляется в плейсхолдер [[+address.comment]]
Но наконец-то меняется хоть что-то! Пойду копать в этом направлении.
Вот так заработало:
P.S. Немного подправил название тикета.
$address = $msOrder->getOne('Address');
$address->set('comment', 'новый текст комментария');
Всем спасибо за помощь!P.S. Немного подправил название тикета.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.