Sendit и Pagination

Всем добрый вечер.

Возникал задача сделать фильтрацию ресурсов по множественным значения. Взял в качестве решения 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',
Но фильтрация не работает.
Подскажите, что я упустил?
Ruslan
27 декабря 2024, 17:19
modx.pro
3 375
0

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

Ruslan
28 декабря 2024, 11:06
0
Нашел что я упустил, а упустил банальное.
В плагине на событие я не поставил галочку.
А еще не правильно формировал запрос для поиска.
Вот запрос если кому пригодиться.

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;
}
Но теперь задача, как сделать сортировку результатов ответа, по цене и по другим параметрам, так как кнопки для сортировок находятся отдельно от тега ))
    Артур Шевченко
    28 декабря 2024, 20:17
    0
    кнопки для сортировок находятся отдельно от тега
    Почему кнопки? Сортировка это обычно выпадающий список, можно ещё переключателями сделать. И список и переключатели поддерживают атрибут form, а у SendIt есть атрибут data-si-event, которому можно задать значение change
      Ruslan
      30 декабря 2024, 12:32
      0
      Дело в том, что у меня есть отдельный sidebar в котором находится список параметров для фильтрации.
      И именно этот sidebar обернут в form. А сортировка находиться совсем в другом месте, и если я его оборачиваю в отдельный form, то соответственно сортировка перебивает уже используемые параметры фильтра. А как сделать что бы сортировка работала так же уже с отфильтрованным результатом?
        Артур Шевченко
        30 декабря 2024, 20:33
        0
        если я его оборачиваю в отдельный 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>
          Ruslan
          02 января 2025, 16:54
          0
          Не совсем корректно работает данный вариант.
          Почему то, что когда я меняю чекбокс в форме, в консоле я вижу, что он находит «select» которому я дал name=«sort_by» и отправляет на сервер выбранное значение, но когда я меняю саму сортировку, то на сервер не отправляется ранее выбранные чекбоксы из формы, на сервер отправляется только сортировка.
            Ruslan
            04 января 2025, 17:18
            0
            Методом тыка просто убрал
            data-si-form data-si-event="change"
            и в итоге стало вот так
            <select name="sort_by"  form="searchForm" >
                <option value="price|ASC">Сначала дешевые</option>    
                <option value="price|DESC">Сначала дорогие</option>   
            </select>
            и только после этого заработало.
            Это правильно? Или всё же в будущем чревато проблемами?

            И скажите, а возможно ли сделать так, что бы параметры фильтрации, так же как и пагинация, появлялась в УРЛ сайта?
              Артур Шевченко
              Вчера в 11:57
              0
              Методом тыка просто убрал
              Правильно сделал, проблем не будет.

              возможно ли сделать так, что бы параметры фильтрации, так же как и пагинация, появлялась в УРЛ сайта?
              Конечно. Посмотри как добавление параметров пагинации сделано и добавь свой обработчик на событие si:send:success, который будет добавлять параметры
      Ruslan
      08 января 2025, 11:12
      0
      @Артур Шевченко Помогите пожалуйста, никак не могу понять с этой фильтрацией по множественным параметрам.

      1) По какой то причине когда я нахожусь на какой либо странице по пагинации (например на пятой page=5), и нажимаю на параметр для фильтрации, он фильтрует, но почему не сбрасывает пагинацию, а подгружает последнюю страницу результатов поиска и в УРЛ тоже показывает последнюю страницу (например страницу?page=2). Но так же заметил в консоли, что по какой-то причине он добавляет параметр offset. Из за которой он пропускает какие то страницы и выдаёт сообщение о пустом результате поиска.

      2) Я использую в вызове снипета параметр "'hashParams' => 'building_status,property_rooms'," я так предполагал что этот параметр помогает при фильтрации так же в УРЛ автоматически записывать GET запросы фильтрации, так же как и пагинации. Я ошибаюсь?
      Если ошибаюсь можете подсказать каким образом можно сделать так, что бы параметры фильтров тоже в УРЛ появлялись?
        Артур Шевченко
        Вчера в 12:10
        0
        Для того, чтобы понимать изменились ли параметры фильтрации или нет должны соблюдаться следующие условия
        1. Нужно указать ключи всех изменяемых параметров в параметре hashParams, включая обязательные 'pagination,limit,presetName'
        2. Все изменяемые параметры нужно всегда передавать в сниппет Pagination либо через POST, либо через плагин на событие OnBeforePageRender
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        9