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 года. У меня следующий вопрос у всех эта проблема или я словил баг?
Арман
31 марта 2024, 04:16
modx.pro
471
0

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

vit
vit
31 марта 2024, 09:24
0
У меня на MODX3 с php 8.1 тоже не работал месяц назад
    Арман
    31 марта 2024, 12:05
    0
    А сейчас работает?
      vit
      vit
      31 марта 2024, 21:15
      0
      Не знаю на FetchIt перешел. Он работает
    Артур Шевченко
    02 апреля 2024, 16:22
    0
    Спасибо, что сообщили. Но может быть у вас есть лог ошибок?
      Арман
      02 апреля 2024, 17:36
      0
      Если это поможет могу даже в личку прислать данные от админки. Для развития комьюнити не жалко)
        Артур Шевченко
        02 апреля 2024, 18:32
        +2
        Не надо, я тогда сам протестирую на PHP8
          Арман
          03 апреля 2024, 20:50
          0
          У меня на хостинге выключены логи. Как только разберусь как включить, постараюсь прислать.
        Арман
        08 апреля 2024, 04:22
        0
        [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
          Артур Шевченко
          08 апреля 2024, 10:18
          0
          Что за сниппет c id = 11?
            Арман
            08 апреля 2024, 15:39
            0
            Лежит в папке 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);
              Арман
              08 апреля 2024, 15:41
              0
              Моя форма
              <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,
                  ],
              ];
                Артур Шевченко
                08 апреля 2024, 17:18
                0
                попробуй такой чанк письма
                {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}
                  Арман
                  09 апреля 2024, 20:57
                  0
                  Письмо отправилось но с пустым содержанием. Отправилась значение темы письма то что находится внутри 'emailSubject' => 'Письмо с сайта domain.ru',
                  В данный момент стоит 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}
                    Артур Шевченко
                    09 апреля 2024, 22:17
                    0
                    Ошибку вызывает вот эта строка
                    {if $questions | count}
                    Сюда приходит null, а так как модификатор count это по сути вызов функции count(), то и в функцию приходит null, а она на вход требует как минимум массив, поэтому php 8 выбрасывает критическую ошибку. Соответственно надо либо убрать условие или добавить дополнительную проверку, как в предыдущем комментарии. Но это всё только предположения.
                      Арман
                      10 апреля 2024, 02:25
                      0
                      Попробовал так. Письмо всё равно отправляется пустым. Возможно не передаются значения который находятся в переменных. Или передается некорректно.
                      {set $fields = $fields | replace: '"' : '"' | fromJSON}
                      {set $fieldsAliases = $fieldsAliases | replace: '"' : '"' | fromJSON}
                      <h3>{$_pls['savedForm.form']}</h3>

                      На всякий случай проверил так. Здесь всё отправляется.
                      <h3>test</h3>

                      После того как поменяли строку на {if $questions && ($questions | count)} письма начали отправляться (до этого не отправлялись на php 8) Но похоже дело не только в этом.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          15