<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"  href="/xslt/final.xslt"?><html>
  <head>
    <title>Codeigniter Blog. Step5: Пейджер - листалка - pagination</title>
    <meta name="css" content=""/>
    <meta name="js" content=""/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="id" content="8"/>
    <link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml"/>
  </head>
  <body>
    <div class="main">
      <div class="wrap">
        <div class="L">
          <h1><a href="/">..</a> / Codeigniter Blog. Step5: Пейджер - листалка - pagination</h1>
          <ol class="tags big">
            <li>
              <a href="/codeigniter-blog">codeigniter-blog</a>
            </li>
          </ol>
          <div class="myContent"><p>Полученный на <a href="/article/7">предыдущих шагах</a> скрипт блога , но блог выводит все записи на одну страницу. Когда записей будет несколько десятков грузиться будет долго. Необходимо добавить листалку - пейджер, чтобы на странице выводилось не больше 10-20 записей и упорядочить вывод записей от более новых к более старым.</p>
<h2>1.</h2>
<p>Добавим несколько десятков записей в блог. Чтобы это было легко и просто, добавим в контроллер администрирования  /system/application/controller/admin.php тестовую функцию, которая сделает это за нас</p>
<p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">  function record_add_test()  /* Заполнение тестовыми записями*/
  {
            for ($i=1;$i&lt;50;$i++)
                  $this-&gt;  db-&gt;  insert('records',array('title'=&gt;  'TITLE #'.$i,'body'=&gt;  '#'.$i.' Lorem ipsum dolor'));
            for ($i=1;$i&lt;50;$i++) 
                  $this-&gt;  db-&gt;  insert('comments',array('record_id'=&gt;  1,'author'=&gt;  'NAME #'.$i,'body'=&gt;  '#'.$i.'quis autem'));
            redirect('');  //  редирект в начало
  }</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
</p>
<p>запустим ее, вызвав в броузере: http://ci/admin/record_add_test. Главное - потом эту функцию ликвидировать, чтобы случайно не загадить рабочий блог тестовыми записями.</p>
<h2>2.</h2>
<p>Одна из приятностей CodeIgniter, то что в нем  листалка-пейджер уже есть и нужно только ее подключить. Для этого используется предусмотрена <a href="#" title="codeigniter.com/user_guide/libraries/pagination.html" rel="nofollow" class="external">специальная библиотека</a>, которую необходимо подключить в конфигурационном файле.<br/>
Ее необходимо зарегистрировать в файле автоподгрузке /system/application/config/autoload.php <br/>
Находим в этом файле строку <br/>
$autoload['libraries'] = array('database');  <br/>
заменяем ее на <br/>
$autoload['libraries'] = array('database','pagination');  </p>
<h2>3.</h2>
<p>Добавляем эту библиотеку в конструкторе контроллера блога /system/application/controller/blog.php</p>
<p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">     function Blog()
     {
       parent::Controller();
       $this-&gt;  load-&gt;  helper('url');
       $this-&gt;  load-&gt;  helper('form');
       $this-&gt;  load-&gt;  library('session');
       $this-&gt;  load-&gt;  library('pagination'); // Бибилотека пейджера
      }</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
</p>
<p>4. Там же дорабатываем функцию вывода записей блога:</p>
<p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">     function index()
     {     
        $config['base_url'] = 'http://ci/blog/index/'; // путь к страницам в пейджере
        $config['total_rows'] = $this-&gt;  db-&gt;  count_all('records'); // всего записей
        $config['per_page'] =  10;   // количество записей на странице
        $config['num_links'] = 5;    // количество ссылок в пейджере (точнее N/2)
        $config['uri_segment'] = 3;  // указываем где в URL номер страницы
        $this-&gt;  pagination-&gt;  initialize($config);
        $data['pager']=$this-&gt;  pagination-&gt;  create_links();
        $data['query']=$this-&gt;  db-&gt;  get('records');
        $this-&gt;  load-&gt;  view('blog_view',$data);
     }</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
