Prosty Blog - Stronicowanie Newsów
14 July 2008
Comments
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);
}
<?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);
}
}
$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
Comment article