2012-01-28 16 views
5

Moja funkcja kontroleraPagination nie poprawne numery stron wyświetlacz CodeIgniter

function test($start_from = 0) 
{ 
    $this->load->library('pagination'); 

    $data = array(); 

    $per_page = 3; 
    $total = $this->activity_model->count_by(); 

    $config['base_url'] = base_url() . 'test'; 
    $config['total_rows'] = $total; 
    $config['per_page'] = $per_page; 
    $config['uri_segment'] = 2; 
    $config['num_links'] = 2; 
    $config['use_page_numbers'] = TRUE; 

    $data['follow'] = $this->activity_model->get($per_page, $start_from); 

    $this->pagination->initialize($config); 

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

    $this->load->view('front_end/test' ,$data); 
} 

moja droga:

$route['test'] = "user_activity/test"; 
$route['test/(:any)'] = "user_activity/test/$1"; 

model:

function get($limit,$start_from) 
{ 
$sql = "SELECT * FROM user_follow LIMIT $start_from, $limit"; 

    $query = $this->db->query($sql); 
    return $query->result_array(); 
} 

Problem jest, że mam paginacji 1,2, 3,4,5 .... a na każdej stronie wyświetlam 3 przedmioty. Chcę to zrobić w url to pokazać moje numery stron 1,2,3,4,5

Kiedy klikam drugi URL strony Pokaż 3 Kiedy klikam trzeci URL strony Pokaż 6 i tak dalej +3

czy to możliwe, spędzam godziny szukając porady w Internecie, ale nic, jak rozumiem [kod] $ config ['use_page_numbers'] = TRUE; [/ code] rób to, czego potrzebuję, ale w moim przypadku to nadal nie działa.

Może możesz wskazać dowolną bibliotekę?

Odpowiedz

7

Wprowadź następujące zmiany w klasie stronicowania (/system/libraries/Pagination.php), aby używać numerów stron zamiast przesunięć.

OLD (linie 146-153):

if ($CI->uri->segment($this->uri_segment) != 0) 
{ 
    $this->cur_page = $CI->uri->segment($this->uri_segment); 

    // Prep the current page - no funny business! 
    $this->cur_page = (int) $this->cur_page; 
} 

NOWOŚĆ:

Dodaj „inny” opcja if-oświadczenie, aby upewnić się domyślnym jest; page = 1.

if ($CI->uri->segment($this->uri_segment) != 0) 
{ 
    $this->cur_page = $CI->uri->segment($this->uri_segment); 

    // Prep the current page - no funny business! 
    $this->cur_page = (int) $this->cur_page; 
} 
else 
{ 
    $this->cur_page = 1; 
} 

OLD (linia 175):

$this->cur_page = floor(($this->cur_page/$this->per_page) + 1); 

NOWOŚĆ:

prostu skomentuj tę linię tak aktualna strona przestrzega kontroler/URI.

//$this->cur_page = floor(($this->cur_page/$this->per_page) + 1); 

OLD (linia 206):

$i = $uri_page_number - $this->per_page; 

NOWOŚĆ:

Poprzednia strona powinna być zawsze aktualna strona odejmowane przez 1.

$i = $uri_page_number - 1; 

OLD (Linia 230):

if ($this->cur_page == $loop) 

NOWOŚĆ:

URI brakuje stronicowania należy uznać strona 1.

if ($this->cur_page == $loop || ($this->cur_page == 1 && $this->cur_page == $loop)) 

OLD (linia 238-247):

if ($n == '' && $this->first_url != '') 
{ 
    $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$loop.'</a>'.$this->num_tag_close; 
} 
else 
{ 
    $n = ($n == '') ? '' : $this->prefix.$n.$this->suffix; 

    $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close; 
} 

NOWOŚĆ:

Page URL powinny używać numerów stron, a nie przesunięć.

if ($n == '' && $this->first_url != '') 
{ 
    $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$loop.'">'.$loop.'</a>'.$this->num_tag_close; 
} 
else 
{ 
    $n = ($n == '') ? '' : $this->prefix.$n.$this->suffix; 

    $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$loop.'">'.$loop.'</a>'.$this->num_tag_close; 
} 

OLD (linia 256):

$output .= $this->next_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.($this->cur_page * $this->per_page).$this->suffix.'">'.$this->next_link.'</a>'.$this->next_tag_close; 

NOWOŚĆ:

Następna strona powinna być zawsze sumą bieżącej strony i 1.

$output .= $this->next_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.($this->cur_page + 1).$this->suffix.'">'.$this->next_link.'</a>'.$this->next_tag_close; 

OLD (linia 262):

$i = (($num_pages * $this->per_page) - $this->per_page); 

NOWOŚĆ:

Ostatnia strona powinna być całkowita liczba stron.

