Sendit и Pagination
Всем добрый вечер.
Возникал задача сделать фильтрацию ресурсов по множественным значения. Взял в качестве решения Sendit, потому что ну очень классная штука и прям вот всё в ней нравится и очень гибкая))
Но не сталкивался с пагинацией, и вот этот день настал.
Значит так, я взял из примера документации один пример, и немного его подправил.
Подскажите, что я упустил?
Возникал задача сделать фильтрацию ресурсов по множественным значения. Взял в качестве решения Sendit, потому что ну очень классная штука и прям вот всё в ней нравится и очень гибкая))
Но не сталкивался с пагинацией, и вот этот день настал.
Значит так, я взял из примера документации один пример, и немного его подправил.
<div data-pn-result="three">
{'!Pagination' | snippet: [
'parents' => 165,
'query' => '',
'hashParams' => 'building_status,property_rooms',
'snippet' => '!Pagination',
'render' => '!pdoResources',
'presetName' => 'pagination-search',
'tpl' => '@INLINE : <p>[[+pagetitle]]</p>',
'tplEmpty' => '@INLINE : <p>Пустой результат тут!</p>',
'limit' => 1,
'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 data-pn-pagination="three" data-pn-type="" class="{$totalPages < 2 ? 'v_hidden' : ''}">
<button type="button" data-pn-more="">Загрузить ещё</button>
<div>
<button type="button" data-pn-first="1"><<</button>
<button type="button" data-pn-prev=""><</button>
<input type="number" name="threepage" data-pn-current data-si-preset="pagination-search" form="searchForm" min="1" max="{$totalPages}" value="{$currentPage?:1}">
<p>из <span data-pn-total="">{$totalPages?:1}</span>
</p>
<button type="button" data-pn-next="">></button>
<button 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>
В самой форме фильтрации есть такие поля.<form action="#" id="searchForm" data-si-form data-si-preset="pagination-search" data-si-event="change">
<h6>Тип</h6>
<input type="checkbox" value="Новостройка" name="building_status[]">
<input type="checkbox" value="Вторичка" name="building_status[]">
<h6>Количество комнат</h6>
<input type="checkbox" value="1" name="property_rooms[]">
<input type="checkbox" value="2" name="property_rooms[]">
<input type="checkbox" value="3" name="property_rooms[]">
</form>
как было указано в документации, добавил в вызов снипета параметр 'hashParams' => 'building_status,property_rooms',
Но фильтрация не работает.Подскажите, что я упустил?
Комментарии: 9
Нашел что я упустил, а упустил банальное.
В плагине на событие я не поставил галочку.
А еще не правильно формировал запрос для поиска.
Вот запрос если кому пригодиться.
В плагине на событие я не поставил галочку.
А еще не правильно формировал запрос для поиска.
Вот запрос если кому пригодиться.
switch ($modx->event->name) {
case 'OnBeforePageRender':
if ($_REQUEST['building_status']){
$SendIt->params['where']['building_status:IN'] = $_REQUEST['building_status'];
}
if ($_REQUEST['property_rooms']){
$SendIt->params['where']['property_rooms:IN'] = $_REQUEST['property_rooms'];
}
break;
}
Но теперь задача, как сделать сортировку результатов ответа, по цене и по другим параметрам, так как кнопки для сортировок находятся отдельно от тега )) кнопки для сортировок находятся отдельно от тегаПочему кнопки? Сортировка это обычно выпадающий список, можно ещё переключателями сделать. И список и переключатели поддерживают атрибут form, а у SendIt есть атрибут data-si-event, которому можно задать значение change
Дело в том, что у меня есть отдельный sidebar в котором находится список параметров для фильтрации.
И именно этот sidebar обернут в form. А сортировка находиться совсем в другом месте, и если я его оборачиваю в отдельный form, то соответственно сортировка перебивает уже используемые параметры фильтра. А как сделать что бы сортировка работала так же уже с отфильтрованным результатом?
И именно этот sidebar обернут в form. А сортировка находиться совсем в другом месте, и если я его оборачиваю в отдельный form, то соответственно сортировка перебивает уже используемые параметры фильтра. А как сделать что бы сортировка работала так же уже с отфильтрованным результатом?
если я его оборачиваю в отдельный formЭто же не логично, сортировка должна работать вместе с остальными параметрами фильтрации. Я же сказал используй атрибут form для полей отвечающих за сортировку. Например так
<aside>
<form action="#" id="searchForm" data-si-form data-si-preset="pagination-search" data-si-event="change">
<h6>Тип</h6>
<input type="checkbox" value="Новостройка" name="building_status[]">
<input type="checkbox" value="Вторичка" name="building_status[]">
<h6>Количество комнат</h6>
<input type="checkbox" value="1" name="property_rooms[]">
<input type="checkbox" value="2" name="property_rooms[]">
<input type="checkbox" value="3" name="property_rooms[]">
</form>
</aside>
<select form="searchForm" data-si-form data-si-event="change">
<option value="price|ASC">Сначала дешевые</option>
<option value="price|DESC">Сначала дорогие</option>
</select>
Не совсем корректно работает данный вариант.
Почему то, что когда я меняю чекбокс в форме, в консоле я вижу, что он находит «select» которому я дал name=«sort_by» и отправляет на сервер выбранное значение, но когда я меняю саму сортировку, то на сервер не отправляется ранее выбранные чекбоксы из формы, на сервер отправляется только сортировка.
Почему то, что когда я меняю чекбокс в форме, в консоле я вижу, что он находит «select» которому я дал name=«sort_by» и отправляет на сервер выбранное значение, но когда я меняю саму сортировку, то на сервер не отправляется ранее выбранные чекбоксы из формы, на сервер отправляется только сортировка.
Методом тыка просто убрал
Это правильно? Или всё же в будущем чревато проблемами?
И скажите, а возможно ли сделать так, что бы параметры фильтрации, так же как и пагинация, появлялась в УРЛ сайта?
data-si-form data-si-event="change"
и в итоге стало вот так<select name="sort_by" form="searchForm" >
<option value="price|ASC">Сначала дешевые</option>
<option value="price|DESC">Сначала дорогие</option>
</select>
и только после этого заработало. Это правильно? Или всё же в будущем чревато проблемами?
И скажите, а возможно ли сделать так, что бы параметры фильтрации, так же как и пагинация, появлялась в УРЛ сайта?
Методом тыка просто убралПравильно сделал, проблем не будет.
возможно ли сделать так, что бы параметры фильтрации, так же как и пагинация, появлялась в УРЛ сайта?Конечно. Посмотри как добавление параметров пагинации сделано и добавь свой обработчик на событие si:send:success, который будет добавлять параметры
@Артур Шевченко Помогите пожалуйста, никак не могу понять с этой фильтрацией по множественным параметрам.
1) По какой то причине когда я нахожусь на какой либо странице по пагинации (например на пятой page=5), и нажимаю на параметр для фильтрации, он фильтрует, но почему не сбрасывает пагинацию, а подгружает последнюю страницу результатов поиска и в УРЛ тоже показывает последнюю страницу (например страницу?page=2). Но так же заметил в консоли, что по какой-то причине он добавляет параметр offset. Из за которой он пропускает какие то страницы и выдаёт сообщение о пустом результате поиска.
2) Я использую в вызове снипета параметр "'hashParams' => 'building_status,property_rooms'," я так предполагал что этот параметр помогает при фильтрации так же в УРЛ автоматически записывать GET запросы фильтрации, так же как и пагинации. Я ошибаюсь?
Если ошибаюсь можете подсказать каким образом можно сделать так, что бы параметры фильтров тоже в УРЛ появлялись?
1) По какой то причине когда я нахожусь на какой либо странице по пагинации (например на пятой page=5), и нажимаю на параметр для фильтрации, он фильтрует, но почему не сбрасывает пагинацию, а подгружает последнюю страницу результатов поиска и в УРЛ тоже показывает последнюю страницу (например страницу?page=2). Но так же заметил в консоли, что по какой-то причине он добавляет параметр offset. Из за которой он пропускает какие то страницы и выдаёт сообщение о пустом результате поиска.
2) Я использую в вызове снипета параметр "'hashParams' => 'building_status,property_rooms'," я так предполагал что этот параметр помогает при фильтрации так же в УРЛ автоматически записывать GET запросы фильтрации, так же как и пагинации. Я ошибаюсь?
Если ошибаюсь можете подсказать каким образом можно сделать так, что бы параметры фильтров тоже в УРЛ появлялись?
Для того, чтобы понимать изменились ли параметры фильтрации или нет должны соблюдаться следующие условия
1. Нужно указать ключи всех изменяемых параметров в параметре hashParams, включая обязательные 'pagination,limit,presetName'
2. Все изменяемые параметры нужно всегда передавать в сниппет Pagination либо через POST, либо через плагин на событие OnBeforePageRender
1. Нужно указать ключи всех изменяемых параметров в параметре hashParams, включая обязательные 'pagination,limit,presetName'
2. Все изменяемые параметры нужно всегда передавать в сниппет Pagination либо через POST, либо через плагин на событие OnBeforePageRender
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.