AJAX фильтр без перезагрузки страницы

InstantCMS 2.X

AJAX фильтр без перезагрузки страницы

#1 16 сентября 2023 в 13:53

Всем мира
подскажите можно ли как то вообще реализовать такое — AJAX фильтр без перезагрузки страницы
суть вопроса, — список контента, там я сделал кнопку возле каждого item и при нажатии в массив заносится id этой записи, потом при нажатии lheujq кнопки этот массив методом POST отправляется на нужную страницу (то есть на эту страницу мне нужно отправить id только определенных записей), но так как записей много нужно фильтровать и конечно при фильтрации страница обновляется и мой массив скидывается в первоначальное состояние, как победить эту проблему ?

#2 16 сентября 2023 в 14:49

потом при нажатии lheujq кнопки этот массив методом POST отправляется

No Name

А почему не методом AJAX?

#3 16 сентября 2023 в 14:56

Можно поподробнее) если поменять метод передачи, это как то повлияет на то что бы массив при фильтрации не обнуляется? 

#4 16 сентября 2023 в 16:13

Когда вы отправляете данные методом AJAX, страница не обновляется, не изменяется и соответсвенно, ничего с вашим массивом не произойдет.

#5 16 сентября 2023 в 16:39

Мой массив обнуляется когда фильтрую данные по кнопке фильтра, а не когда отправляю запрос, в самом начале об этом писал

#6 16 сентября 2023 в 17:52

Если вы хотите, чтобы массив не обнулялся при переходе на другие страницы сайта, то пишите этот массив в сессии или в куках.

#7 17 сентября 2023 в 11:45

вот суть проблемы
есть файл шаблона, \templates\modern\content\default_list_person_in_perens.tpl.php
там выводится список работников  из типа контента работники, в этом файле при нажатии на кнопку «добавить в список» напротив каждого работника — id этого работника заносится в массив и кнопка возле работника меняется на галочку (типа добавлен — при нажатии на галочку вновь появляется надпись добавить и из массива работник удаляется), так же появляется кнопка сбоку сформировать список и при нажатии на эту кнопку method=«post» через скрипт массив с id улетает на страницу list_person.tpl.php (это шаблон виджета и этот виджет выведен на определенной странице сайта и там выводится список именно выделенных работников)
всё работает хорошо, но есть проблемы которые не могу решить:
1. так как работников много то используется стандартный фильтр и конечно при фильтрации массив обнуляется (видимо нужно как то через сессии сохранять этот массив)
2. хотелось бы вывести выделенных уже работников на самой странице где выделяем, что бы визуально было видно кто уже выделен

хотел код вставить в кнопку кода тут но что то вереска форума поехала и написало мне Слишком длинное значение (макс. длина: 65535) ошибка ))))


вот ФАЙЛ default_list_person_in_perens.tpl.php

<script>
 var arr = [];
 var butt_form = document.getElementsByClassName('my_no_botoon');
</script>


<?php
  
if( $ctype['options']['list_show_filter'] ) {
    $this->renderAsset('ui/filter-panel', [
        'css_prefix'   => $ctype['name'],
        'page_url'     => $page_url,
        'fields'       => $fields,
        'props_fields' => $props_fields,
        'props'        => $props,
        'filters'      => $filters,
        'ext_hidden_params' => $ext_hidden_params,
        'is_expanded'  => $ctype['options']['list_expand_filter']
    ]);
}
?>
<?php if (!$items){ ?>
 
    <p class=«alert alert-info mt-4 alert-list-empty»>
        <?php if(!empty($ctype['labels']['many'])){ ?>
            <?php echo sprintf(LANG_TARGET_LIST_EMPTY, $ctype['labels']['many']); ?>
        <?php } else { ?>
            <?php echo LANG_LIST_EMPTY; ?>
        <?php } ?>
    </p>
<?php return; } ?>


<?php $first_item = reset($items); ?>
<div class=«container»>
 <div class=«row»>
   <div class=«col-sm h-100 sticky-top order-2 order-sm-2 order-lg-2»>
 <!--  кнопка сформировать список  start --> 
<div style=«text-align:right;display:none;» class=«my_no_botoon»> 
 <form name=«send_mass_sotrud» method=«post» target="_blank" action="/list-person.html"> 
      <input type=hidden name='mass_list_sutrudnik' id=«id_input_form» value="">   
      <input type=«submit» value=«Сформировать документы» class=«btn btn-secondary»>
 </form> 
</div>
<?php 
var_dump(); 
?>
</div>
<!--  кнопка сформировать список end  -->


<div class=«col-sm-12 col-md-9 order-2 order-sm-2 order-lg-1»>
 
