Нотификация при смене статуса заказа

День добрый!
Правильно ли я понимаю.
В моем модуле идет массовая смена статусов заказов через
fn_change_order_status
чтобы ускорить процесс, хочу отключить отправку email уведомлений (все равно в данном случае они идут на фейковые адреса)
Подсмотрел в fn.cart.php, из этой функции вызывается fn_order_notification, в которой

if (Registry::get('settings.Appearance.email_templates') == 'new') {
        $notify_user = $notify_department = $notify_vendor = true;
    }

    if (!is_array($force_notification)) {
        $force_notification = fn_get_notification_rules($force_notification, !$force_notification);
    }
    if (isset($force_notification['C'])) {
        $notify_user = $force_notification['C'];
    }
    if (isset($force_notification['A'])) {
        $notify_department = $force_notification['A'];
    }
    if (isset($force_notification['V'])) {
        $notify_vendor = $force_notification['V'];
    }

    if ($notify_user || $notify_department || $notify_vendor) {
        /** @var \Tygh\Mailer\Mailer $mailer */
        $mailer = Tygh::$app['mailer'];

отсюда делаю вывод, что мне надо написать вызов функции

fn_change_order_status($order_id, $status, "", array(['A']=>false,['C']=>false,['V']=>false));

что почему-то не сработадл - уведомления всё равно отправляются, и время выполнения увеличивается в 10 раз.
Возможно, что-то я сделал не так?

А если так?

fn_change_order_status($order_id, $status, "", array());

Насколько я понимаю, это значение по умолчанию для функции, при котором берется настройка для самого статуса из Администрирование - Статусы заказов.
Завтра попробую в модуле прицепиться к хуку
fn_set_hook(‘send_order_notification’, $order_info, $edp_data, $force_notification, $notified, $send_order_notification);
в котором просто поменяю по ссылке значение для $send_order_notification на false

Да, последний вариант дает правильный эффект, в хуке проверяю заказ на соответствие user_id из order_info и присваиваю false
спасибо за наводку )

1 лайк

Добрый день.

Попробовал сделать так, уведомления отправляются.
Версия карта 4.12.2, не подскажете, в ней можно еще поковырять?

А что именно вы делаете? Что должно/не должно происходить и при каких условиях?

В func.php модуля my_changes следующий код:

use Tygh\Registry;
use Tygh\Navigation\LastView;
use Tygh\Http;
use Tygh\Enum\UserTypes;

if (!defined('BOOTSTRAP')) { die('Access denied'); }

    function fn_my_changes_send_order_notification($order_info, $edp_data, $force_notification, $notified, $send_order_notification) {
    	
        if ( $order_info['email'] == 'test@test.ru' ) {
    	
    		$send_order_notification = false;
    		$force_notification = false;		
        } 
    }

В init.php соответственно указал хук.

Нотификации клиенту и администратору о новом заказе или покупке в один клик не должны отправляться, если в заказе тестовая/фейковая почта.

В вашей функции в заголовке, чтобы новые значения возвращались из Хука, значения надо передавать по ссылке (обратите внимание на знак & ):
function fn_my_changes_send_order_notification($order_info, $edp_data, &$force_notification, $notified, &$send_order_notification)

1 лайк

Спасибо за рекомендацию.

Исправил, распечатал в fn.cart.php fn_print_r ($send_order_notification); после строки fn_set_hook(‘send_order_notification’, $order_info, $edp_data, $force_notification, $notified, $send_order_notification);

Значение false, однако письмо все-равно уходит.

Есть подозрение, что данная функция в новых версиях карта не используется.

@deprecated since 4.11.1. Use the Tygh::$app[‘event.dispatcher’] service to send messages.

  • @see \Tygh\Notifications\EventDispatcher

Если лезть в EventDispatcher, там что-то непонятное.