RkBlog

Hardware, programming and astronomy tutorials and reviews.

Prosty Blog - Stronicowanie Newsów

Teraz zajmiemy się stronicowanie newsów. CodeIgniter posiada klasę o nazwie "Pagination" służącą do generowania linków stronicowania.

Teraz zajmiemy się stronicowanie newsów. Wyświetlanie 100 newsów na stronie głównej to niezbyt fajny pomysł. Code Igniter posiada klasę o nazwie "Pagination" służącą jedynie do generowania linków stronicowania. Będziemy musieli się wysilić.
Metoda index kontrolera Blog zmieniła się do postaci:
<?php
function index()
     {
     // ładujemy klasę stronicowania
     $this->load->library('pagination');
     // URL do tej metody
     $config['base_url'] = 'http://localhost/html/ci/index.php/blog/index';
     // Ile jest newsów?
     $news_count = $this->db->query("SELECT COUNT(*) AS ile FROM ".$this->db->dbprefix."news")->result_array();
     // klasa musi to wiedzieć
     $config['total_rows'] = $news_count[0]['ile'];
     // ile newsów pokazywać na stronie?
     $config['per_page'] = '5';
     // przypisanie konfiguracji
     $this->pagination->initialize($config);
 
     $this->load->model('News');
     $this->load->model('Comments');
     // model uległ pewnym modyfikacjom...
     $query = $this->News->get_news($this->uri->segment(3));
     $content = '';
     if ($query->num_rows() > 0)
           {
          foreach($query->result() as $item)
                    {
                    $q = $this->Comments->are_comments_for_news($item->news_id)->result_array();
                    $item->comments = $q[0]['comnumber'];
                    $content .= $this->load->view('news_loop', $item, True);
                    }
          }
     else
          {
          $content = '<h1>Brak newsów</h1>';
          }
     $this->response['content'] = $content;
     // pod newsami pojawią się linki stronicowania
     $this->response['content'] .= $this->pagination->create_links();
     $this->load->view('index', $this->response);
     }
Metoda get_news modelu News też uległa pewnym zmianom:
<?php
function get_news($offset = 'admin')
     {
     $this->db->orderby("news_id", "desc");
     IF(is_numeric($offset))
          {
          //strona z określonym stronicowaniem
          return $this->db->get('news', 5, $offset);
          }
     // panela admina - nie podajemy nic do get_news, wyświetl wszystko
     // bez stronicowania...
     elseIF($offset == 'admin')
          {
          return $this->db->get('news');
          }
     else
          {
          // strona główna, pierwsze 5 newsów
          return $this->db->get('news', 5);
          }
     }
I stronicowanie diała. Największa niejasność może być z metodą get_news. W metodzie index kontrolera przekazujemy jej
$this->uri->segment(3)
Które zwróci albo wartość danego segmentu linka (offset listowania) lub wartość logiczną "False" gdy element ten nie istnieje. Teraz w get_news jeżeli $offset ma wartość fałsz to zwracamy najnowsze 5 newsów (strona główna), jeżeli $offset ma wartość liczbową (z linków stronicowania) to wyświetlamy 5 newsów z odpowiednim offsetem.
W panelu admina też korzystamy z tej metody i tam też trzeba byłoby zastosować stronicowanie by mieć dostęp do wszystkich newsów. Inne rozwiązanie to stworzenie oddzielnej metody w modelu lub tak jak tutaj małe "oszustwo" :) Otóż w kodzie Panelu Admin nic nie przekazujemy do metody get_news. Jeżeli $offset będzie miało domyślną wartość to w panelu admina wartość ta nie zostanie nadpisana. Czyli jeżeli $offset ma wartość domyślną to pobierz wszystkie newsy :)
RkBlog

14 July 2008;

Comment article