@Kristina8787

Почему дублируется пустая таблица?

Здравствуйте. Делала сортировку в таблице, по имени,эмэйл либо статусу , сортировка работает, но, при срабатывании сортировки, почему то ,под таблицу которая вставляется методом html в div, внутри которого лежит таблица ,дублируется еще и сама страница, на которой этот div расположен, т.е. вместо замены содержимого div у меня в этот div вставляется моя таблица отсортированная,а за ней следом вся страница в этот же div, вот как это выглядит в коде
5f4e5b5083a6f964216494.png

а вот так на самом сайте

5f4e5be7d008d986491394.png

вот запрос которым делаю вставку

$(document).ready(function(){
       $(document).on('click', '.column-sort', function(){
           let column_name = $(this).attr("id");
           let order = $(this).data("order");
           let arrow = '';
           // glyphicon glyphicon-arrow-up
           // glyphicon glyphicon-arrow-down
           if(order == 'desc'){
               arrow = '&nbsp;<i class="fas fa-angle-down"></i>';
           }else{
               arrow = '&nbsp;<i class="fas fa-angle-up"></i>';
           }
           $.ajax({
               url:"/app/sort",
               method:"POST",
               data:{column_name:column_name, order:order},
               success:function(data)
               {
                   $('#task-table').html(data);
                   $('#'+column_name+'').append(arrow);
               }
           })

       });
    });


вот код который вставляется по этому запросу

public function sortAction()
    {
        Db::instance();

        $output = '';
        $order = $_POST['order'];
        if($order == 'desc'){
            $order = 'asc';
        }else{
            $order = 'desc';
        }

        $result = \R::findAll('tasks',"ORDER BY {$_POST['column_name']} {$_POST['order']} ");

        $output .= '
<table class="table table-bordered">
        <thead>
        <tr>
            <th scope="col"><a class="column-sort" id="user_name" data-order="' .$order. '" href="#" >Имя пользователя</a></th>
            <th scope="col"><a class="column-sort" id="user_email" data-order="' .$order.'" href="#" >Email пользователя</a></th>
            <th scope="col">Текст задачи</th>
            <th scope="col">Редактировалось модератором</th>
            <th scope="col"><a class="column-sort" id="done" data-order="' .$order. '" href="#" >Выполнено</a></th>
        </tr>
        </thead>
        <tbody>
';
        foreach ($result as $task):
            $output .= '
            <tr>
                <th class="task" scope="row">'.$task['user_name'].'</th>
                <td class="task" >'.$task['user_email'].'</td>
                <td class="task" >'.$task['task_text'].'</td>
                <td class="task" >'.$task['edit'].'</td>
                <td class="task" >'.$task['done'].'</td>
            </tr>
            ';

        endforeach;
        $output .='</tbody>';
        $output .='</table>';

        echo $output;
    }


помогите разобраться как это безобразие исправить, и бонусом такой вопрос еще встал, у меня пагинация стоит если фильтрации нет, немного не могу сообразить как мне вот такую пагинацию в html код оформить для $output

<?php if($page != 1): ?>
    <a class="page" href="/app/index?page=<?php echo $prev; ?>" ><<</a>
<?php endif; ?>
<?php for ($i = 1; $i <= $countPages; $i++): ?>
    <?php if($page == $i): ?>
        <a class="page active" href="/app/index?page=<?php echo $i; ?>"><?php echo $i; ?></a>
    <?php else: ?>
        <a class="page" href="/app/index?page=<?php echo $i; ?>"><?php echo $i; ?></a>
    <?php endif; ?>
<?php endfor; ?>
<?php if($page != $countPages): ?>
    <a class="page" href="/app/index?page=<?php echo $next; ?>">>></a>
<?php endif; ?>
  • Вопрос задан
  • 49 просмотров
Решения вопроса 1
GennadyS
@GennadyS
Программист, философ
А каким фреймворком пользуетесь? Очень похоже на то, что возвращается HTML с макетом всей страницы. Кстати, если уж пользуетесь JS / Ajax, почему бы не использовать какой-то движок таблицы? Например, datatables.net (тяжеловат, но можно найти аналоги легче). Другой вариант, использовать что-нибудь вроде vue, хотя все это займет время. Ajax-таблицы позволят разгрузить вывод, ведь можно будет вернуть json.

С пагинацией, первое, просто переписать в духе того, как формируется таблица:
$pagination = '';
if ($page != 1) {
    $pagination .= "<a class=\"page\" href=\"/app/index?page={$prev}\"></a>";
}
// ...

Ну или начать использовать шаблонизатор, например (но подозреваю, что он уже есть, т.к. что-то тащит за собой весь макет (layout) страницы).

ЗЫ так же событие клика может происходить дважды, попробуйте в инструментах разработчика (ctrl + shift + i), поставить точку остановки на строке 'let column_name = '.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы