Артур Шевченко

Артур Шевченко

С нами с 24 мая 2019; Место в рейтинге пользователей: #3
Отправить деньги
24 января 2026, 13:12
0
Подскажите плз, старые версии еще могут быть как либо работо-способны?
Нет
23 января 2026, 19:18
+1
На сайтах B и C пишешь плагин на событие OnDocFormSave. В этом плагин отправляешь запрос с помощью CURL с данными ресурса на сайт A. На сайте A обрабатываешь входящий запрос: создаёшь или обновляешь ресурс пришедшими данными.
21 января 2026, 11:28
0
Как будто бы 2 секунды на фильтрацию 1000 товаров без единой твшки это многовато.
15 января 2026, 20:23
+1
Вариант 1
Переопределить метод msOrderHandler::submit() таким образом, чтобы там перед установлением статуса «Новый» проверялся способ оплаты и, если оплата при получении, статус устанавливать методом minishop2::changeOrderStatus(), иначе через modResource::save().

Вариант 2.
Ввести для оплаты при получении отдельный статус. Написать плагин на событие msOnChangeOrderStatus, в котором проверять способ оплаты и, если это оплата при получении, вызывать метод minishop2::changeOrderStatus() и устанавливать созданный для этого способа оплаты статус. При этом отправку писем для статуса «Новый» отключить в настройках минишопа.

Вариант 3.
Отключить стандартную отправку писем. Написать свой класс отправки писем и вызывать его в плагине на событие msOnChangeOrderStatus. Вот пример реализации такого класса
<?php

namespace CustomServices\Manage;

use CustomServices\Helpers\Mailer;

class MailingOrder extends Base
{
    private Mailer $mailer;

    private array $mailingStatuses = [
        2 => [
            'user' => [
                'subject' => 'ms2_email_subject_paid_user',
                'chunk' => 'msEmailPaid.user'
            ],
            'manager' => [],
        ],
        3 => [
            'user' => [
                'subject' => 'ms2_email_subject_sent_user',
                'chunk' => 'msEmail.sent.user'
            ],
            'manager' => [],
        ],
        108 => [
            'user' => [
                'subject' => 'ms2_email_subject_sent_user',
                'chunk' => 'msEmail.sent.user'
            ],
            'manager' => [],
        ],
        117 => [
            'user' => [
                'subject' => 'ms2_email_subject_paid_user',
                'chunk' => 'msEmailPaid.user'
            ],
            'manager' => [],
        ],
        103 => [
            'user' => [
                'subject' => 'ms2_email_subject_paid_user',
                'chunk' => 'msEmailPaid.user'
            ],
            'manager' => [],
        ],
    ];

    private array $statusData;

    public function __construct(\modX $modx, ?array $properties = [])
    {
        parent::__construct($modx, $properties);
        if ($properties['order'] && $properties['order']->get('context') !== $this->modx->context->get('key')) {
            $this->modx->switchContext($properties['order']->get('context'));
            $this->cultureKey = $this->modx->getOption('cultureKey', '', 'en');
        }
        $this->mailer = new Mailer($this->modx);
        $this->statusData = [];
    }

    public function send(): bool
    {
        $statusId = $this->properties['statusId'];
        if (!isset($this->mailingStatuses[$statusId])) {
            return false;
        }
        $this->statusData = $this->mailingStatuses[$statusId];

        if (!$this->properties['order']) {
            $this->logging->write([
                'msg' => "Mail not sent. Order not defined",
            ]);
            return false;
        }

        $pls = $this->getEmailPls();
        if (!empty($this->statusData['manager']) && $mgrMailerProps = $this->getMailerProperties($pls, 'manager')) {
            if(!$this->mailer->send($mgrMailerProps)){
                $this->logging->write([
                    'msg' => "Order {$pls['num']} was not sent to manager email",
                    'data'=> [
                        'mailerProps' => $mgrMailerProps
                    ]
                ]);
            }
        }

        if (!empty($this->statusData['user']) && $usrMailerProps = $this->getMailerProperties($pls)) {
            if(!$this->mailer->send($usrMailerProps)){
                $this->logging->write([
                    'msg' => "Order {$pls['num']} was not sent to customer email",
                    'data'=> [
                        'mailerProps' => $usrMailerProps
                    ]
                ]);
            }
        }
        return true;
    }

