[РЕЛИЗ] SendIt 1.0.0-pl и документация

Приветствую! Первая стабильная версия моего нового компонента для отправки данных на сервер SendIt готова к использованию. Чтобы Вам было проще начать, я написал подробную документацию с примерами

Если хотите в общих чертах понять, что это за компонент, можете прочитать анонс.

Обращаю ваше внимание на то, что минимальная версия PHP с которой работает компонет 7.4. Если версия будет ниже, сайт сильно сломается и без доступа в БД Вы его не почините.В случае поломки, идите в БД и отключайте плагин SendIt, а потом шлите мне баг репорт.

Поддержки Modx 3 пока нет.

При установке должны скачаться FormIt и pdoTools. Однако со скачиванием FormIt могут возникнуть сложности, поэтому, возможно, придётся ставить его вручную.
pdoTools нужен только для возможности вызывать файловые сниппеты и чтобы работали стандартные чанки писем, если вам это не нужно pdoTools устанавливать необязательно.
Остальную информацию Вы сможете найти в документации. Она имеет такую структуру:
  1. Главная — содержит общую информацию и вариант быстрого старта
  2. Простые формы — тут вы найдёт информацию о том как отправлять одношаговые формы
  3. Опросники — этот раздел расскажет как создать многошаговую форму
  4. Загрузка файлов — тут вы узнаете как загружать файлы любого размера на сервер
  5. Сохранение данных — сюда могу заглянуть те, кому интересно, как сохраняются и заполняются данные форм.
  6. Уведомления — краткая информация об используемой библиотеке уведомлений.
  7. События — на этой странице вы узнаете как влиять на работу компонента.
  8. Разработка — ну и наконец я написал несколько примеров решения практических задач с помощью SendIt
Ссылка на компонент в Modstore.
Ссылка на компонент в репозитории.
Ссылка на документацию.

Хочу поблагодарить @Баха Волков за великолепный инструмент создания документации.
Артур Шевченко
28 августа 2023, 18:53
modx.pro
1 733
+8
Поблагодарить автора Отправить деньги

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

deleted
04 сентября 2023, 12:28
0
Надо будет попробовать)

Вообще мне кажется, что правильнее показывать уведомление об успешной отправке не в «тосте», а в самой форме. «Тост» можно и не заметить, особенно на большом экране. Вроде как отправил форму, а ничего не произошло) Хотя думаю это несложно через событие сделать.

Кстати, компонент сессии использует? Была задача встроить форму через iframe, такая форма не работала из-за сессий. Пришлось переписывать (использовал своё решение, не ajaxform) чтоб данные в кэше хранились.