</p>
<h2>5.</h2>
<p>Во вьюер блога  /system/application/views/blog_view.php. добавляем строку, отвечающую за вывод пейджера</p>
<p>echo  "&lt;div class='pager'&gt;  ".$pager."&lt;/div&gt;  ";  </p>
<p>вызываем в броузере блог http://ci/ и проверяем результат. Пейджер есть, но в блог вываливается вся куча записей.</p>
<h2>6.</h2>
<p>Связываем пейджер с выдачей и устанавливаем порядок следования записей - от более поздних к более ранним. Для этого дорабатываем  функцию index() контроллера блога /system/application/controller/blog.php Вносим в нее условия отбора записей.</p>
<p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">     function index()
     {
         .......................................................................................
         .......................................................................................
         $this-&gt;  pagination-&gt;  initialize($config);
         $data['pager']=$this-&gt;  pagination-&gt;  create_links();
         .......................................................................................
         .......................................................................................
         $from=intval($this-&gt;  uri-&gt;  segment(3)); // выделяем из URL номер первой записи на странице
         $this-&gt;  db-&gt;  limit(10,$from); // устанавливаем количество записей на странице
         $this-&gt;  db-&gt;  orderby("id", "desc"); // устанавливаем порядок следования записей
        $data['query']=$this-&gt;  db-&gt;  get('records');
        $this-&gt;  load-&gt;  view('blog_view',$data);
     }</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
