создать JQuery нумерацию страниц? - PullRequest
0 голосов
/ 14 августа 2011

Мне нужно реализовать jQuery нумерацию страниц в CodeIgniter .

Я прочитал несколько сообщений на форуме CodeIgniter и Пример / руководство по разбиению на страницы AJAX CodeIgniter . Люди на форуме CI предлагают использовать решение из блога TOHIN , но я не могу понять, как это можно сделать. Может ли кто-нибудь дать мне пример ?

Кроме того, кто-то может объяснить, что $this->load->model('model') означает здесь .

Мой код:

function show() 
    {
    $this->load->library('Jquery_pagination');

        $this->admin_model->header();

        $this->load->library('pagination');

        $config['base_url'] = 'show';
        $config['total_rows'] = '200';
        $config['per_page'] = '2'; 
        $this->pagination->initialize($config); 
        $data['pagination'] = $this->pagination->create_links();

        $data['query_select'] = $this->db->query('SELECT @rownum:=@rownum+1 rownum, t.* FROM (SELECT @rownum:=0) r, hotel_submits t order by id desc');

        $this->load->view('admin/accommodation_submit_show', $data);   
    }

С уважением

1 Ответ

1 голос
/ 14 августа 2011

Код, который вы просматриваете на форумах Codeigniter, использует прогрессивное улучшение.Это означает, что код работает так же хорошо без javascript (хотя и с обновлением страницы).

Итак, первый шаг для вас - заставить свою работу разбивать на страницы с отключенным javascript, и тогда вы будетевозможность добавлять функциональность AJAX.

Теперь, нумерация страниц работает так, что вы используете SQL LIMIT в своем запросе, чтобы ограничить результаты для каждого запроса.LIMIT принимает 2 значения, смещение и сумму следующим образом: если вы хотите отобразить 2 строки на странице, вы запросите базу данных с помощью LIMIT 0, 2.Это значит «начать с первого ряда и дать мне всего 2 ряда».Затем для следующей страницы вы выполняете запрос с помощью LIMIT 2, 2, что означает «начать с третьей строки (2 - третья строка - это индекс с нуля) и дать мне всего 2 строки».

Вы будете делать это с каждым запросом, так что следующий запрос будет иметь LIMIT 4, 2, и так далее, и так далее.Как видите, единственное, что меняется от одного запроса к следующему, - это смещение (с какой строки следует начинать запрос).

Теперь, как работает класс разбиения на страницы Codeigniter, это то, что он помещаетсмещение каждой страницы в ссылках, которые она генерирует с $this->pagination->create_links().Куда идет смещение?Это определяется $config['uri_segment'], но по умолчанию установлено значение 3. Поскольку вы не предоставили полный код, я не знаю, как называется ваш контроллер.Давайте предположим, что это называется hotels.Итак, вы должны установить $config['base_url'] = 'hotels/show';.Как видите, ваш первый сегмент URI равен hotels, второй - show, а третий будет смещением, которое сгенерировал для вас класс Pagination.

Как добратьсяэто смещение?Я рад, что ты спросил.Просто взяв аргумент show, Codeigniter передаст ему 3-й сегмент URI.Таким образом, мы получаем следующее:

function show($offset = 0) 
{
    $this->load->library('pagination');

    $config['base_url'] = 'hotels/show'; // Change this to your controller name
    $config['total_rows'] = '200'; // In reality, this should be the actual number of rows in your table
    $config['per_page'] = '2'; 

    $this->pagination->initialize($config); 
    $data['pagination'] = $this->pagination->create_links();

    $offset = (int) $offset; // just to make sure nothing funky gets in here
    $data['query_select'] = $this->db->query("SELECT @rownum:=@rownum+1 rownum, t.* ".
        "FROM (SELECT @rownum:=0) r, hotel_submits t ".
        "ORDER BY id desc LIMIT $offset, 2");
    // I just split it into lines so that SO doesn't make you scroll too much :-)

    $this->load->view('admin/accommodation_submit_show', $data);   
}

Теперь ваши ссылки на страницы должны работать так, как объявлено, но они будут полностью обновлять страницу.Чтобы обойти это, сделайте следующее:

$(function() {
    // Assuming your pagination links
    // are in a div with ID of pagination,
    // and that you want to paginate a table with ID of paginate
    $('#pagination a').live('click', function() {
        $.get( $(this).attr('href'), function(html) {

            $('table#paginate').replaceWith( $(html).find('table#paginate') );
            $('#pagination').replaceWith( $(html).find('#pagination') );
        });
        return false;
    });
});

Все это должно работать.Тем не менее, мы можем улучшить это.В текущем состоянии кода мы получаем html для полной страницы с каждым кликом и просто отфильтровываем то, что нам нужно.Хотя это работает, нет необходимости отправлять столько дополнительной информации, которая не нужна.

То, что они делают на форумах там, - это создание другого контроллера, специально предназначенного для этих запросов ajax, так что он будетобслуживайте только соответствующий HTML-код таблицы и ничего более.

Если вам нужна помощь, сообщите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...