Sendit не работает на PHP 8
Установил Sendit не отправлялись сообщение по итогу выяснилось что не работает на PHP 8 (проверил на php 8.0, 8.1, 8.2, 8.3). После того как поставил версию 7.4 всё заработало (этот компонент требует версию PHP 7.4 или выше! это то что написано на дополнении то есть по идее php 8 должен поддерживаться) На форуме нашёл следующее modx.pro/components/24188#comment-140721 Написано что исправят в следующем обновлении, но это сообщение с сентября 2023 года. У меня следующий вопрос у всех эта проблема или я словил баг?
Комментарии: 16
У меня на MODX3 с php 8.1 тоже не работал месяц назад
А сейчас работает?
Не знаю на FetchIt перешел. Он работает
Спасибо, что сообщили. Но может быть у вас есть лог ошибок?
Если это поможет могу даже в личку прислать данные от админки. Для развития комьюнити не жалко)
Не надо, я тогда сам протестирую на PHP8
У меня на хостинге выключены логи. Как только разберусь как включить, постараюсь прислать.
[08-Apr-2024 04:14:56 Europe/Moscow] PHP Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in /var/www/u1387551/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Template.php(487) : eval()'d code:20
Stack trace:
#0 /var/www/u1532978/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Render.php(215): Fenom\Template->{closure}(Array, Object(Fenom\Template))
#1 /var/www/u1532978/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Render.php(215): Closure->__invoke(Array, Object(Fenom\Template))
#2 /var/www/u1532978/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Template.php(492): Fenom\Render->display(Array)
#3 /var/www/u1532978/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Render.php(229): Fenom\Template->display(Array)
#4 /var/www/u1532978/data/www/site.ru/core/components/pdotools/src/Parsing/Fenom/Fenom.php(136): Fenom\Render->fetch(Array)
#5 /var/www/u1532978/data/www/site.ru/core/components/pdotools/src/CoreTools.php(418): ModxPro\PdoTools\Parsing\Fenom\Fenom->process(Array, Array)
#6 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt.php(341): ModxPro\PdoTools\CoreTools->getChunk('siDefaultEmail', Array)
#7 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Hook/Email.php(193): Sterc\FormIt->getChunk('siDefaultEmail', Array)
#8 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Hook.php(141): Sterc\FormIt\Hook\Email->process(Array)
#9 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Hook.php(107): Sterc\FormIt\Hook->load('email', Array, Array)
#10 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Request.php(402): Sterc\FormIt\Hook->loadMultiple(Array, Array)
#11 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Request.php(345): Sterc\FormIt\Request->runPostHooks()
#12 /var/www/u1532978/data/www/site.ru/core/components/formit/src/FormIt/Request.php(254): Sterc\FormIt\Request->postProcess()
#13 /var/www/u1532978/data/www/site.ru/core/cache/includes/elements/modx/revolution/modsnippet/11.include.cache.php(21): Sterc\FormIt\Request->handle(Array)
#14 /var/www/u1532978/data/www/site.ru/core/src/Revolution/modScript.php(88): include('/var/www/u13875...')
#15 /var/www/u1532978/data/www/site.ru/core/components/pdotools/src/CoreTools.php(358): MODX\Revolution\modScript->process(NULL)
#16 /var/www/u1532978/data/www/site.ru/core/components/sendit/model/sendit/sendit.class.php(391): ModxPro\PdoTools\CoreTools->runSnippet('FormIt', Array)
#17 /var/www/u1532978/data/www/site.ru/core/components/sendit/model/sendit/sendit.class.php(372): SendIt->runSnippet('FormIt')
#18 /var/www/u1532978/data/www/site.ru/assets/components/sendit/action.php(45): SendIt->process()
#19 {main}
thrown in /var/www/u1532978/data/www/site.ru/core/components/pdotools/vendor/fenom/fenom/src/Fenom/Template.php(487) : eval()'d code on line 20
Что за сниппет c id = 11?
Лежит в папке FormIt название сниппета так же FormIt.
Вот код который внутри:
Вот код который внутри:
<?php
/**
* FormIt
*
* A dynamic form processing Snippet for MODx Revolution.
*
* @var modX $modx
* @var array $scriptProperties
*
* @package formit
*/
use Sterc\FormIt;
$fi = new FormIt($modx, $scriptProperties);
$fi->initialize($modx->context->get('key'));
$fi->loadRequest();
$fields = $fi->request->prepare();
return $fi->request->handle($fields);
Моя форма
То что находится в core/components/sendit/presets/sendit.inc.php
Добавил только callback остальное не трогал
<form data-si-form="callback" data-si-preset="callback" class="p-4 p-md-5 border rounded-3 bg-primary bg-gradient">
<div class="form-floating mb-3">
<input name="phoneform" id="phoneform" type="tel" class="form-control" placeholder="+7 (XXX) XXX-XX-XX" pattern="(\+7|8)\s?[\(]?(\d{3})[\)]?\s?[\-]?(\d{3})[\-]?(\d{2})[\-]?(\d{2})" required>
<p data-si-error="phoneform"></p>
<label for="phoneform">Телефон</label>
</div>
<button class="w-100 btn btn-lg btn-light bg-gradient" type="submit">Жду звонка</button>
<hr class="text-white my-4">
<small class="text-white text-center">Свяжемся с вами в течении 1 минуты</small>
</form>
То что находится в core/components/sendit/presets/sendit.inc.php
Добавил только callback остальное не трогал
<?php
return [
'default' => [
'validate' => 'phone:required,age:required,name:required,email:email:required,politics:checkbox:required',
'fieldNames' => 'age==Возраст,name==Имя,phone==Телефон,email==Почта',
],
'callback' => [
'validate' => 'phoneform:required',
'fieldNames' => 'phoneform==Телефон',
'successMessage' => 'Форма отправлена!',
'hooks' => 'email,FormItSaveForm',
'emailTpl' => 'siDefaultEmail',
'emailTo' => 'marketing@site.ru',
'formName' => 'Форма по умолчанию',
'emailSubject' => 'Письмо с сайта domain.ru',
],
'search_something' => [
'snippet' => '@FILE snippets/snippet.search.php'
],
'check_something' => [
'snippet' => 'checkSnippet'
],
'check_code' => [
'snippet' => 'code'
],
'upload_file' => [
'hooks' => '',
'allowExt' => 'jpg,png,jpeg,webp,tiff,tif',
'portion' => 0.1,
'threadsQuantity' => 12,
],
'upload_simple_file' => [
'extends' => 'upload_file',
'maxSize' => 1,
'maxCount' => 2,
],
'upload_drop_file' => [
'extends' => 'upload_file',
'maxSize' => 5,
'maxCount' => 10,
],
'form_with_file' => [
'extends' => 'default',
'validate' => 'name:required',
'attachFilesToEmail' => 'files',
'allowFiles' => 'filelist',
'clearFieldsOnSuccess' => 1,
],
'quiz' => [
'validate' => 'phone:required,name:required,answers[*]:required,answers[7][]:checkbox:required,answers[3]:requiredIf=^answers[2]|Да^',
'clearFieldsOnSuccess' => 0,
'hooks' => 'FormItSaveForm,email',
'fieldNames' => 'phone==Телефон,name==Имя',
],
'register' => [
'hooks' => 'Identification,FormItSaveForm,FormItAutoResponder',
'method' => 'register',
'successMessage' => 'Вы успешно зарегистрированы. Подтвердите email для активации учётной записи.',
'fiarSubject' => 'Активация пользователя',
'fiarFrom' => 'email@domain.ru',
'fiarTpl' => 'siActivateEmail',
'activation' => 1,
'rememberme' => 1,
'authenticateContexts' => 'web',
'afterLoginRedirectId' => 5,
'autoLogin' => 1,
'redirectTo' => '',
'passwordField' => '',
'usernameField' => 'email',
'usergroupsField' => '',
'moderate' => '',
'redirectTimeout' => 3000,
'usergroups' => 2,
'activationResourceId' => 1,
'activationUrlTime' => 10800,
'validate' => 'email:required,password:checkPassLength=^8^,password_confirm:passwordConfirm=^password^,politics:checkbox:required',
'politics.vTextRequired' => 'Примите наши условия.',
'password.vTextRequired' => 'Придумайте пароль.',
'password.checkPassLength' => 'Пароль должен быть не менее 8 символов.',
],
'auth' => [
'successMessage' => 'Вы успешно авторизованы и будете перенаправлены в личный кабинет.',
'validate' => 'email:required,password:required',
'hooks' => 'Identification',
'method' => 'login',
'redirectTo' => 5,
'redirectTimeout' => 3000,
'usernameField' => 'email',
'email.vTextRequired' => 'Укажите email.',
'password.vTextRequired' => 'Введите пароль.',
'errorFieldName' => 'errorLogin'
],
'editpass' => [
'hooks' => 'Identification',
'method' => 'update',
'successMessage' => 'Пароль изменён.',
'validate' => 'password:required:minLength=^8^:regexp=^/\A[\da-zA-Z!#\?&]*$/^,password_confirm:password_confirm=^password^',
'password.vTextRequired' => 'Придумайте пароль.',
'password.vTextRegexp' => 'Пароль может содержать только цифры, латинские буквы и символы !,#,?,&',
'password.vTextMinLength' => 'Пароль должен быть не менее 8 символов.',
],
'dataedit' => [
'hooks' => 'Identification',
'method' => 'update',
'successMessage' => 'Данные сохранены.',
'clearFieldsOnSuccess' => 0,
'validate' => 'email:required:email',
'email.vTextRequired' => 'Укажите email.'
],
'logout' => [
'hooks' => 'Identification',
'method' => 'logout',
'successMessage' => 'До новых встреч!',
'redirectTo' => 1,
'errorFieldName' => 'errorLogout'
],
'forgot' => [
'hooks' => 'Identification,FormItSaveForm,FormItAutoResponder',
'method' => 'forgot',
'successMessage' => 'Новый пароль отправлен на ваш email',
'usernameField' => 'email',
'validate' => 'email:required:userNotExists',
'fiarSubject' => 'Восстановление пароля',
'fiarFrom' => 'email@domain.ru',
'fiarTpl' => 'siResetPassEmail',
'email.vTextRequired' => 'Укажите email.',
'email.vTextUserNotExists' => 'Пользователь не найден',
],
'custom' => [
'extends' => 'onestepform',
'snippet' => '@FILE snippets/test.php',
'hooks' => '',
'validate' => ''
],
'sendcode' => [
'hooks' => '',
'snippet' => '@FILE snippets/smsauth/snippet.sendcode.php',
'successMessage' => 'Код отправлен на номер {$phone}',
'validate' => 'phone:required',
'phone.vTextRequired' => 'Укажите телефон.'
],
'checkcode' => [
'hooks' => '',
'successMessage' => '',
'validate' => 'code:CheckCode',
'validationErrorMessage' => 'Неверный код.',
],
'sms_auth' => [
'extends' => 'checkcode',
'successMessage' => 'Вы успешно авторизованы.',
'hooks' => 'SetUserFields,Identification',
'method' => 'login',
'redirectTo' => 5,
'user_exist' => 1,
'redirectTimeout' => 3000,
'clearFieldsOnSuccess' => 1,
],
'sms_register' => [
'hooks' => 'SetUserFields,Identification',
'method' => 'register',
'successMessage' => 'Вы успешно зарегистрированы.',
'activation' => 0,
'autoLogin' => 1,
'redirectTo' => 5,
'redirectTimeout' => 3000,
'usergroups' => 2,
'validate' => 'fullname:required,phone:required,code:CheckCode',
'fullname.vTextRequired' => 'Укажите ваше имя.',
'clearFieldsOnSuccess' => 1,
],
];
попробуй такой чанк письма
{set $fields = $fields | replace: '"' : '"' | fromJSON}
{set $fieldsAliases = $fieldsAliases | replace: '"' : '"' | fromJSON}
{set $questions = $fields['questions'] | fromJSON}
{set $answers = $fields['answers'] | fromJSON}
<h3>{$_pls['savedForm.form']}</h3>
{if $questions && ($questions | count)}
{foreach $questions as $i => $question}
<p><strong>{$question}</strong>: {$answers[$i] | join: ', '}</p>
{/foreach}
{else}
{foreach $fields as $k => $v}
{if !($k in list ['fields', 'fieldsAliases'])}
<p><strong>{$fieldsAliases[$k] ?: $k}</strong>: {$v | join: ', '}</p>
{/if}
{/foreach}
{/if}
Письмо отправилось но с пустым содержанием. Отправилась значение темы письма то что находится внутри 'emailSubject' => 'Письмо с сайта domain.ru',
В данный момент стоит PHP FastCGI (Apache) 8.3.2 (alt)
Это то что у меня стоит внутри siDefaultEmail (ничего не менял)
В данный момент стоит PHP FastCGI (Apache) 8.3.2 (alt)
Это то что у меня стоит внутри siDefaultEmail (ничего не менял)
{set $fields = $fields | replace: '"' : '"' | fromJSON}
{set $fieldsAliases = $fieldsAliases | replace: '"' : '"' | fromJSON}
{set $questions = $fields['questions'] | fromJSON}
{set $answers = $fields['answers'] | fromJSON}
<h3>{$_pls['savedForm.form']}</h3>
{if $questions | count}
{foreach $questions as $i => $question}
<p><strong>{$question}</strong>: {$answers[$i] | join: ', '}</p>
{/foreach}
{else}
{foreach $fields as $k => $v}
{if !($k in list ['fields', 'fieldsAliases'])}
<p><strong>{$fieldsAliases[$k] ?: $k}</strong>: {$v | join: ', '}</p>
{/if}
{/foreach}
{/if}
Ошибку вызывает вот эта строка
{if $questions | count}
Сюда приходит null, а так как модификатор count это по сути вызов функции count(), то и в функцию приходит null, а она на вход требует как минимум массив, поэтому php 8 выбрасывает критическую ошибку. Соответственно надо либо убрать условие или добавить дополнительную проверку, как в предыдущем комментарии. Но это всё только предположения.
Попробовал так. Письмо всё равно отправляется пустым. Возможно не передаются значения который находятся в переменных. Или передается некорректно.
На всякий случай проверил так. Здесь всё отправляется.
После того как поменяли строку на {if $questions && ($questions | count)} письма начали отправляться (до этого не отправлялись на php 8) Но похоже дело не только в этом.
{set $fields = $fields | replace: '"' : '"' | fromJSON}
{set $fieldsAliases = $fieldsAliases | replace: '"' : '"' | fromJSON}
<h3>{$_pls['savedForm.form']}</h3>
На всякий случай проверил так. Здесь всё отправляется.
<h3>test</h3>
После того как поменяли строку на {if $questions && ($questions | count)} письма начали отправляться (до этого не отправлялись на php 8) Но похоже дело не только в этом.
Когда планируется обновление? :'э
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.