Пользовательская сортировка таблиц не работает правильно

0

Я создаю таблицу данных, которая имеет сортируемые ссылки, но когда я нажимаю на ссылку, скажу "имя пользователя", если я нажму на это несколько раз, это заставит URL-адрес иметь пример asc: http://localhost/riwakawebsitedesigns-website/admin/users/status/ascascascascascascasc это должно быть просто

Сортировка Asc http://localhost/riwakawebsitedesigns-website/admin/users/status/asc

И затем, если щелкнуть снова и так далее.

Сортировка Desc http://localhost/riwakawebsitedesigns-website/admin/users/status/desc

Вот как выглядит http://localhost/riwakawebsitedesigns-website/admin/users/1 в URL- http://localhost/riwakawebsitedesigns-website/admin/users/1

Я не могу понять, почему каждый раз, когда я нажимаю на ссылку в заголовке таблицы, он создает так много asc и т.д. Как я могу это исправить.

Что не так с кодом сортировки. Пагинация работает отлично. Пожалуйста, обратите внимание, что у меня есть кодная кодировка, но не по душе.

<?php

class Users extends MX_Controller {

public function index() {
    $this->getList();
}

public function getList() {
    $this->load->library('paginations');

    $sort_segment = $this->uri->segment(3);

    if (isset($sort_segment)) {
        $sort = $sort_segment;
    } else {
        $sort = 'username';
    }

    $order_segment = $this->uri->segment(3);

    if (isset($order_segment)) {
        $order = $order_segment;
    } else {
        $order = 'asc';
    }

    $page_segment = $this->uri->segment(4);

    if (isset($page_segment)) {
        $page = $page_segment;
    } else {
        $page = 1;
    }

    $url = '';

    if (isset($sort_segment)) {
        $url .= $sort_segment;
    }

    if (isset($order_segment)) {
        $url .= $order_segment;
    }

    if (isset($page_segment)) {
        $url .= $page_segment;
    }

    $data['title'] = "Users";

    $this->load->model('admin/user/model_user');

    $admin_limit = "1";

    $filter_data = array(
        'sort'  => $sort,
        'order' => $order,
        'start' => ($page - 1) * $admin_limit,
        'limit' => $admin_limit
    );

    $user_total = $this->model_user->getTotalUsers();

    $results = $this->model_user->getUsers($filter_data);

    foreach ($results as $result) {
        $data['users'][] = array(
            'user_id' => $result['user_id'],
            'username' => $result['username'],
            'date_added' => $result['date_added'],
            'edit' => site_url('admin/users/edit' .'/'. $result['user_id'])
        );
    }

    $url = '';

    if ($order == 'asc') {
        $url .= 'desc';
    } else {
        $url .= 'asc';
    }

    if (isset($page_segment)) {
        $url .= $page_segment;
    }

    $data['sort_username'] = site_url('admin/users' .'/'. 'username' .'/'. $url);
    $data['sort_status'] = site_url('admin/users' .'/'. 'status' .'/'. $url);
    $data['sort_date_added'] = site_url('admin/users' .'/'. 'date_added' .'/'. $url);

    $url = '';

    if (isset($sort_segment)) {
        $url .= $sort_segment;
    }

    if (isset($order_segment)) {
        $url .= $order_segment;
    }

    $paginations = new Paginations();
    $paginations->total = $user_total;
    $paginations->page = $page;
    $paginations->limit = "1";
    $paginations->url = site_url('admin/users' .'/'. $url .'/'. '{page}');

    $data['pagination'] = $paginations->render();

    $paginations_lang = "Showing %d to %d of %d (%d Pages)";

    $data['results'] = sprintf($paginations_lang, ($user_total) ? (($page - 1) * $admin_limit) + 1 : 0, ((($page - 1) * $admin_limit) > ($user_total - $admin_limit)) ? $user_total : ((($page - 1) * $admin_limit) + $admin_limit), $user_total, ceil($user_total / $admin_limit));

    $data['sort'] = $sort;
    $data['order'] = $order;

    $this->load->view('template/user/users_list.tpl', $data);
}
}

Моя библиотека

<?php

