Sendit

Привет
У меня регулярно SENDIT выкидывает сообщение «Невалидный токен» при Авторизации или Регистрации.

modx3.1.2 + php8
ошибка в логе:

[2025-12-15 17:34:17] (ERROR @ ***** core/components/sendit/services/sendit.class.php: 1316) PHP warning: Undefined array key «siSession»
блок кода с ошибкой:
$sessionId = $sessionId ?: $_COOKIE['siSession'];
        if (!$session = $modx->getObject('siSession', ['session_id' => $sessionId, 'class_name' => $className])) {
            return [];
        }



Я посоветовался c DeepSeek:
Ошибка возникает из-за того, что в PHP 8 стало строже обращение к несуществующим ключам массива. Нужно добавить проверку перед использованием $_COOKIE['siSession'].
Альтернативный подход — если кука не обязательна, можно создать новую сессию

Произвел замену:
//  $sessionId = $sessionId ?: $_COOKIE['siSession'];
        $sessionId = $sessionId ?: ($_COOKIE['siSession'] ?? null);
        
        if (empty($sessionId)) {
            // Создаем новую сессию
            $session = $modx->newObject('siSession');
            $session->set('session_id', uniqid('si_', true));
            $session->set('class_name', $className);
            $session->set('createdon', time());
            $session->save();
            
            // Устанавливаем куку
            setcookie('siSession', $session->get('session_id'), time() + 86400, '/');
            
            return $session->toArray();
        }
        
        if (!$session = $modx->getObject('siSession', ['session_id' => $sessionId, 'class_name' => $className])) {
            return [];
        }


Ошибка пропала. Но осадочек сомнения остался, всё ли так?
Григорий
Вчера в 18:19
modx.pro
53
0

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

Николай Савин
Вчера в 19:40
0
Привет Григорий.

Осадочек обоснованный — решение рабочее, но есть несколько моментов, которые стоит обдумать:

Что смущает в текущем фиксе

1. Изменение логики метода.
Оригинальный код при отсутствии сессии возвращал []. Теперь он создаёт сессию. Это может сломать логику в других местах SendIt, которые рассчитывают на пустой ответ как сигнал «сессии нет, нужно что-то сделать».

2. setcookie() без проверки заголовков
Если заголовки уже отправлены — будет ещё один warning.

Минимальный и безопасный фикс
Если цель — просто убрать warning без изменения логики:
$sessionId = $sessionId ?: ($_COOKIE['siSession'] ?? null);

if (!$sessionId || !$session = $modx->getObject('siSession', ['session_id' => $sessionId, 'class_name' => $className])) {
    return [];
}
Это сохраняет оригинальное поведение: нет куки → нет сессии → пустой массив. Создание сессии должно происходить там, где это предусмотрено архитектурой компонента.

Что бы я сделал

Посмотрел бы, где в SendIt сессия создаётся штатно. Скорее всего есть отдельный метод типа createSession() или это происходит при первой отправке формы. Вот там и должна быть логика создания + установки куки.

Твой фикс работает, но ты фактически добавил fallback-создание сессии в метод, который был рассчитан только на чтение. Если форма авторизации/регистрации работает корректно — можно оставить, но я бы откатился к минимальному варианту и понаблюдал.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2