[РЕЛИЗ] SendIt 1.0.0-pl и документация
Приветствую! Первая стабильная версия моего нового компонента для отправки данных на сервер SendIt готова к использованию. Чтобы Вам было проще начать, я написал подробную документацию с примерами
Если хотите в общих чертах понять, что это за компонент, можете прочитать анонс.
Обращаю ваше внимание на то, что минимальная версия PHP с которой работает компонет 7.4. Если версия будет ниже, сайт сильно сломается и без доступа в БД Вы его не почините.В случае поломки, идите в БД и отключайте плагин SendIt, а потом шлите мне баг репорт.
Поддержки Modx 3 пока нет.
При установке должны скачаться FormIt и pdoTools. Однако со скачиванием FormIt могут возникнуть сложности, поэтому, возможно, придётся ставить его вручную.
pdoTools нужен только для возможности вызывать файловые сниппеты и чтобы работали стандартные чанки писем, если вам это не нужно pdoTools устанавливать необязательно.
Остальную информацию Вы сможете найти в документации. Она имеет такую структуру:
Ссылка на компонент в репозитории.
Ссылка на документацию.
Хочу поблагодарить @Баха Волков за великолепный инструмент создания документации.
Если хотите в общих чертах понять, что это за компонент, можете прочитать анонс.
Обращаю ваше внимание на то, что минимальная версия PHP с которой работает компонет 7.4. Если версия будет ниже, сайт сильно сломается и без доступа в БД Вы его не почините.В случае поломки, идите в БД и отключайте плагин SendIt, а потом шлите мне баг репорт.
Поддержки Modx 3 пока нет.
При установке должны скачаться FormIt и pdoTools. Однако со скачиванием FormIt могут возникнуть сложности, поэтому, возможно, придётся ставить его вручную.
pdoTools нужен только для возможности вызывать файловые сниппеты и чтобы работали стандартные чанки писем, если вам это не нужно pdoTools устанавливать необязательно.
Остальную информацию Вы сможете найти в документации. Она имеет такую структуру:
- Главная — содержит общую информацию и вариант быстрого старта
- Простые формы — тут вы найдёт информацию о том как отправлять одношаговые формы
- Опросники — этот раздел расскажет как создать многошаговую форму
- Загрузка файлов — тут вы узнаете как загружать файлы любого размера на сервер
- Сохранение данных — сюда могу заглянуть те, кому интересно, как сохраняются и заполняются данные форм.
- Уведомления — краткая информация об используемой библиотеке уведомлений.
- События — на этой странице вы узнаете как влиять на работу компонента.
- Разработка — ну и наконец я написал несколько примеров решения практических задач с помощью SendIt
Ссылка на компонент в репозитории.
Ссылка на документацию.
Хочу поблагодарить @Баха Волков за великолепный инструмент создания документации.
Поблагодарить автора
Отправить деньги
Комментарии: 51
Надо будет попробовать)
Вообще мне кажется, что правильнее показывать уведомление об успешной отправке не в «тосте», а в самой форме. «Тост» можно и не заметить, особенно на большом экране. Вроде как отправил форму, а ничего не произошло) Хотя думаю это несложно через событие сделать.
Кстати, компонент сессии использует? Была задача встроить форму через iframe, такая форма не работала из-за сессий. Пришлось переписывать (использовал своё решение, не ajaxform) чтоб данные в кэше хранились.
Есть ли стандартный шаблон для писем?
Вообще мне кажется, что правильнее показывать уведомление об успешной отправке не в «тосте», а в самой форме. «Тост» можно и не заметить, особенно на большом экране. Вроде как отправил форму, а ничего не произошло) Хотя думаю это несложно через событие сделать.
Кстати, компонент сессии использует? Была задача встроить форму через iframe, такая форма не работала из-за сессий. Пришлось переписывать (использовал своё решение, не ajaxform) чтоб данные в кэше хранились.
Есть ли стандартный шаблон для писем?
Это какого ж размера должен быть монитор, чтобы тост не заметить
Вообще мне кажется, что правильнее показывать уведомление об успешной отправке не в «тосте», а в самой форме.Дизайнеры зачастую даже стили для отображения ошибок не рисуют, что уж говорить об успешной отправке, а у всплывашек из коробки приятный дизайн.
Кстати, компонент сессии использует?Нет, не использует, но использует куки.
Есть ли стандартный шаблон для писем?Есть три шаблона писем: для обычных форм и опросов, для подтверждения email, для сброса пароля.
Отлично. Все работает. Убрал Fetchit и запросов стало на 14 меньше.
Остался вопрос почему в консоли такие ошибки вылези?
Остался вопрос почему в консоли такие ошибки вылези?
Uncaught (in promise) TypeError: can't access property "closest", target is null
resetAllErrors assets/components/sendit/web/js/modules/sending.js:250
send /assets/components/sendit/web/js/modules/sending.js:107
removeDir /assets/components/sendit/web/js/modules/fileuploader.js:273
initialize /assets/components/sendit/web/js/modules/fileuploader.js:127
initialize /assets/components/sendit/web/js/modules/fileuploader.js:126
send /assets/components/sendit/web/js/modules/sending.js:119
prepareSendParams /assets/components/sendit/web/js/modules/sending.js:86
initialize /assets/components/sendit/web/js/modules/sending.js:42
initialize /assets/components/sendit/web/js/modules/sending.js:36
Sending /assets/components/sendit/web/js/modules/sending.js:26
SendIt /assets/components/sendit/web/js/sendit.js:16
promise callback*SendIt /assets/components/sendit/web/js/sendit.js:14
<anonymous> /assets/components/sendit/web/js/sendit.js:105
<anonymous> /assets/components/sendit/web/js/sendit.js:106
В какой момент они вылезли?
Если пустое поля отправить.
Потом обновить страницу и вот такое вылазит.
Еще такой вопрос. Две формы на странице какие мне настройки для идентификации форм указывать
data-si-preset
или
data-si-form
Создал два пресета для двух языков
data-si-preset
или
data-si-form
Создал два пресета для двух языков
'onestepformru' => [
'extends' => 'default',
'hooks' => 'FormItSaveForm',
'redirectTo' => 0,
'redirectTimeout' => 3000,
'clearFieldsOnSuccess' => 1,
'fieldNames' => 'name==Возраст',
'successMessage' => 'Ваш запрос успешно отправлен! На протяжинии 30 минут вам перевзонит наш менеджер!',
'validate' => 'phone:required,name:required',
'phone.vTextRequired' => 'Введите номер телефона',
'name.vTextRequired' => 'Как к вам обращаться',
],
'onestepformuk' => [
'extends' => 'default',
'hooks' => 'FormItSaveForm',
'redirectTo' => 0,
'redirectTimeout' => 3000,
'clearFieldsOnSuccess' => 1,
'fieldNames' => 'name==Возраст',
'successMessage' => 'Ваш запит успішно відправлено! Протягом 30 хвилин вам зателефонує наш менеджер!',
'validate' => 'phone:required,name:required',
'phone.vTextRequired' => 'Введіть номер телефону',
'name.vTextRequired' => 'Як до вас звернутись',
],
Форма вроде как и работает только уведомления не показывает ни на одной.
И еще одно. После установки подгружает шрифт на сайт с вашего файла css который идет с дополнением. Отключить его можно?
МОжно в системный настройках удалить путь к css
Так и не запустил формы
Пресет
'onestepform' => [
'extends' => 'default',
'hooks' => 'FormItSaveForm,email,sendMessageTelegram',
'redirectTo' => 0,
'redirectTimeout' => 3000,
'clearFieldsOnSuccess' => 1,
'fieldNames' => 'name==Имя',
'successMessage' => 'Ваш запрос успешно отправлен! На протяжинии 30 минут вам перевзонит наш менеджер!',
],
Если в настройках default
'default' => [
'validate' => 'phone:required,name:required,email:email:required,politics:checkbox:required',
],
оставить все поля а мне надо только 2 поля проверять то форма не отправляется пишет Это поле обязательно.
Если же в настройках default
'default' => [
'validate' => 'phone:required,name:required',
],
оставить только нужные мне поля то сообщения об ошибке нет вообще.
Еще одно hooks sendMessageTelegram если раньше он на любом сниппете работал на fetchit на ajaxformlogin отправлял уведомления без проблем то сейчас не работает.
Пресет
'onestepform' => [
'extends' => 'default',
'hooks' => 'FormItSaveForm,email,sendMessageTelegram',
'redirectTo' => 0,
'redirectTimeout' => 3000,
'clearFieldsOnSuccess' => 1,
'fieldNames' => 'name==Имя',
'successMessage' => 'Ваш запрос успешно отправлен! На протяжинии 30 минут вам перевзонит наш менеджер!',
],
Если в настройках default
'default' => [
'validate' => 'phone:required,name:required,email:email:required,politics:checkbox:required',
],
оставить все поля а мне надо только 2 поля проверять то форма не отправляется пишет Это поле обязательно.
Если же в настройках default
'default' => [
'validate' => 'phone:required,name:required',
],
оставить только нужные мне поля то сообщения об ошибке нет вообще.
Еще одно hooks sendMessageTelegram если раньше он на любом сниппете работал на fetchit на ajaxformlogin отправлял уведомления без проблем то сейчас не работает.
Про хук ничего не знаю, поэтому не могу сказать почему он не работает. А по поводу отсутствия уведомлений, надо смотреть консоль.
Подтверждаю сообщение Макса на счет хука для телеграм. Проверил несколько вариантов, которые раньше работали с formit. Они плюс минус отличаются набором полей, которые передаются из формы. Сегодня перебрал все (гуглятся по запросу modx telegram). Консоль отдает: /assets/components/sendit/action.php 500 (Internal Server Error). Идея компонента кайфовая, Артур! Если подскажешь, как подружить с телегой — будет вообще огонь!
Как я вам подскажу, если хук этот в глаза не видел?
Добрый день!
Такой вопрос возник.
В личном кабинете есть форма изменения данных пользователя.
Для нее используются такие настройки:
При таких настройках, можно в форме указать почту другого пользователя, который тоже есть в бд, и все сохранится. Как сделать, чтобы выдавал ошибку, что такой пользователь уже зарегистрирован и эту почту использовать нельзя?
Такой вопрос возник.
В личном кабинете есть форма изменения данных пользователя.
<form action="#" data-si-form="dataForm" data-si-preset="dataedit">
<p class="personal-subheading">Основные данные</p>
<p class="personal-heading-dop">Обязательно укажите дату рождения, мы сделаем вам приятный подарок.</p>
<div class="input-blocks">
<div class="input-block">
<input type="text" name="fullname" value="{$_modx->user.fullname}">
<span class="placeholder">ФИО</span>
<span class="input-block__error" data-si-error="fullname"></span>
</div>
<div class="input-block">
<input type="tel" name="mobilephone" value="{$_modx->user.mobilephone}">
<span class="placeholder"></span>
<span class="input-block__error" data-si-error="mobilephone"></span>
</div>
</div>
<div class="input-blocks">
<div class="input-block">
<input type="email" name="email" value="{$_modx->user.email}">
<span class="placeholder">Email</span>
<span class="input-block__error" data-si-error="email"></span>
</div>
<div class="input-block">
<input type="date" name="dob" value="{$_modx->user.dob}">
<span class="placeholder">Дата рождения</span>
<span class="input-block__error" data-si-error="dob"></span>
</div>
</div>
<div class="input-blocks input-block-w100">
<div class="input-block">
<button type="submit" class="btn btn-grey">Сохранить изменения</button>
</div>
</div>
</form>
Для нее используются такие настройки:
'dataedit' => [
'hooks' => 'AjaxIdentification',
'method' => 'update',
'successMessage' => 'Данные успешно сохранены.',
'clearFieldsOnSuccess' => 0,
'validate' => 'fullname:required,mobilephone:required,email:email:required',
'email.vTextRequired' => 'Укажите email.'
],
При таких настройках, можно в форме указать почту другого пользователя, который тоже есть в бд, и все сохранится. Как сделать, чтобы выдавал ошибку, что такой пользователь уже зарегистрирован и эту почту использовать нельзя?
Написать валидатор, который проверит есть ли такая почта или нет.
Спасибо, сделал его из userNotExists.
Назвал userExists
Код:
Все работает!
Назвал userExists
Код:
<?php
if($modx->getCount('modUser', array('username' => $value))){
$msg = $scriptProperties[$key.'.vTextUserExists'] ?: 'Такой пользователь уже зарегистрирован.';
$validator->addError($key, $msg);
}
return true;
Все работает!
в консоли
Object { "X-SIFORM": "oneStepFormru", "X-SIACTION": "send", "X-SIPRESET": "onestepformru", "X-SITOKEN": "75fc54dbfa9bae07784886b6ce8038ae" }
sending.js:91:17
Сообщения показывает об ошибке только если указан default
'validate' => 'phone:required,name:required,email:email:required,politics:checkbox:required',
Если же сам задаешь поля для валидации то сообщения нет.
'validate' => 'phone:required,name:required,email:email:required,politics:checkbox:required',
Если же сам задаешь поля для валидации то сообщения нет.
А сайт на локалке или на хостинге?
На хостинге
Кидай ссылку
Куда кидать?
И еще такой вопрос. То что выводится в виде Notify iziToast можно ли выводить просто в коде в div, например перед формой?
Там настройки для этого есть насколько я понял.
export default function returnConfigs() {
return {
Notify: {
pathToScripts: './modules/notify.js',
jsPath: 'assets/components/sendit/web/js/lib/izitoast/iziToast.min.js',
cssPath: 'assets/components/sendit/web/css/lib/izitoast/iziToast.min.css',
handlerClassName: 'iziToast',
toastSelector: '.iziToast',
typeSelectors: {
success: '.iziToast-color-green',
info: '.iziToast-color-blue',
error: '.iziToast-color-red',
warning: '.iziToast-color-yellow',
},
titleSelector: '.iziToast-title',
handlerOptions: {
timeout: 2500,
position: "topCenter"
}
},
}
}
position: «topCenter»
вот это надо поменять
вот это надо поменять
Если ты хочешь выводить текст ошибки в поле, то добавь тэгу в котором нужно вывести текст атрибут data-si-error с именем нужно поля, если ты хочешь вывести текст и successMessage или validationErrorMessage, то пиши свой JS который обнулит сообщение в ответе сервера и выведет его где тебе нужно.
Да, вот мне именно это и надо:
если ты хочешь вывести текст и successMessage или validationErrorMessage, то пиши свой JS который обнулит сообщение в ответе сервера и выведет его где тебе нужно.А может есть пример какой нибудь?
В доке есть примеры работы с событиями.
Очень жаль что так и не получилось завести. Реально снижает нагрузку на сайт.
Скинь мне ссылку в телегу t.me/ShevArtV
Можно ли решить такую задачу дополнением SendIt?
Есть форма. В ней клиент оставляет email и имя того кому должно уйти письмо.
Необходимо, чтобы письмо после отправки уходило на почты:
— Почта администратора сайта
— Почта того кто отправляет письмо name=«name»
— Почта того кого указали получателем письма в форме name=«recipient_name»
Форма:
Подскажите на что обратить внимание? Т.е. получается нам надо отправлять письма на почты которые заранее неизвестны, их заполняет клиент.
Есть форма. В ней клиент оставляет email и имя того кому должно уйти письмо.
Необходимо, чтобы письмо после отправки уходило на почты:
— Почта администратора сайта
— Почта того кто отправляет письмо name=«name»
— Почта того кого указали получателем письма в форме name=«recipient_name»
Форма:
<p>Хотите получить это изделие в подарок?</p>
<p>Мы намекнем другу, о чем вы мечтаете</p>
<form action="#" method="post">
<input type="hidden" name="product" value="{$_modx->resource.id}">
<div class="input-block">
<input type="text" name="recipient_name">
<span class="placeholder">Имя получателя</span>
</div>
<div class="input-block">
<input type="text" name="recipient_email">
<span class="placeholder">Email получателя</span>
</div>
<div class="input-block">
<input type="text" name="name">
<span class="placeholder">Ваше имя</span>
</div>
<div class="input-block">
<input type="text" name="email">
<span class="placeholder">Ваш email</span>
</div>
<button class="btn btn-dark" type="submit">Отправить</button>
</form>
Подскажите на что обратить внимание? Т.е. получается нам надо отправлять письма на почты которые заранее неизвестны, их заполняет клиент.
Нужно написать плагин который возьмёт нужные данные из $_POST и положит в параметр emailTo.
Установил на сайт, и все, 500я ошибка.
В логах:
Как раз «сайт сильно сломался»)
В логах:
PHP Fatal error: Uncaught TypeError: setcookie(): Argument #3 ($expires_or_options) must be of type array|int, string given in test/public_html/core/cache/includes/elements/modplugin/14.include.cache.php:24\nStack trace:\n#0 test/public_html/core/cache/includes/elements/modplugin/14.include.cache.php(24): setcookie('SendIt', '{"sitoken":"d30...', '', '/')\n#1 test/public_html/core/model/modx/modscript.class.php(76): include('/home/c/c4endlk...')\n#2 test/public_html/core/model/modx/modx.class.php(1674): modScript->process(NULL)\n#3 test/public_html/core/model/modx/modmanagerrequest.class.php(120): modX->invokeEvent('OnHandleRequest')\n#4 test/public_html/manager/index.php(59): modManagerRequest->handleRequest()\n#5 {main}\n thrown in test/public_html/core/cache/includes/elements/modplugin/14.include.cache.php on line 24
Версия PHP 8.2, modx revo последний, что делать не поймуКак раз «сайт сильно сломался»)
Поставь PHP 8.3, зачем старьем пользуешься
Когда эта версия появится — поставлю. В доках написано, что минимальная версия PHP 7.4
В общем в любом случае, хотелось бы узнать, каким образом я могу вернуть сайт в рабочее состояние
В общем в любом случае, хотелось бы узнать, каким образом я могу вернуть сайт в рабочее состояние
Зайти в БД и отключить плагин SendIt. Или там же в БД в коде плагина третий параметр заменить на 0. Спасибо за багрепорт, на 8.2 не тестировал в следующем обновлении исправлю.
Ну так, а чего ты голову морочишь, если знаешь про PHP 7.4. Это единственная стабильно работающая версия для MODX2. Переключи на нее и не будет проблем.
Может у него «трешка» стоит. Пишет же «modx revo последний».
Добрый вечер!
При загрузке файлов с русскими именами возникает ошибка:
Uncaught (in promise) TypeError: Failed to execute 'fetch' on 'Window': Failed to read the 'headers' property from 'RequestInit': String contains non ISO-8859-1 code point.
Подскажите как это исправить? Спасибо.
При загрузке файлов с русскими именами возникает ошибка:
Uncaught (in promise) TypeError: Failed to execute 'fetch' on 'Window': Failed to read the 'headers' property from 'RequestInit': String contains non ISO-8859-1 code point.
Подскажите как это исправить? Спасибо.
Переименовывать файл. Или проверять имя на наличие кириллицы и запрещать загрузку.
а по другому точно никак не решить?.. пользователям сложно доносить такую информацию
Обновись до 1.0.9, если уже установлена эта версия — удали и установи заново, я добавил транслитерацию кириллицы
Здравствуйте, вопрос по безопасности. Папка с компонентом всегда доступна, если мы захотим переименовать папку или перенести в другое место, то её можно будет сразу обнаружить. Защищая сайт папку ассетс переименовывают, а этот компонент выдаст новое имя, потому что подключает скрипты. Можно ли перенести скрипты в другую папку и подключить их корректно?
Не очень понимаю как вам удаётся повышать безопасность сайта переименовыванием папки assets, если по любой картинке можно узнать как она у вас называется?
В новой папке остаются только компоненты. В старой не переименованной скрипты сайта картинки и прочее. Куча статей есть. Например itforweb.ru/blog/modx-revolution-security-2018 или ilyaut.ru/reposts/protection-of-a-site-on-modx-revolution/
Запрос всё равно будет улетать на файл components/sendit/action.php и этот путь можно будет увидеть через консоль браузера. А путь можно сменить через системные настройки, главное сохранить структуру папок и файлов внутри папки компонента.
Дак ассетс тоже перемещают и htacces запретить прямой запуск php!
А как тогда асинхронные запросы принимать и обрабатывать, если php будет запрещено запускать?
Для внешнего запуска. Мы уже поняли что ничего не будет делаться в плане безопасности, ладно бэкапы есть же.
Думаю у вас не получится запустить SendIt из вне
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.