Есть ли стандартный шаблон для писем?
    Николай Савин
    04 сентября 2023, 15:10
    0
    Это какого ж размера должен быть монитор, чтобы тост не заметить
      Артур Шевченко
      04 сентября 2023, 16:58
      0
      Вообще мне кажется, что правильнее показывать уведомление об успешной отправке не в «тосте», а в самой форме.
      Дизайнеры зачастую даже стили для отображения ошибок не рисуют, что уж говорить об успешной отправке, а у всплывашек из коробки приятный дизайн.

      Кстати, компонент сессии использует?
      Нет, не использует, но использует куки.

      Есть ли стандартный шаблон для писем?
      Есть три шаблона писем: для обычных форм и опросов, для подтверждения email, для сброса пароля.
      Maks
      06 сентября 2023, 10:50
      0
      Отлично. Все работает. Убрал 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
        Артур Шевченко
        06 сентября 2023, 11:53
        0
        В какой момент они вылезли?
          Maks
          06 сентября 2023, 12:41
          0
          Если пустое поля отправить.
        Maks
        06 сентября 2023, 12:42
        0
        Потом обновить страницу и вот такое вылазит.
          Maks
          06 сентября 2023, 13:51
          0
          Еще такой вопрос. Две формы на странице какие мне настройки для идентификации форм указывать
          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' => 'Як до вас звернутись',
              ],
          Форма вроде как и работает только уведомления не показывает ни на одной.
            Maks
            06 сентября 2023, 14:54
            0
            И еще одно. После установки подгружает шрифт на сайт с вашего файла css который идет с дополнением. Отключить его можно?
              Артур Шевченко
              06 сентября 2023, 20:07
              0
              МОжно в системный настройках удалить путь к css
              Maks
              06 сентября 2023, 19:06
              0
              Так и не запустил формы

              Пресет
              '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 отправлял уведомления без проблем то сейчас не работает.
                Артур Шевченко
                06 сентября 2023, 20:10
                0
                Про хук ничего не знаю, поэтому не могу сказать почему он не работает. А по поводу отсутствия уведомлений, надо смотреть консоль.
                  Anton
                  27 ноября 2023, 03:03
                  0
                  Подтверждаю сообщение Макса на счет хука для телеграм. Проверил несколько вариантов, которые раньше работали с formit. Они плюс минус отличаются набором полей, которые передаются из формы. Сегодня перебрал все (гуглятся по запросу modx telegram). Консоль отдает: /assets/components/sendit/action.php 500 (Internal Server Error). Идея компонента кайфовая, Артур! Если подскажешь, как подружить с телегой — будет вообще огонь!
                    Артур Шевченко
                    27 ноября 2023, 11:50
                    0
                    Как я вам подскажу, если хук этот в глаза не видел?
                Андрей Шевяков
                06 сентября 2023, 20:31
                0
                Добрый день!
                Такой вопрос возник.
                В личном кабинете есть форма изменения данных пользователя.

                <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.'
                    ],

                При таких настройках, можно в форме указать почту другого пользователя, который тоже есть в бд, и все сохранится. Как сделать, чтобы выдавал ошибку, что такой пользователь уже зарегистрирован и эту почту использовать нельзя?
                  Артур Шевченко
                  06 сентября 2023, 20:34
                  +1
                  Написать валидатор, который проверит есть ли такая почта или нет.
                    Андрей Шевяков
                    06 сентября 2023, 20:44
                    0
                    Спасибо, сделал его из userNotExists.
                    Назвал userExists

                    Код:
                    <?php
                    if($modx->getCount('modUser', array('username' => $value))){
                        $msg = $scriptProperties[$key.'.vTextUserExists'] ?: 'Такой пользователь уже зарегистрирован.';
                        $validator->addError($key, $msg);
                    }
                    return true;

                    Все работает!
                  Maks
                  06 сентября 2023, 20:32
                  0
                  в консоли
                  Object { "X-SIFORM": "oneStepFormru", "X-SIACTION": "send", "X-SIPRESET": "onestepformru", "X-SITOKEN": "75fc54dbfa9bae07784886b6ce8038ae" }
                  sending.js:91:17
                    Maks
                    06 сентября 2023, 20:34
                    0
                    Сообщения показывает об ошибке только если указан default
                    'validate' => 'phone:required,name:required,email:email:required,politics:checkbox:required',

                    Если же сам задаешь поля для валидации то сообщения нет.
                      Артур Шевченко
                      06 сентября 2023, 20:35
                      0
                      А сайт на локалке или на хостинге?
                        Maks
                        06 сентября 2023, 20:46
                        0
                        На хостинге
                    Андрей Шевяков
                    06 сентября 2023, 20:51
                    0
                    И еще такой вопрос. То что выводится в виде Notify iziToast можно ли выводить просто в коде в div, например перед формой?
                      Maks
                      06 сентября 2023, 20:53
                      0
                      Там настройки для этого есть насколько я понял.

                      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"
                            }
                          },
                        }
                      }
                        Maks
                        06 сентября 2023, 20:54
                        0
                        position: «topCenter»
                        вот это надо поменять
                          Артур Шевченко
                          06 сентября 2023, 20:56
                          +1
                          Если ты хочешь выводить текст ошибки в поле, то добавь тэгу в котором нужно вывести текст атрибут data-si-error с именем нужно поля, если ты хочешь вывести текст и successMessage или validationErrorMessage, то пиши свой JS который обнулит сообщение в ответе сервера и выведет его где тебе нужно.
                            Андрей Шевяков
                            06 сентября 2023, 20:58
                            0
                            Да, вот мне именно это и надо:
                            если ты хочешь вывести текст и successMessage или validationErrorMessage, то пиши свой JS который обнулит сообщение в ответе сервера и выведет его где тебе нужно.
                            А может есть пример какой нибудь?
                        Maks
                        06 сентября 2023, 21:13
                        0
                        Очень жаль что так и не получилось завести. Реально снижает нагрузку на сайт.
                        Андрей Шевяков
                        08 сентября 2023, 14:25
                        0
                        Можно ли решить такую задачу дополнением SendIt?

                        Есть форма. В ней клиент оставляет 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>

                        Подскажите на что обратить внимание? Т.е. получается нам надо отправлять письма на почты которые заранее неизвестны, их заполняет клиент.
                          Артур Шевченко
                          08 сентября 2023, 15:39
                          +1
                          Нужно написать плагин который возьмёт нужные данные из $_POST и положит в параметр emailTo.
                          Александр
                          15 сентября 2023, 23:23
                          0
                          Установил на сайт, и все, 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 последний, что делать не пойму
                          Как раз «сайт сильно сломался»)
                            Николай Савин
                            16 сентября 2023, 06:45
                            0
                            Поставь PHP 8.3, зачем старьем пользуешься
                              Александр
                              16 сентября 2023, 10:50
                              0
                              Когда эта версия появится — поставлю. В доках написано, что минимальная версия PHP 7.4
                              В общем в любом случае, хотелось бы узнать, каким образом я могу вернуть сайт в рабочее состояние
                                Артур Шевченко
                                16 сентября 2023, 10:59
                                1
                                +1
                                Зайти в БД и отключить плагин SendIt. Или там же в БД в коде плагина третий параметр заменить на 0. Спасибо за багрепорт, на 8.2 не тестировал в следующем обновлении исправлю.
                                  Николай Савин
                                  16 сентября 2023, 11:18
                                  0
                                  Ну так, а чего ты голову морочишь, если знаешь про PHP 7.4. Это единственная стабильно работающая версия для MODX2. Переключи на нее и не будет проблем.
                                    Futuris
                                    12 января 2024, 10:51
                                    0
                                    Может у него «трешка» стоит. Пишет же «modx revo последний».
                              Роман Л.
                              21 ноября 2023, 21:20
                              0
                              Добрый вечер!
                              При загрузке файлов с русскими именами возникает ошибка:

                              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.

                              Подскажите как это исправить? Спасибо.
                                Артур Шевченко
                                21 ноября 2023, 22:05
                                0
                                Переименовывать файл. Или проверять имя на наличие кириллицы и запрещать загрузку.
                                  Deni
                                  07 декабря 2023, 00:39
                                  0
                                  а по другому точно никак не решить?.. пользователям сложно доносить такую информацию
                                    Артур Шевченко
                                    07 декабря 2023, 10:21
                                    0
                                    Обновись до 1.0.9, если уже установлена эта версия — удали и установи заново, я добавил транслитерацию кириллицы
                                Даниил
                                06 марта 2024, 07:35
                                0
                                Здравствуйте, вопрос по безопасности. Папка с компонентом всегда доступна, если мы захотим переименовать папку или перенести в другое место, то её можно будет сразу обнаружить. Защищая сайт папку ассетс переименовывают, а этот компонент выдаст новое имя, потому что подключает скрипты. Можно ли перенести скрипты в другую папку и подключить их корректно?
                                  Артур Шевченко
                                  06 марта 2024, 10:15
                                  0
                                  Не очень понимаю как вам удаётся повышать безопасность сайта переименовыванием папки assets, если по любой картинке можно узнать как она у вас называется?
                                    Даниил
                                    06 марта 2024, 10:25
                                    0
                                    В новой папке остаются только компоненты. В старой не переименованной скрипты сайта картинки и прочее. Куча статей есть. Например itforweb.ru/blog/modx-revolution-security-2018 или ilyaut.ru/reposts/protection-of-a-site-on-modx-revolution/
                                      Артур Шевченко
                                      06 марта 2024, 10:40
                                      0
                                      Запрос всё равно будет улетать на файл components/sendit/action.php и этот путь можно будет увидеть через консоль браузера. А путь можно сменить через системные настройки, главное сохранить структуру папок и файлов внутри папки компонента.
                                        Даниил
                                        06 марта 2024, 10:46
                                        0
                                        Дак ассетс тоже перемещают и htacces запретить прямой запуск php!
                                          Артур Шевченко
                                          06 марта 2024, 11:00
                                          0
                                          А как тогда асинхронные запросы принимать и обрабатывать, если php будет запрещено запускать?
                                            Даниил
                                            06 марта 2024, 11:25
                                            0
                                            Для внешнего запуска. Мы уже поняли что ничего не будет делаться в плане безопасности, ладно бэкапы есть же.
                                              Артур Шевченко
                                              06 марта 2024, 18:23
                                              0
                                              Думаю у вас не получится запустить SendIt из вне
                                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                  51