[SendIt 2.0.0] Пагинация и обновлённая загрузка файлов
Приветствую, коллеги. Как и обещал добавил новую функциональностью в свой самый популярный компонент и доработал старый функционал. Подробности ниже.
Общие изменения
1. Основные классы переехали в папку services.
2. Сессии больше не используются, потому что периодически при обновлении страницы это вызывало ошибку «Невалидный токен». Вместо них я добавил отдельную таблицу для хранения временных данных. Вы можете использовать её для своих нужд.Например так
Статический метод setSession принимает все те же параметры с той лишь разницей, что вторым параметром нужно передать массив данных, которые вы хотите сохранить.
Есть ещё статический метод clearSession, который принимает два параметра объект $modx и идентификатор ваших записей, он позволяет очистить все сохранённые вами данные, для которых истёк срок хранения указанный в системной настройке si_storage_time.
3. Проверка частоты и количества отправок больше не работает для форм без хуков Email или FormItAutoResponder. Если этих хуков нет, но проверка частоты нужна добавьте в пресет параметр antispam. Так же с помощью параметров можно изменять общие настройки частоты (pauseBetweenSending) и количества (sendingPerSession) отправок.
4. Чтобы была возможность создавать несколько плагинов изменяющих параметры вызова на событие OnGetFormParams в параметры события был добавлен объект SendIt.
5. Если вы использовали API компонента для отправки данных, а именно метод prepareSendParams(), то при обновлении имейте в виду, что количество и порядок необязательных параметров изменились.
Было
7. Теперь SendIt умеет сам вставлять результат работы сниппета вызванного через ajax, если этот результат представляет собой строку. Чтобы это работало пресет должен содержать параметры
Загрузка файлов
1. Добавил очередь загрузки. Пользователь может добавлять файлы в очередь до тех пор, пока их количество не достигнет максимально разрешённого. При этом, пока загрузка файла не началась, его можно удалить из очереди кликом по прогресс-бару с именем файла.
2. Файлы больше не удаляются после перезагрузки страницы и их загрузку можно продолжить, нужно только повторно добавить их в поле для загрузки файлов.
3. Сообщение об удалении файлов больше не будет показано при отправке основной формы.
4. Теперь можно указывать желаемые единицы измерения прогресса загрузки. По умолчанию прогресс показывается в процентах, однако с помощью параметра пресета loadedUnit можно поменять значение на одно из следующих b, mb, kb, gb, gb, при этом регистр значения не имеет.
5. Вы можете управлять точностью округления значений прогресса с помощью системной настройки si_precision
Квизы
1. Добавил в квиз JS событие si:quiz:progress, с его помощью можно корректировать отображение прогресса.
2. Добавил возможность убирать не нужные кнопки в квизе, теперь это не вызывает ошибок в консоли браузера.
Идентификация
1. Изменил метод сброса пароля. Теперь сброс пароля нужно подтверждать, переходом по ссылке из письма. Для активации нового пароля нужно вызвать сниппет ResetPassword на странице из параметра activationResourceId.
2. Для проверки существования пользователя добавил валидатор userExists. Его можно использовать если в ЛК у пользователя есть возможность менять username.
Пагинация
Это абсолютно новая функциональность для данного компонента. Использовать её можно с любыми сниппетами, главное, чтобы они устанавливали плейсхолдер с общим количеством результатов. На одной странице можно использовать сколько угодно пагинаций. Есть возможность динамически менять параметры сниппета и пользоваться пагинацией. Например можно реализовать поиск по результатам работы сниппета. Для этого понадобится вот такая разметка
Спасибо за внимание. Донаты приветствуются.
Общие изменения
1. Основные классы переехали в папку services.
2. Сессии больше не используются, потому что периодически при обновлении страницы это вызывало ошибку «Невалидный токен». Вместо них я добавил отдельную таблицу для хранения временных данных. Вы можете использовать её для своих нужд.Например так
<?php
switch($modx->event->name){
case 'OnHandleRequest':
if(file_exists(MODX_CORE_PATH . 'components/sendit/services/sendit.class.php')){
include_once MODX_CORE_PATH . 'components/sendit/services/sendit.class.php';
$session = SendIt::getSession($modx, session_id(), 'MyClass');
$session['myparam'] = 'value';
SendIt::setSession($modx, $session, session_id(), 'MyClass');
}
break;
}Статический метод getSession первым параметром принимает объект $modx, вторым параметром — идентификатор сессии можно использовать стандартный или любую строку, третьим параметром вы можете передать идентификатор именно ваших записей, если не указать будет использовано значение 'SendIt'.Статический метод setSession принимает все те же параметры с той лишь разницей, что вторым параметром нужно передать массив данных, которые вы хотите сохранить.
Есть ещё статический метод clearSession, который принимает два параметра объект $modx и идентификатор ваших записей, он позволяет очистить все сохранённые вами данные, для которых истёк срок хранения указанный в системной настройке si_storage_time.
3. Проверка частоты и количества отправок больше не работает для форм без хуков Email или FormItAutoResponder. Если этих хуков нет, но проверка частоты нужна добавьте в пресет параметр antispam. Так же с помощью параметров можно изменять общие настройки частоты (pauseBetweenSending) и количества (sendingPerSession) отправок.
4. Чтобы была возможность создавать несколько плагинов изменяющих параметры вызова на событие OnGetFormParams в параметры события был добавлен объект SendIt.
<?php
switch ($modx->event->name) {
case 'OnGetFormParams':
if ($presetName === 'mypreset') {
$SendIt->pluginParams['mykey'] = 'myvalue';
}
break;
}5. Если вы использовали API компонента для отправки данных, а именно метод prepareSendParams(), то при обновлении имейте в виду, что количество и порядок необязательных параметров изменились.
Было
prepareSendParams(root, preset = '', event = 'submit', action = 'send', params = new FormData())СталоprepareSendParams(root, preset = '', params = new FormData(), action = 'send')6. Наследование параметров пресета теперь работает между файлами, для этого нужно указать в параметре extends значение в формате имя_файла_без_расширения.имя_пресета.7. Теперь SendIt умеет сам вставлять результат работы сниппета вызванного через ajax, если этот результат представляет собой строку. Чтобы это работало пресет должен содержать параметры
- resultBlockSelector — CSS-селектор блока показа результатов
- resultShowMethod — метод показа результатов insert — вставка, append — добавление
$html = $modx->runSnippet('pdoResources', $SendIt->params)
return $SendIt->success('Ваше сообщение', ['html' => $html]);Загрузка файлов
1. Добавил очередь загрузки. Пользователь может добавлять файлы в очередь до тех пор, пока их количество не достигнет максимально разрешённого. При этом, пока загрузка файла не началась, его можно удалить из очереди кликом по прогресс-бару с именем файла.
2. Файлы больше не удаляются после перезагрузки страницы и их загрузку можно продолжить, нужно только повторно добавить их в поле для загрузки файлов.
3. Сообщение об удалении файлов больше не будет показано при отправке основной формы.
4. Теперь можно указывать желаемые единицы измерения прогресса загрузки. По умолчанию прогресс показывается в процентах, однако с помощью параметра пресета loadedUnit можно поменять значение на одно из следующих b, mb, kb, gb, gb, при этом регистр значения не имеет.
5. Вы можете управлять точностью округления значений прогресса с помощью системной настройки si_precision
Квизы
1. Добавил в квиз JS событие si:quiz:progress, с его помощью можно корректировать отображение прогресса.
2. Добавил возможность убирать не нужные кнопки в квизе, теперь это не вызывает ошибок в консоли браузера.
Идентификация
1. Изменил метод сброса пароля. Теперь сброс пароля нужно подтверждать, переходом по ссылке из письма. Для активации нового пароля нужно вызвать сниппет ResetPassword на странице из параметра activationResourceId.
2. Для проверки существования пользователя добавил валидатор userExists. Его можно использовать если в ЛК у пользователя есть возможность менять username.
Пагинация
Это абсолютно новая функциональность для данного компонента. Использовать её можно с любыми сниппетами, главное, чтобы они устанавливали плейсхолдер с общим количеством результатов. На одной странице можно использовать сколько угодно пагинаций. Есть возможность динамически менять параметры сниппета и пользоваться пагинацией. Например можно реализовать поиск по результатам работы сниппета. Для этого понадобится вот такая разметка
<section class="py-160-80 w-100 overflow_hidden">
<div class="container">
<form action="#" class="bs_big_shadow border-1 border_main radius_small p-30-15 bg_body mb-30" id="searchForm" data-si-form data-si-nosave>
<div class="mb-100 d_flex flex_column">
<p class="mb-30 fs-24-18 ts_default">
Пример реализации кастомного поиска и вывода результатов с пагинацией. Начните вводить любую часть ФИО из списка ниже.
</p>
<label class="mb-30">
<input type="text" name="query" data-si-event="input" data-si-preset="pagination-search"
class="form__input radius_pill border-1 border_primary focus_shadow_primary px-15 py-15 color_primary fs-18-16 w-100 bs_small_shadow"
placeholder="Поисковый запрос">
</label>
</div>
</form>
<div data-pn-result="three" style="display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));grid-template-rows: auto; gap:15px; margin-bottom: 50px;">
{'!Pagination' | snippet: [
'parents' => 7,
'query' => '',
'snippet' => '!Pagination',
'render' => '!pdoResources',
'presetName' => 'pagination-search',
'tpl' => '@FILE chunks/pdoresources/item.tpl',
'tplEmpty' => '@FILE chunks/pdoresources/empty.tpl',
'limit' => 6,
'includeContent' => 1,
'setTotal' => 1,
'pagination' => 'three',
'resultBlockSelector' => '[data-pn-result="three"]',
'resultShowMethod' => 'insert'
]}
</div>
<!-- PAGINATION -->
{set $totalPages = 'three.totalPages' | placeholder}
{set $currentPage = 'three.currentPage' | placeholder}
{set $limit = 'three.limit' | placeholder}
<div style="display:flex;justify-content:space-between;align-items: center" data-pn-pagination="three" data-pn-type="" class="{$totalPages < 2 ? 'v_hidden' : ''}">
<button style="padding:10px;" type="button" data-pn-more="">Загрузить ещё</button>
<div style="display:flex;gap:10px;">
<button style="padding:10px" type="button" data-pn-first="1"><<</button>
<button style="padding:10px" type="button" data-pn-prev=""><</button>
<input style="width: 60px;" type="number" name="threepage" data-pn-current data-si-preset="pagination-search" form="searchForm" min="1" max="{$totalPages}"
value="{$currentPage?:1}">
<p style="display:flex;align-items: center;gap:5px;">из
<span data-pn-total="">{$totalPages?:1}</span>
</p>
<button style="padding:10px" type="button" data-pn-next="">></button>
<button style="padding:10px" type="button" data-pn-last="{$totalPages}">>></button>
</div>
<p>Показывать по <input type="number" name="limit" data-pn-limit form="searchForm" min="1" max="96" value="{$limit?:12}"></p>
</div>
</div>
</section>и плагин<?php
switch($modx->event->name) {
case 'OnBeforePageRender':
if($_REQUEST['query']){
$SendIt->params['where']['pagetitle:LIKE'] = '%' . $_REQUEST['query'] . '%';
}
break;
}Перемещение по страницам можно осуществлять как кнопками, так и прокруткой (data-pn-type=«scroll»). Для отслеживания прокрутки используется Intersection Observer API.Спасибо за внимание. Донаты приветствуются.
Комментарии: 28
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Можно хотя бы один пример создания простой формы с защитой от спама?
Просто если посмотреть в документацию, адрес tpl не тот, presetName тоже не тот.
Тут вы пишете в пункте 2, что больше нет ошибки «Невалидный токен», а я получается ставлю версию 2.1.0 (ранее не было ни какой) и ловлю эту ошибку) и не как не могу понять, как решить эту проблему)
Хотя я нашел проблему.
Почему-то не создается таблица
Версия php 7.4, версия modx 2.8.7
Во-первых проверьте версию сервера баз данных MySQL 5.7 или MariaDB 10.4. Во-вторых, попробуйте удалить все вервии пакета и установить самую свежую заново.
centOS 7
5.5.68-MariaDB
Там просто много сайтов и придется похоже все переносить.
Версия бд
Apache:
2.4.55
Панель управления Beget MySQL:
5.7.21-20-beget
Панель управления Beget Nginx:
1.21.1
Панель управления Beget Perl:
5.14.2
Панель управления Beget PHP:
8.3
Панель управления Beget Python:
2.7.3
Вот что в консоли
Вот чанк
{'RenderForm' | snippet: [
'tpl' => 'FormSlider',
'presetName' => 'slider_form',
'extends' => 'default',
'hooks' => 'FormItSaveForm,email',
'redirectTo' => 0,
'redirectTimeout' => 3000,
'clearFieldsOnSuccess' => 1,
'fieldNames' => 'name==Имя,phone==Телефон,email==Почта',
'validate' => 'phone:required,age:required,name:required,email:email:required,politics:checkbox:required',
'successMessage' => 'Форма отправлена!',
'validationErrorMessage' => 'Исправьте ошибки!'
]}
вот форма
Я на всё согласен!
Отправить
И сама форма
Я на всё согласен!
Отправить
[2024-12-02 11:33:09] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 787) siSession::load() is not a valid static method.
[2024-12-02 11:33:09] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 667) Could not load class: siSession from mysql.sisession
[2024-12-02 11:33:09] (ERROR @ /home/e/e8788408/complab/public_html/core/components/sendit/services/sendit.class.php: 1132) Table si_sessions not found
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 667) Could not load class: siSession from mysql.sisession
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 787) siSession::load() is not a valid static method.
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 667) Could not load class: siSession from mysql.sisession
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/components/sendit/services/sendit.class.php: 1132) Table si_sessions not found
Эта проблема решается настройкой конфигурации сервера.
Я не отрицаю наличие проблемы, просто не знаю как её решить со стороны компонента.
Решил на новом проекте использовать ваш замечательный компонент.
Отлично все реализовано, спасибо вам за труд.
Но в документации нашел опечатку:
docs.modx.pro/components/sendit/development
Раздел «Свой сниппет для обработки данных „
У вас Так не работает, так как опечатка в “erorrs» нужно «errors».
Не подскажите как корректно получить id ресурса, с которого идет отправка формы. Использую свой сниппет для обработки данных, в нем хотел применить вот такой код: Ранее использовал FetchIt, там такой подход работал.
С SendIt, что не получилось и в логах пусто. Получается если только передать id ресурса в самой форме в скрытом поле, но я не уверен, что это верный и корректный способ.
Полностью переустановил modx полностью переустановил sendit
Apache:
2.4.55
Панель управления Beget MySQL:
8-beget
Панель управления Beget Nginx:
1.21.1
Панель управления Beget Perl:
5.14.2
Панель управления Beget PHP:
8.3
Панель управления Beget Python:
2.7.3
Консоль
{«success»:false,«message»:"\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d.",«data»:{«successMessage»:"\u0424\u043e\u0440\u043c\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430!",«hooks»:«FormItSaveForm,email»,«emailTpl»:«siDefaultEmail»,«emailFrom»:«noreply@complab59.ru»,«formName»:«SimpleForm»,«emailSubject»:"\u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0441\u0430\u0439\u0442\u0430 complab59.ru",«validate»:«email:email:required,name:required,politics:required»,«sendGoal»:«0»,«counterId»:""}}
{success: false, message: «Невалидный токен.»,…}
data
:
{successMessage: «Форма отправлена!», hooks: «FormItSaveForm,email», emailTpl: «siDefaultEmail»,…}
counterId
:
""
emailFrom
:
«noreply@complab59.ru»
emailSubject
:
«Письмо с сайта complab59.ru»
emailTpl
:
«siDefaultEmail»
formName
:
«SimpleForm»
hooks
:
«FormItSaveForm,email»
sendGoal
:
«0»
successMessage
:
«Форма отправлена!»
validate
:
«email:email:required,name:required,politics:required»
message
:
«Невалидный токен.»
success
:
false
ЛОГИ
[2024-12-02 11:33:09] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 787) siSession::load() is not a valid static method.
[2024-12-02 11:33:09] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 667) Could not load class: siSession from mysql.sisession
[2024-12-02 11:33:09] (ERROR @ /home/e/e8788408/complab/public_html/core/components/sendit/services/sendit.class.php: 1132) Table si_sessions not found
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 667) Could not load class: siSession from mysql.sisession
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 787) siSession::load() is not a valid static method.
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/vendor/xpdo/xpdo/src/xPDO/xPDO.php: 667) Could not load class: siSession from mysql.sisession
[2024-12-02 11:33:10] (ERROR @ /home/e/e8788408/complab/public_html/core/components/sendit/services/sendit.class.php: 1132) Table si_sessions not found
Ошибка указывает на проблемы с попыткой загрузки класса siSession, который должен быть связан с таблицей mysql.sisession. Однако, в вашей базе данных нет таблицы с таким названием — вместо этого у вас есть таблицы modx_session и modx_si_sessions. Ошибка говорит, что метод siSession::load() является недействительным, и также проблема с загрузкой класса siSession. Скорее всего, какой-то скрипт пытается загрузить класс siSession, но не может найти соответствующую таблицу в базе данных.
выдает ошибку что путь к пресетам задан некорректно
в пресете
это косяк? или я чтото не понимаю