<div class=«content_list table <?php echo $ctype['name']; ?>_list table-responsive-md»>
    <table class=«table table-hover»>        
        <tbody>
        <?php foreach($items as $item){ ?> 
            <tr>
            <?php foreach($item['fields_names'] as $_field){ ?>
            <?php if ($_field['name'] != 'parent_company_id'){ ?>
                <td class=«align-middle field ft_<?php echo $_field['type']; ?> f_<?php echo $_field['name']; ?><?php if ($_field['label_pos'] === 'none') { ?> d-none d-lg-table-cell<?php } ?>»>
                    <?php if (!isset($item['fields'][$_field['name']])) { continue; } ?>
                    <?php $field = $item['fields'][$_field['name']]; ?>
                    <?php if ($field['name'] === 'title' && $ctype['options']['item_on']){ ?>
                        <h3 class=«h5 m-0»>                  
 <span class=«d-none d-md-inline-block»><?php html_svg_icon('solid', 'user'); ?></span>  
                        <a href="<?php echo href_to($ctype['name'], $item['slug'].'.html'); ?>">
                            <?php echo $item['lastname'] ;?>
 <?php html($item[$field['name']]); ?>
 <?php echo $item['surname'] ;?>
                        </a>
                        </h3>
                    <?php } else { ?>
 
                    <?php } ?>
                </td><?php } ?>
            <?php } ?>
            <?php if (!empty($item['info_bar'])){ ?>
                <td class=«align-middle d-none d-lg-table-cell»>
                    <div class=«info_bar»>
                        <?php foreach($item['info_bar'] as $bar){ ?>
                            <div class=«bar_item <?php echo !empty($bar['css'])? $bar['css']: ''; ?>» title="<?php html(!empty($bar['title'])? $bar['title']: ''); ?>">
                                <?php if (!empty($bar['icon'])){ ?>
                                    <?php html_svg_icon('solid', $bar['icon']); ?>
                                <?php } ?>
                                <?php if (!empty($bar['href'])){ ?>
                                    <a class=«stretched-link» href="<?php echo $bar['href']; ?>">
                                        <?php echo $bar['html']; ?>
                                    </a>
                                <?php } else { ?>
                                    <?php echo $bar['html']; ?>
                                <?php } ?>
                            </div>
                        <?php } ?>
                    </div>
                </td>
<!--    показываем кнопку добавить в список если есть сотрудники --> 
 <?php if (count($items) > 0) { ?>
 <td style=«width: 200px;text-align: center;»>
 <a href="#" id=«person_add<?php html($item['id']); ?>»>
 Добавить в список
 </a>
 </td>
 <?php } ?>
<!--    показываем кнопку добавить в список если есть сотрудники --> 
 
<script> 
 document.getElementById('person_add<?php html($item['id']); ?>').addEventListener('click', function (event) {
    event.preventDefault(); //отключает переход по ссылке
 
 if(this.innerHTML == '<?php html_svg_icon('solid', 'check'); ?>'){
 
 arr.forEach((item, index, array) => { 
  
 if (item == <?php html($item['id']); ?>) {arr.splice(index, 1);} // удаляем текущий id из массива
 if(arr.length == 0){butt_form[0].classList.remove(«d-block»);} //скрываем кнопку если массив пустой
 });


 console.log(arr); 
 this.innerHTML = 'Добавить в список';
 } else { 
 
 butt_form[0].classList.add(«d-block»); // показываем кнопку формирования документа
 arr.splice(0, 0, <?php html($item['id']); ?>); // добавляем текущий id в массив
 console.log(arr);
 //<?php $_SESSION['my_arr_new'] = html($item['id']); ?>
 //var sess = <?php echo $_SESSION['my_arr_new']; ?>;
 //console.log(sess);
 
    this.innerHTML = '<?php html_svg_icon('solid', 'check'); ?>';
 console.log(arr);
 var json_upload = JSON.stringify({arr});
 console.log(json_upload); 
 }
 
   // Получаем элемент input
      const myVarInput = document.getElementById('id_input_form');


      // Устанавливаем значение
   var json_upload2 = JSON.stringify({arr});
      myVarInput.value = json_upload2;


      // Отправляем форму на сервер
     // document.querySelector('form').submit;   
 
})


</script> 
            <?php } ?>
            </tr> 
        <?php } ?>
        </tbody>
    </table> 


<script>
   
</script>


</div>


</div>
<?php echo html_pagebar($page, $perpage, $total, $page_url, $filter_query); ?>

вот файл list_person.tpl.php

<?php
 //echo $_SESSION['my_arr_new'];
 echo '------------<br>';
 $list_sotrudnik = cmsCore::getModel('content')->getContentItems('person');
 $mass_list_sutrudnik = $_POST['mass_list_sutrudnik'];
 $decoded_json = json_decode($mass_list_sutrudnik, true); 
 //var_dump($decoded_json); 
 foreach ($decoded_json['arr'] as $value) {      
  echo $list_sotrudnik[$value]['title'];
  echo ' ';
  echo $list_sotrudnik[$value]['lastname'];
  echo '<br>';
 }
?> 
#8 17 сентября 2023 в 16:14

Вам надо сохранять выбранных пользователей в localstorage

localStorage.setItem(«тут_название_ключа_в_localStorage», JSON.stringify(тут_ваш_массив));

а перед отправкой данные брать из  localStorage
тут_ваш_массив = JSON.parse(localStorage.getItem(«тут_название_ключа_в_localStorage»));

#9 18 сентября 2023 в 13:25

 Loadырь, большое спасибо, внедряю в код, пока что всё получается ))

#10 21 сентября 2023 в 14:10

 Loadырь, рано радовался, на локалке на компе всё работает, а как перенёс на хостинг перестало работать ошибки посыпались, думаю проблема в том что мой сайт на поддомене, можно как то работать с localStorage на поддомене ?

#11 21 сентября 2023 в 14:14

localStorage — это ваш браузер, а не ваш сайт и уж тем более домены/поддомены. Яваскрипт устроен так, что если есть хоть одна ошибка, весь остальной код выполняться не будет. Поэтому гуглите значение ваших ошибок и устраняйте их. Возможно проблема не в этом файле кода, а в других.

#12 21 сентября 2023 в 15:32

код один и тот же )) понять не могу но на локалке всё работает а на хостинге ошибки — Uncaught SyntaxError: Unexpected token 'var'

Добавлено спустя 54 минуты

вроде разобрался, но просто интересно почему на локалке работало )))

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.