</p>
<p>вызываем в броузере блог http://ci/ и проверяем результат.</p>
<p>Здесь как и раньше  обращение к MySQL идет не напрямую, а через библиотеку  <a href="#" title="codeigniter.com/user_guide/database/active_record.html" rel="nofollow" class="external">Active Record</a>. Если не нравится, Codeigniter позволяет писать запросы к БД <a href="#" title="codeigniter.com/user_guide/database/queries.html" rel="nofollow" class="external">как есть</a>, используя синтаксис SQL. </p>
<h2>7.</h2>
<p>Все что сделано сохраняется в директории  <a href="/doc/step-by-step.zip">step5</a></p></div>
          <ol class="tags big">
            <li class="date">2007-09-03</li>
            <li>
              <a href="/codeigniter-blog">codeigniter-blog</a>
            </li>
          </ol>
          <ol class="see"/>
          <ul class="comment">
            <li id="a31" title="a0">
              <a name="Wave" title="" rel="27.02.08"/>
              <div>Я бы рекомендовал в конфигурации к листалке пользоваться той $config["base_url"], которая в config.php прописана. Тогда при переезде на другой домен надо будет всего лишь в одном месте поправить всё.</div>
            </li>
            <li id="a70" title="a31">
              <a name="Le capitaine Nemo" title="" rel="03.09.08"/>
              <div>Я бы советовал вообще не применять base_url, а плясать от корня. В этом случае при переезде на другой домен вообще ничего не надо поправлять.</div>
            </li>
            <li id="a260" title="a0">
              <a name="Balvardo" title="balvardo.ru" rel="22.03.09"/>
              <div>Большое спасибо вам за туториал. У меня возник вопрос. с этой "step" у вас подключен css. И доступ к ним из вьювера выглядит как /css/... т.е. вы не указываете полный путь к файлу. Каким образом это реализовано? Заранее спасибо.</div>
            </li>
            <li id="a344" title="a260">
              <a name="&#x414;&#x438;&#x43C;&#x430;" title="" rel="05.10.09"/>
              <div>Указан путь к файлу относительно корня "/css/.."</div>
            </li>
            <li id="a350" title="a0">
              <a name="Ad1ce" title="sablog.ru" rel="25.10.09"/>
              <div>$config['base_url'] = '<a title="http://ci/blog/index/'" rel="nofollow" class="external" href="#">ссылка</a>  ; // путь к страницам в пейджере<br/>Можно ли убрать из линка слово index?</div>
            </li>
            <li id="a363" title="a70">
              <a name="&#x410;&#x433;&#x435;&#x441;&#x441;&#x430;" title="" rel="16.11.09"/>
              <div>пупиздна, а что если ты захочеш в будущем в поддиректории установить скрипт? я херею над такими ответами..</div>
            </li>
            <li id="a407" title="a0">
              <a name="GTAlex" title="blog.gtalex.ru/" rel="16.12.09"/>
              <div>а как из контроллера правильно обратиться к $config["base_url"] той что в конфиге прописана ?</div>
            </li>
            <li id="a408" title="a0">
              <a name="GTAlex" title="blog.gtalex.ru/" rel="16.12.09"/>
              <div>ещё - у меня листалка без &gt;, т.е. ссылки "первая запись" и "последняя"</div>
            </li>
            <li id="a409" title="a407">
              <a name="Le capitaine Nemo" title="" rel="16.12.09"/>
              <div>Х.З. я всегда предпочитал абсолютную адресацию. При относительной обязательно где-то появится прокол.</div>
            </li>
            <li id="a410" title="a408">
              <a name="Le capitaine Nemo" title="" rel="16.12.09"/>
              <div>Читайте мануал к библиотек pager code-igniter.ru/user_guide/libraries/pagination.html. Там куча настроек. Я даже не знаю зачем их столько.</div>
            </li>
            <li id="a563" title="a0">
              <a name="Le capitaine Nemo" title="" rel="11.10.10"/>
              <div>Подскажите пожалуйста, как можно сделать в url ссылки выступали не количеством записей, а номерами страниц?. Перелапатил весь класс, немогу разобраться..</div>
            </li>
            <li id="a569" title="a0">
              <a name="eSender" title="rumasters.net" rel="31.10.10"/>
              <div>$config['total_rows'] = $this-&gt;db-&gt;count_all('status');<br/>А что если мне надо из таблицы посчитать не все записи, а только с каким то условием, например где category='mode'? Как такое можно сделать?<br/>P.S. Пробывал так:<br/>$this-&gt;db-&gt;query('SELECT COUNT() и т.д.');<br/>Но тут же вылазит ошибка, что нужна числовая переменная. Преобразовать в числовую не удается. Буду благодарен за помощь.</div>
            </li>
            <li id="a579" title="a569">
              <a name="&#x42E;&#x440;&#x438;&#x439;" title="" rel="17.12.10"/>
              <div>Что мешает сделать свою функцию в моделе блога ?</div>
            </li>
            <li id="a586" title="a70">
              <a name="&#x418;&#x43B;&#x44C;&#x44F;" title="" rel="04.01.11"/>
              <div>Нельзя, потом скрипт будет глючить в поддиректррии</div>
            </li>
            <li id="a598" title="a0">
              <a name="Stas" title="" rel="07.02.11"/>
              <div>В последней версии CI 2.0 метод orderby заменили на order_by.</div>
            </li>
            <li id="a605" title="a0">
              <a name="Mac" title="" rel="05.04.11"/>
              <div>А правильно ли делать запросы в базу из контроллера? Вроде как это лучше делать из модели?</div>
            </li>
            <li id="a607" title="a605">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="05.04.11"/>
              <div>Конечно неправильно. Но для быстрого старта вполне сойдет. В этом разделе есть еще одна статья где показано как правильно. Но и она устарела вместе с CodeIgniter. Сегодня я бы начинал не с него, а ,например, с YII. И вам того желаю.</div>
            </li>
            <li id="a683" title="a0">
              <a name="&#x41C;&#x430;&#x43A;&#x441;&#x438;&#x43C; &#x41F;&#x435;&#x440;&#x435;&#x43F;&#x435;&#x43B;&#x438;&#x446;&#x430;" title="" rel="22.01.12"/>
              <div>Пользуюсь этим фреймворком уже несколько лет. Удобная справка и вообще хорошо документирован.<br/>Кстати, появилось руководство пользователя на русском для версии 2.0.0<br/><u class="external" title="codeigniter.su">http://codeigniter.su</u></div>
            </li>
          </ul>
        </div>
      </div>
      <div class="R">
        <a href="/" title="&#x41D;&#x430; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x443;&#x44E;"/>
      </div>
    </div>
    <div id="li"/>
  </body>
</html>