class Paginations {
public $total = 0;
public $page = 1;
public $limit = 20;
public $num_links = 8;
public $url = '';
public $text_first = '|&lt;';
public $text_last = '&gt;|';
public $text_next = '&gt;';
public $text_prev = '&lt;';

public function render() {
    $total = $this->total;

    if ($this->page < 1) {
        $page = 1;
    } else {
        $page = $this->page;
    }

    if (!(int)$this->limit) {
        $limit = 10;
    } else {
        $limit = $this->limit;
    }

    $num_links = $this->num_links;
    $num_pages = ceil($total / $limit);

    $this->url = str_replace('%7Bpage%7D', '{page}', $this->url);

    $output = '<ul class="pagination">';

    if ($page > 1) {
        $output .= '<li><a href="' . str_replace('{page}', 1, $this->url) . '">' . $this->text_first . '</a></li>';
        $output .= '<li><a href="' . str_replace('{page}', $page - 1, $this->url) . '">' . $this->text_prev . '</a></li>';
    }

    if ($num_pages > 1) {
        if ($num_pages <= $num_links) {
            $start = 1;
            $end = $num_pages;
        } else {
            $start = $page - floor($num_links / 2);
            $end = $page + floor($num_links / 2);

            if ($start < 1) {
                $end += abs($start) + 1;
                $start = 1;
            }

            if ($end > $num_pages) {
                $start -= ($end - $num_pages);
                $end = $num_pages;
            }
        }

        for ($i = $start; $i <= $end; $i++) {
            if ($page == $i) {
                $output .= '<li class="active"><span>' . $i . '</span></li>';
            } else {
                $output .= '<li><a href="' . str_replace('{page}', $i, $this->url) . '">' . $i . '</a></li>';
            }
        }
    }

    if ($page < $num_pages) {
        $output .= '<li><a href="' . str_replace('{page}', $page + 1, $this->url) . '">' . $this->text_next . '</a></li>';
        $output .= '<li><a href="' . str_replace('{page}', $num_pages, $this->url) . '">' . $this->text_last . '</a></li>';
    }

    $output .= '</ul>';

    if ($num_pages > 1) {
        return $output;
    } else {
        return '';
    }
}
}
  • 1
    Как $sort_segment и $order_segment могут происходить из одного и того же сегмента uri?
  • 1
    $url построен неправильно, смотрите комментарии: pastebin.com/0VRhTL9M
Показать ещё 1 комментарий
Теги:
codeigniter

1 ответ

1
Лучший ответ

Большое спасибо @AdrienXL, который дал мне представление о проблеме.

Теперь я исправил это. Я удвоил свою страницу и сортировал и заказывал $ _GET. Итак, теперь я только что использовал сегменты uri и удалил удвоенный код и изменил пару вещей в модели

Для людей, которые не хотят использовать класс разбивки на код.

Вы можете использовать мой пример:

Мои пользователи:

<?php

class Users extends MX_Controller {

public function index() {
    $this->load->library('paginations');
    $this->load->model('admin/user/model_user');
    // Sort

    if (null !==($this->uri->segment(3))) {
        $sort = $this->uri->segment(3);
    } else {
        $sort = 'username';
    }

    // Order

    if (null !==($this->uri->segment(4))) {
        $order = $this->uri->segment(4);
    } else {
        $order = 'asc';
    }

    // Page

    if (null !==($this->uri->segment(3))) {
        $page = $this->uri->segment(3);
    } else {
        $page = 1;
    }

    $url = '';

    // Sort

    if (null !==($this->uri->segment(3))) {
        $url .= $this->uri->segment(3);
    }

    // Order

    if (null !==($this->uri->segment(4))) {
        $url .= $this->uri->segment(4);
    }

    // Page Number

    if (null !==($this->uri->segment(3))) {
        $url .= $this->uri->segment(3);
    }

    $admin_limit = "1";

    $filter_data = array(
        'sort'  => $sort,
        'order' => $order,
        'start' => ($page - 1) * $admin_limit,
        'limit' => $admin_limit
    );

    $user_total = $this->model_user->getTotalUsers();

    $results = $this->model_user->getUsers($filter_data);

    foreach ($results as $result) {
        $data['users'][] = array(
            'user_id'    => $result['user_id'],
            'username'   => $result['username'],
            'status'     => ($result['status'] ? "Enabled" : "Disabled"),
            'date_added' => date(strtotime($result['date_added'])),
            'edit'       => site_url('admin/users/edit' .'/'. $result['user_id'] . $url)
        );
    }

    $url = '';

    if ($order == 'asc') {
        $url .= 'desc';
    } else {
        $url .= 'asc';
    }

    $data['sort_username'] = site_url('admin/users' .'/'.  'username' .'/'. $url);
    $data['sort_status'] = site_url('admin/users' .'/'. 'status' .'/'. $url);
    $data['sort_date_added'] = site_url('admin/users' .'/'. 'date_added' .'/'. $url);

    $url = '';

    $paginations = new Paginations();
    $paginations->total = $user_total;
    $paginations->page = $page;
    $paginations->limit = $admin_limit;
    $paginations->url = site_url('admin/users' .'/'. $url . '{page}');

    $data['pagination'] = $paginations->render();

    $paginations_lang = "Showing %d to %d of %d (%d Pages)";

    $data['results'] = sprintf($paginations_lang, ($user_total) ? (($page - 1) * $admin_limit) + 1 : 0, ((($page - 1) * $admin_limit) > ($user_total - $admin_limit)) ? $user_total : ((($page - 1) * $admin_limit) + $admin_limit), $user_total, ceil($user_total / $admin_limit));

    $data['sort'] = $sort;
    $data['order'] = $order;

    $this->load->view('template/user/users_list.tpl', $data);

}

}

Мой взгляд

