На рассмотрении

+1

Мультисайтовые данные: добавить в методы выбор сайта/сайтов

Anton F Обновлен 13 дней назад в категории CMS Общий функционал 5

Следует учитывать, что cron.php запускается из командной строки, соответственно во время обработки события нельзя полагаться на автоматическое определение ID текущего сайта. Функция RS::Site::Manager::getSiteId() - будет возвращать id сайта по-умолчанию.
Рассмотрим проблему на примере \Shop\Model\UserStatusApi::getStatusesIdByType().
Метод выбирает данные для текущего сайта ->where(['site_id' => SiteManager::getSiteId()]), возможность задать сайт(ы) не меняя SiteManager::$site отсутствует. Это автоматически делает подобные методы бесполезными при запуске в консольном режиме

Комментарии 5

  • Артем Полторанин 13 дней назад

    Все вопросы по программированию следует писать на форуме.
    В данном случае вы неверно поняли как работать с обработчиком cron и мультисайтами.

    Как сказано в документации, cron запускается всегда в контексте сайта по умолчанию, поэтому вы сами можете выстроить корректную логику выборки или обработки данных.

    Вы можете не указывать фильтр по site_id, если желаете выполнить операцию сразу по всем мультисайтам.
    Или если вы желаете выполнить циклично операцию разрезе каждого мультисайта, то вам нужно использовать:

    foreach(\RS\Site\Manager::getSiteList() as $id => $site) {
    //Тут действие для конкретного $id сайта.
    //Или если нужно зайти глубоко в функции RS, можно выставить текущий сайт \RS\Site\Manager::setCurrentSite($site);
    }

    • Anton F 13 дней назад

      Артем Полторанин, по моему Вы не понимаете что такое оптимизация - конечно можно обходить все сайты, только это увеличит число запросов и нагрузку на сервер в несколько раз

    • Anton F 13 дней назад

      Артем Полторанин, речь о том что штатные методы приходится дублировать из-за отсутствия в них возможности получения результатов для заданных сайтов

      • Артем Полторанин 13 дней назад

        Огромное количество функций RS работают в контексте текущего сайта, т.е. установка контекста \RS\Site\Manager::setCurrentSite($site) - будет работать 100% во всех случаях (даже, если вы глубоко провалитесь в функции RS) и является на текущий момент рекомендуемым нами способом.

        ----

        Насчет отдельно взятого частного случая с \Shop\Model\UserStatusApi::getStatusesIdByType(). - тут рассмотрим добавление второго необязательного аргумента $site_id.

        • Anton F 13 дней назад

          Артем Полторанин, допустим у Вас модуль доставки и Вам нужно проверить статусы заказов по cron - Вы конечно можете отправлять запросы по каждому сайту отдельно, но запрос по всем сайтам сразу намного эффективнее. Я говорю о том, что вместо ->where(['site_id' => SiteManager::getSiteId()]) должно быть ->whereIn($sites ?: [SiteManager::getSiteId()])

Написать сообщение