Otóż - mam stronę, na której chcę wyświetlić pewną ilość rekordów. Strona ma się wyświetlić raz, natomiast kolejne porcje rekordów chcę pobierać w tle. Tworząc to proceduralnie mam zawartość "porcji" rekordów razem z kodem, który je pobiera w osobnym inkludzie. Próbując zrobić to w FW wymyśliłem sobie 2 osobne akcje kontrolera - główna (index()) podczas odczytywania strony wywołuje drugą akcję, odpowiedzialną za pobranie określonej porcji rekordów (nazwałem ją best()).
Poniższy kontroler działa, ale mam wrażenie, że nie jest to całkowicie poprawnie zrobione, dlatego proszę o jakieś sugestie ze strony zaawansowanych "kohanowców".
Oczywiście nie patrzcie na sam pager, który jest tu wstawiony tylko roboczo.
Szczególnie mnie drażni ta sztuczka z zamianą nazwy akcji na linku (wówczas przy wyłączonym JS będzie wywoływać /index.php/ipeop/index/X a AJAX'em: /index.php/ipeop/best/X, czyli bezpośrednio akcję "best").
Poza tym rozpoznawanie, czy wywołanie jest zwykłe czy Ajaxowe też jest takie na siłę, bo nie bardzo wiem jak skorzystać z request::is_ajax() - pewnie trzeba jakimś helperem robić linki, ale czy da się wówczas korzystać z advAJAX? A nic więcej niż advAJAX nie jest mi potrzebne.
Kod
<?php defined('SYSPATH') or die ('None shall pass!');
class Ipeop_Controller extends Website_Controller {
//domyślna akcja
public function index($page=1) {
$this->template->header = new View('elements/header');
$this->template->header->title = 'Osoby!!';
$this->template->best_div = $this->best($page, FALSE);
}
//pobranie porcji rekordów
public function best($page=1, $render = TRUE) {
$best = new View('_best');
$best->title = 'Najlepsze osoby';
if ($render) {
$best->ajax = 1;
$this->auto_render = false;
}
$limit_start = ($page-1)*5;
$result = $this->db->query('select count(id_user) as c from nfv_active_users')->result(FALSE);
$n= $result[0]['c'];
$pages = $n / 5;
$osoby = $this->db->query('select * from nfv_active_users '.$limit_start.', 5');
$best->osoby = $osoby->result(FALSE);
$link = '<a onclick="advAJAX.get({url: this.href.replace(\'/index/\', \'/best/\'), tag: \'5best\'}); return false;" href="/index.php/ipeop/index/%d">%s</a>';
$pager = 'Ilość: '.$n.' ';
if ($page > 1) {
$pager .= sprintf($link, $page-1, '<<');
}
if ($page < $pages) {
$pager .= sprintf($link, $page+1, '>>');
}
$best->link = $pager;
return $best->render($render);
}
}
class Ipeop_Controller extends Website_Controller {
//domyślna akcja
public function index($page=1) {
$this->template->header = new View('elements/header');
$this->template->header->title = 'Osoby!!';
$this->template->best_div = $this->best($page, FALSE);
}
//pobranie porcji rekordów
public function best($page=1, $render = TRUE) {
$best = new View('_best');
$best->title = 'Najlepsze osoby';
if ($render) {
$best->ajax = 1;
$this->auto_render = false;
}
$limit_start = ($page-1)*5;
$result = $this->db->query('select count(id_user) as c from nfv_active_users')->result(FALSE);
$n= $result[0]['c'];
$pages = $n / 5;
$osoby = $this->db->query('select * from nfv_active_users '.$limit_start.', 5');
$best->osoby = $osoby->result(FALSE);
$link = '<a onclick="advAJAX.get({url: this.href.replace(\'/index/\', \'/best/\'), tag: \'5best\'}); return false;" href="/index.php/ipeop/index/%d">%s</a>';
$pager = 'Ilość: '.$n.' ';
if ($page > 1) {
$pager .= sprintf($link, $page-1, '<<');
}
if ($page < $pages) {
$pager .= sprintf($link, $page+1, '>>');
}
$best->link = $pager;
return $best->render($render);
}
}