$i = $num_pages; 

Zamień wszystkie stare linie na nowe. Przed zmianą upewnij się, że wykonałeś kopię zapasową pliku.

Nadzieja to pomaga :)

EDIT:

Musisz zaktualizować test funkcji kontrolera jak:

function test($start_from = 0) 
{ 
    $this->load->library('pagination'); 

    $data = array(); 

    $per_page = 3; 
    $total = $this->activity_model->count_by(); 

    $config['base_url'] = base_url() . 'test'; 
    $config['total_rows'] = $total; 
    $config['per_page'] = $per_page; 
    $config['uri_segment'] = 2; 
    $config['num_links'] = 2; 
    $config['use_page_numbers'] = TRUE; 

    $start = $per_page * ($start_from-1); 

    $data['follow'] = $this->activity_model->get($per_page, $start); 

    $this->pagination->initialize($config); 

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

    $this->load->view('front_end/test' ,$data); 
} 

Tutaj dodałem nową zmienną $ rozpoczęcia który $per_page * ($start_from-1) . Teraz przekaż ten $ start jako argument do modelu.

Co to jest pomnożyć liczbę elementów na stronie z bieżącym numerem strony (-1) .To znaczy, jeśli pozycji na stronie 10 i jesteś na drugiej stronie $start = 10 *(2-1) co daje 10. Więc twój wynik będzie zacząć od 10,20 a więc jeden

Nadzieja to pomaga :)

+0

będzie to idź do CodeIgniter 2.0.3? Mimo wszystko dziękuję ! – Viktors

+0

Pojawią się drobne zmiany w numerach linii. W każdy sposób spróbuj. Mój jest starą wersją. Daj mi znać, czy to działa :) – Sabari

+0

Czy to działa dla Ciebie? – Sabari

11

udało mi się to zrobić bez modyfikowania klasy. Najlepszym sposobem jest zrobienie kopii klasy stronicowania, wprowadzenie zmian i użycie jej. W ten sposób, jeśli zaktualizujesz CI, nie utracisz modyfikacji. Oto moje rozwiązanie bez modyfikowania klasy.

Najpierw chcę powiedzieć, że użycie tylko opcji konfiguracyjnej $config['use_page_numbers'] = TRUE spowoduje również problem, ale nie do końca. Rzeczy, o których dowiedziałem się, że nie działają przy użyciu tylko tej opcji, są następujące:
jeśli spróbujesz ręcznie edytować strony paska adresu URL, traktuje je jak przesunięcie, a nie jak strony, a także jeśli spróbujesz wrócić ze strony 2 do strony 1, używając link "prev" traktuje również numer strony jak przesunięcie.

Kod:

$config['base_url'] = base_url('my/url/page'); 
$config['total_rows'] = count($this->my_model->get_all()); 
$config['per_page'] = 2; 
$config['use_page_numbers'] = TRUE;  
$config['uri_segment'] = 4; 

//i'm looading the pagination in the constuctor so just init here 
$this->pagination->initialize($config); 

if($this->uri->segment(4) > 0) 
    $offset = ($this->uri->segment(4) + 0)*$config['per_page'] - $config['per_page']; 
else 
    $offset = $this->uri->segment(4); 
//you should modify the method in the model to accept limit and offset or make another function - your choice  
$data['my_data'] = $this->my_model->get_all($config['per_page'], $offset); 

ten sposób
strona = false (mój/url) lub (mój/url/strona) - w zasadzie jeśli segment uri 4-cia jest fałszywa,
page = 0 (moje/url/page/0),
i
page = 1 (mój/url/strona/1)

będzie wszystko wyświetlić pierwszą stronę, a następnie pozostałe linki będą pracować w porządku. Sprawdzam również stronę np. - jeśli ktoś chce wejść (mój/URL/strona/2323) spowoduje to błąd iw modelu należy sprawdzić, czy wynik jest fałszywy i czy to kontroler powinien pokazać błąd strona lub coś takiego. Mam nadzieję że to pomoże.

+0

ten jeden rozwiązał mój problem tnx – Ramje

0

Można uniknąć błędów php, jeśli ktoś ręcznie wpisując numer strony z adresem URL:

na przykład mojego/url/strona/786 Twój wynik może nie mieć nic do wyświetlenia dla zapytania 786, domyślnie pokaże php error..to tego uniknąć można użyć:

if (isset($result)) { 
    $isArray = is_array($result) ? "YES" : "NO"; //check that result is an array or not as per your requirement. 
    if ($isArray == "YES") { 
    echo "show your stuffs here.."; 
    } 
    else{ 
    echo "display your message instead for php error here.."; 
    } 
} 

nadzieję, że to pomaga ... dla zapytania tweet mnie na Twitterze @sufiyantech

Powiązane problemy