    public function getEmailPls(): array
    {
        $pls = $this->properties['order']->toArray();
        $pls['cost'] = $this->miniShop2->formatPrice($pls['cost']);
        $pls['cart_cost'] = $this->miniShop2->formatPrice($pls['cart_cost']);
        $pls['delivery_cost'] = $this->miniShop2->formatPrice($pls['delivery_cost']);
        $pls['weight'] = $this->miniShop2->formatWeight($pls['weight']);
        $pls['payment_link'] = $this->properties['paymentLink'] ?: '';
        return $pls;
    }

    public function getMailerProperties(array $pls, $type = 'user'): array
    {
        $mailerProperties = [];
        $mailerProperties['subject'] = $this->modx->lexicon($this->statusData[$type]['subject'], $pls, $this->cultureKey);
        if($mailerProperties['subject'] === $this->statusData[$type]['subject']){
            $mailerProperties['subject'] = $this->modx->lexicon($this->statusData[$type]['subject'], $pls, 'en');
        }
        $mailerProperties['body'] = $this->parser->runSnippet('msGetOrder', array_merge($pls, ['tpl' => $this->statusData[$type]['chunk']]));
        if ($this->properties['invoicePath'] && $type === 'user') {
            $mailerProperties['attachment'] = $this->properties['invoicePath'];
        }

        if (!$mailerProperties['to'] = $type === 'user' ? $this->getUserEmails($pls['user_id']) : $this->getManagerEmails()) {
            return [];
        }

        return $mailerProperties;
    }

    public function getUserEmails(int $userId): array
    {
        if (!$profile = $this->modx->getObject('modUserProfile', ['internalKey' => $userId])) {
            return [];
        }
        $email = $profile->get('email');
        if (!$email) {
            if (!$user = $this->modx->getObject('modUser', $userId)) {
                return [];
            }
            if (!$email = $user->get('username')) {
                return [];
            }
        }
        return [$email];
    }

    public function getManagerEmails(): array
    {
        return array_map(
            'trim',
            explode(
                ',',
                $this->modx->getOption('ms2_email_manager', null, $this->modx->getOption('emailsender'))
            )
        );
    }
}
30 декабря 2025, 22:11
+1
Спасибо, Николай, что не бросаешь нас и развиваешь сообщество своим примером!
26 декабря 2025, 19:16
0
Нет с плагинами ничего не делал. Проблему я понял. Подумаю что можно сделать
Как вариант передавать данные, которые могут быть изменены в плагине, как публичные свойства класса.
24 декабря 2025, 22:11
0
Есть поле mail_smtp_user введи туда логин, если не сработает введи email. И не забудь в emailsender корректный email прописать.
23 декабря 2025, 17:32
0
при Авторизации или Регистрации
думаю проблема в том, что при авторизации и регистрации меняется идентификатор сессии, рекомендую переключиться на сессии SendIt доступные с версии 2.7.0. В этом случае идентификатор пользователя не будет меняться.
30 ноября 2025, 15:25
+1
С визуальным конструктором полей прям огонь. Горжусь тобой!)))
18 ноября 2025, 18:53
0
Спрошу по-другому, почему просто не использовать файловые элементы, не создавая их в админке?
18 ноября 2025, 18:33
0
Иди переделывай)))
18 ноября 2025, 18:32
0
Если хотите изменить базовый путь сохранения файлов, поправьте системную настройку: pdotools_elements_path
Т.е. pdoTools установлен, зачем же тогда создавать статические чанки, шаблоны и сниппеты?
16 ноября 2025, 16:48
0
Поверь, с гитом разрабатывать удобнее
10 ноября 2025, 17:21
1
+1
Каким сниппетом обрабатывается данный пресет по-твоему?
'filter_resources' => [
        'hooks' => 'filter_resources',
        'resultBlockSelector' => '#filter-results',
        'resultShowMethod'=>'insert',
    ],
10 ноября 2025, 15:29
+1
Логи сервера смотри. Но скорее всего путь к какому-то обработчику указан неверное в ms2_services
10 ноября 2025, 15:28
0
$SendIt = $modx->getService('sendit', 'SendIt', MODX_CORE_PATH.'components/sendit/model/sendit/');
Удали
09 ноября 2025, 19:55
0
Чего ж вы репозитории не делаете?
01 ноября 2025, 10:49
0
Собственно переговоры прошли успешно, в понедельник передаст мне компонент, к концу месяца будет работать.