<div class="table-responsive">
<table  class="table table-striped table-bordered table-hover">
    <thead>
    <tr>    
    <td class="text-left"><?php if ($sort == 'username') { ?>
    <a href="<?php echo $sort_username; ?>" class="<?php echo strtolower($order); ?>">Username</a>
    <?php } else { ?>
    <a href="<?php echo $sort_username; ?>">Username</a>
    <?php } ?></td>
    <td class="text-left"><?php if ($sort == 'status') { ?>
    <a href="<?php echo $sort_status; ?>" class="<?php echo strtolower($order); ?>">Status</a>
    <?php } else { ?>
    <a href="<?php echo $sort_status; ?>">Status</a>
    <?php } ?></td>
    <td class="text-left"><?php if ($sort == 'date_added') { ?>
    <a href="<?php echo $sort_date_added; ?>" class="<?php echo strtolower($order); ?>"> Date Added</a>
    <?php } else { ?>
    <a href="<?php echo $sort_date_added; ?>">Date Added</a>
    <?php } ?></td>
    <td class="text-right">Action</td>
    </tr>
    </thead>
    <tbody>
    <?php foreach ($users as $user) { ?> 
        <tr>
            <td><?php echo $user['username'];?></td>
            <td><?php echo $user['status'];?></td>
            <td><?php echo $user['date_added'];?></td>
            <td><a href="<?php echo $user['edit'];?>">Edit</td>
        </tr>
    <?php } ?>
    </tbody>
</table>
<div class="row">
<div class="col-sm-6 text-left"><?php echo $pagination; ?></div>
<div class="col-sm-6 text-right"><?php echo $results; ?></div>
</div>
</div>

Функция модели

public function getUsers($data = array()) {
    $sql = "SELECT * FROM '" . $this->db->dbprefix . "user'";

    $sort_data = array(
        'username',
        'status',
        'date_added'
    );

    if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
        $sql .= " ORDER BY " . $data['sort'];
    } else {
        $sql .= " ORDER BY username";
    }

    if (isset($data['order']) && ($data['order'] == 'desc')) {
        $sql .= " desc";
    } else {
        $sql .= " asc";
    }

    if (isset($data['start']) || isset($data['limit'])) {
        if ($data['start'] < 0) {
            $data['start'] = 0;
        }

        if ($data['limit'] < 1) {
            $data['limit'] = 20;
        }

        $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
    }

    $query = $this->db->query($sql);

    return $query->result_array();
 }

Маршруты:

$route['admin/users'] = "admin/user/users/index"; 
$route['admin/users/edit/(:any)'] = "admin/user/users/edit/$1";
$route['admin/users/(:any)'] = "admin/user/users/index/$1"; 
$route['admin/users/(:any)/(:any)/(:any)'] = "admin/user/users/index/$1/$2/$3";

Пользовательская библиотека

<?php

class Paginations {
public $total = 0;
public $page = 1;
public $limit = 20;
public $num_links = 8;
public $url = '';
public $text_first = '|&lt;';
public $text_last = '&gt;|';
public $text_next = '&gt;';
public $text_prev = '&lt;';

public function render() {
    $total = $this->total;

    if ($this->page < 1) {
        $page = 1;
    } else {
        $page = $this->page;
    }

    if (!(int)$this->limit) {
        $limit = 10;
    } else {
        $limit = $this->limit;
    }

    $num_links = $this->num_links;
    $num_pages = ceil($total / $limit);

    $this->url = str_replace('%7Bpage%7D', '{page}', $this->url);

    $output = '<ul class="pagination">';

    if ($page > 1) {
        $output .= '<li><a href="' . str_replace('{page}', 1, $this->url) . '">' . $this->text_first . '</a></li>';
        $output .= '<li><a href="' . str_replace('{page}', $page - 1, $this->url) . '">' . $this->text_prev . '</a></li>';
    }

    if ($num_pages > 1) {
        if ($num_pages <= $num_links) {
            $start = 1;
            $end = $num_pages;
        } else {
            $start = $page - floor($num_links / 2);
            $end = $page + floor($num_links / 2);

            if ($start < 1) {
                $end += abs($start) + 1;
                $start = 1;
            }

            if ($end > $num_pages) {
                $start -= ($end - $num_pages);
                $end = $num_pages;
            }
        }

        for ($i = $start; $i <= $end; $i++) {
            if ($page == $i) {
                $output .= '<li class="active"><span>' . $i . '</span></li>';
            } else {
                $output .= '<li><a href="' . str_replace('{page}', $i, $this->url) . '">' . $i . '</a></li>';
            }
        }
    }

    if ($page < $num_pages) {
        $output .= '<li><a href="' . str_replace('{page}', $page + 1, $this->url) . '">' . $this->text_next . '</a></li>';
        $output .= '<li><a href="' . str_replace('{page}', $num_pages, $this->url) . '">' . $this->text_last . '</a></li>';
    }

    $output .= '</ul>';

    if ($num_pages > 1) {
        return $output;
    } else {
        return '';
    }
}
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню