dle-modules / DLE-UniForm

Универсальные формы обратной связи для DataLife Engine
http://pafnuty.name/modules/159-uniform.html
MIT License
22 stars 12 forks source link

[BUG] не работает на php 8 #112

Open tcse opened 1 year ago

tcse commented 1 year ago

Привет. При обновлении на php 8.1 плагин не запускается. Как только откатываешь на php7.4 или на php7.3 никаких проблем нет.

pafnuty commented 1 year ago

фигасе, уже php8 вышла)))

tcse commented 1 year ago

Прикол в том, что DLE 15.3 намекает прямо в теле админка: Внимание! Версия PHP, установленная на сервере, устарела. Часть функций скрипта с этой версией PHP будет недоступна, поэтому мы рекомендуем связаться с администрацией хостинга для обновления версии PHP! Рекомендуемая версия PHP для работы скрипта не ниже 8.1. Скачать последнюю версию можно на официальном сайте http://php.net/.

Но и на php7.4 в целом все работает. Без некоторых новых фичей. Но без них жить можно, а вот без Uniform нет.

15 нояб. 2022 г., в 15:46, Pavel Belousov @.***> написал(а):

фигасе, уже php8 вышла)))

— Reply to this email directly, view it on GitHub https://github.com/dle-modules/DLE-UniForm/issues/112#issuecomment-1315261967, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAX7CM6BWS2RHAWA6LAJIOLWIOA3TANCNFSM6AAAAAASA43IHU. You are receiving this because you authored the thread.

exforex commented 1 year ago

Уже PHP 8.2 вышла и тоже формы не работают. Вернее у меня форма открывается, но ничего не отправляется, лоадер на кнопке крутится и все... А если в настройках DLE установить использование JQuery 3.xxx, то даже формы не открываются... Пробовал сам разобраться в PHP файлах, но явных ошибок и проблем не увидел. Поэтому убедительная просьба (думаю все меня поддержат), доработайте, пожалуйста, под PHP 8.x, а также для JQuery 3.xx Понятно, как будет у вас время и возможность...

exforex commented 1 year ago

Перевел сайт на PHP 7.4 но все равно сообщения не отправляются. Скриншот: https://disk.yandex.ru/i/MhAu1KymbaoWow Может подскажете причину где, что подправить? Уже голову сломал...

tcse commented 1 year ago

только что проверил на тестовом домен вот с таким конфигом:

Версия jQuery для вашего сайта: 3.xx Версия DataLife Engine: | 15.3 Тип лицензии скрипта: | Лицензия активирована Операционная система: | Linux 5.4.0-120-generic Версия PHP: | 7.3.33 Версия MySQL: | 5.7.35-38

Формы плагина Uniform - работают.

Про php 7.4 прямо сейчас уточнить не смогу (так как многие другие модули работают тоже только до версии 7.3 и ниже.

exforex commented 1 year ago

только что проверил на тестовом домен вот с таким конфигом:

Версия jQuery для вашего сайта: 3.xx Версия DataLife Engine: | 15.3 Тип лицензии скрипта: | Лицензия активирована Операционная система: | Linux 5.4.0-120-generic Версия PHP: | 7.3.33 Версия MySQL: | 5.7.35-38

Формы плагина Uniform - работают.

Про php 7.4 прямо сейчас уточнить не смогу (так как многие другие модули работают тоже только до версии 7.3 и ниже.

Создал тестовый домен с таким конфигом: Версия jQuery для вашего сайта: 3.xx (2.хх тоже пробовал) Версия DataLife Engine: | 15.3 Тип лицензии скрипта: | Лицензия активирована Операционная система: | Linux 5.10.109-0 Версия PHP: | 7.3.31 Версия MySQL: | 5.7.21

Все равно не отправляет сообщения. На кнопке "Отправить" лоадер крутится и всё, и ничего не происходит. Чувствую, что дело вовсе не в PHP... У меня шаблон на Bootstrap, может в этом проблема? Может от Bootstrap скрипты какие-то мешают? Пробовал в main.tpl подключать скрипты от uniform раньше и позже подключения {AJAX{ и скриптов от Bootstrap, всё равно не хочет...

P.S. Сейчас попробовал на шаблоне Default, та же песня...

Во всех случаях заметил еще кое-что:

  1. Если делать подключение так: <span data-uniform="/engine/ajax/uniform/uniform.php" data-uf-settings='{"formConfig": "callback"}' class="uf-btn">Заказать звонок</span> то форма не открывается вообще, и неважно какой шаблон или какая версия PHP или JQuery
  2. Если подключать так: <a class="ttm-btn btn-inline ttm-btn-color-skincolor" data-uniform='{"formConfig": "feedback"}' href="#">Обратный звонок</a> то форма открывается, но сообщения не отправляются...
tcse commented 1 year ago

Может от Bootstrap скрипты какие-то мешают?

у меня все проекты на bootstrap - так что дело точно не в этом. Вот ссылки на проекты с dle 15.3 ( www.iv-service.ru и www.dalegion.com ) там стоит dle-uniform

Предположу, что у вас могут быть не внедрены правки исходников плагина:

Для DLE 15.0 и 15.1 исправление работы отправки писем.

  1. Открыть файл www/engine/modules/uniform/uniform.php

найти строку:

// Если данные передаются постом — надо бы их обработать
require_once ENGINE_DIR . '/classes/parse.class.php';
$parse = new ParseFilter();

и ВЫШЕ поставить:

include_once (DLEPlugins::Check(ENGINE_DIR . '/classes/htmlpurifier/HTMLPurifier.s

exforex commented 1 year ago

include_once (DLEPlugins::Check(ENGINE_DIR . '/classes/htmlpurifier/HTMLPurifier.s

Спасибо огромное! Помогло!

Однако, работает только если подключать так: **data-uniform='{"formConfig": "callback"}'** Если подключить так (как написано в инструкции) : **data-uniform="/engine/ajax/uniform/uniform.php" data-uf-settings='{"formConfig": "callback"}'**, то форма не открывается вообще...

Добавил ваше исправление через систему плагинов и всё пошло как надо... Да, и кстати, Это работает на PHP 8.2 и c JQuery 3.xx

Еще раз спасибо!!!

tcse commented 1 year ago

Однако, работает только если подключать так: **data-uniform='{"formConfig": "callback"}'** Если подключить так (как написано в инструкции) : **data-uniform="/engine/ajax/uniform/uniform.php" data-uf-settings='{"formConfig": "callback"}'**, то форма не открывается вообще...

Это 2 разных способа подключения в зависимости от версии модуля.

Пояснения:

DLE-Unirofm-1 - более не поддерживается разработчиком. Предназначена для DLE 9 - 13 без поддержки системы плагинов DLE. Используется старый синтаксис вызова форм обратной связи.

<span data-uf-open="/engine/ajax/uniform/uniform.php" data-uf-settings='{"formConfig": "_feedback"}' class="uf-btn">Обратная связь</span>

DLE-Unirofm-2 - актуальная версия плагина Используется новый синтаксис вызова форм обратной связи.

<span data-uniform="/engine/ajax/uniform/uniform.php" data-uf-settings='{"formConfig": "__feedback"}' class="uf-btn">Обратная связь</span>

Описанный ваш рабочий способ относится в версии DLE-Uniform 2 Версии с фиксами исходников тут https://github.com/tcse/DLE-Uniform-Help

exforex commented 1 year ago

Описанный ваш рабочий способ относится в версии DLE-Uniform 2 Версии с фиксами исходников тут https://github.com/tcse/DLE-Uniform-Help

Добрый день! Установил вашу пофиксенную версию отсюда: https://github.com/tcse/DLE-Uniform-Help/tree/main/Uniform-2. Все работает без дополнительных телодвижений на PHP 8.2

Появился вопрос по атачу. Я добавил в форму feedback ( {THEME}/uniform/feedback/form.tpl ) возможность прикреплять файлы к сообщению по примеру из папки attachments, но теперь сообщения отправляются только если прикрепить к нему файлы. Как сделать, чтобы прикрепление файлов было необязательным? Посмотрел в файле sendmail.php из папки engine/modules/uniform есть такой код:

// Добавляем вложения
/** @var array $arSendAttachments */
if (count($arSendAttachments)) {
    foreach ($arSendAttachments as $attach) {
        $mail->addAttachment($attach['tmp_name'], $attach['name']);
    }
}

Насколько я понял, то он проверяет есть ли вложения и в принципе всё правильно, если count($arSendAttachments) == 0, то этот кусок кода должен быть проигнорирован. Но сообщения не отправляются если пользователь не прикрепил файлы к сообщению. На кнопке Отправить крутится лоадер и ничего не происходит. Может я неправильно что-то делаю? Подскажите, пожалуйста, как лучше организовать в форме feedback прикрепление файлов так, чтобы эта возможность была необязательной? Заранее благодарю за помощь! С уважением, Олег.

exforex commented 1 year ago

Еще проблема с отправкой сообщения из тестовой формы. Тоже ничего не отправляется и на кнопке "Отправить" крутится лоадер и ничего не происходит. Подключил в htaccess вывод PHP-ошибок в файл и вот содержимое файла, который получился в папке engine/ajax:

[13-Jan-2023 15:39:49 Europe/Moscow] PHP Fatal error:  Uncaught TypeError: str_replace(): Argument #2 ($replace) must be of type string when argument #1 ($search) is a string in .../public_html/engine/modules/uniform/uniform.php:211
Stack trace:
#0 .../public_html/engine/modules/uniform/uniform.php(211): str_replace('{uf_field_selec...', Array, '\n<div class="uf...')
#1 .../public_html/engine/ajax/uniform.php(99): include('/home/o/ovpmus8...')
#2 .../public_html/engine/ajax/controller.php(194): include_once('/home/o/ovpmus8...')
#3 {main}
  thrown in .../public_html/engine/modules/uniform/uniform.php on line 211

Похожие ошибки возникают если попытаться отправить форму feedback с добавленной возможностью прикрепления файлов к сообщению (см. коммент выше)...

exforex commented 1 year ago

Разобрался где ошибка... В файле engine/modules/uniform/uniform.php найти: $tpl->copy_template = str_replace("{uf_field_{$k}}", $val, $tpl->copy_template); заменить на: $tpl->copy_template = str_replace("{uf_field_{$k}}", ".$val.", $tpl->copy_template); Переменная $val должна быть типом string в любом случае, иначе отправка формы без аттача не происходит... Теперь, даже если не прикреплять файлы к сообщению, то отправка происходит нормально. Протестировал на DLE 16.0 и PHP 8.2 - всё прекрасно работает. Сделал подключение кода через систему плагинов, чтобы не вносить изменения в исходник.