Filtrace se stránkováním Ajaxem
- darthcz
- Člen | 113
Dobrý den,
chtěl bych vás požádat o pomoc s vytvořením filtrace včetně stránkování nad daty z databáze. Chtěl bych to dělat ajaxem. Co se týče filtrace, nemám problém. Problém nastává, pokud chci ve filtrovaných datech stránkovat. Chtěl jsem to vyřešit tak, že komponentu visual paginator budu také odesílat ajaxově spolu s filtračními daty, nicméně komponenta se nepřekresluje. Když kliknu na číslo se stránkou, zmizí.
<script>
//po kliknuti na filtraci filtrujeme ajaxem
$("#filter, .paginator a").click(function(){
var datefrom = $('#datefrom').val();
var dateto = $('#dateto').val();
$.post({plink filter! web_id => $web_id}, { 'datefrom': datefrom, 'dateto': dateto });
return false;
});
</script>
<?php
public function createComponentVp(){
// create visual paginator control
return new VisualPaginator;
}
//handle pro filtraci analyz klicovych slov
public function handleFilter($web_id = null){
try {
if (!isset($web_id))
throw new LogicException('Nebyl předán parametr web_id funkce Analyzy:handleFilter!');
//ziskam filtracni parametry
$filter = array();
$filter['datefrom'] = $this->getParam('datefrom');
$filter['dateto'] = $this->getParam('dateto');
$vp = $this['vp'];
$paginator = $vp->getPaginator();
$count = 5;
$paginator->itemCount = $count;
$paginator->itemsPerPage = 10;
$this->keywords = self::$model->getKeywords($web_id, $filter, $paginator->itemsPerPage, $paginator->offset);
//pokud byl pozadavek vyvolan ajaxem
if ($this->isAjax()){
//prekreslim zpravy o uspesnosti
$this->invalidateControl('analysis');
//prekreslim zpravy o uspesnosti
$this->invalidateControl('pagin');
}
} catch (LogicException $e){
Debug::log($e, Debug::ERROR);
$this->flashMessage('Došlo k vnitřní chybě programu! Prosíme, zkuste to později.');
$this->redirect('Customers:show');
} catch (ErrorException $e){
$this->flashMessage($e->getMessage());
$this->redirect("Customers:show");
}
}
public function actionKeywordsResults($web_id = NULL){
$this->web_id = $web_id;
try {
if (!isset($web_id))
throw new LogicException('Nebyl předán parametr web_id funkce Analyzy:actionKeywordsResults!');
$vp = $this['vp'];
$paginator = $vp->getPaginator();
$count = self::$model->getKeywordsCount($web_id);
$paginator->itemCount = $count;
$paginator->itemsPerPage = 10;
$this->keywords = self::$model->getKeywords($web_id, null, $paginator->itemsPerPage, $paginator->offset);
//pokud byl pozadavek vyvolan ajaxem
if ($this->isAjax()){
//prekreslim zpravy o uspesnosti
$this->invalidateControl('analysis');
//prekreslim zpravy o uspesnosti
$this->invalidateControl('pagin');
}
} catch (LogicException $e){
Debug::log($e, Debug::ERROR);
$this->flashMessage('Došlo k vnitřní chybě programu! Prosíme, zkuste to později.');
$this->redirect('Customers:show');
} catch (ErrorException $e){
$this->flashMessage($e->getMessage());
$this->redirect("Customers:show");
}
}
public function renderKeywordsResults($web_id = NULL){
//zjistim aktualni prvni pozice, abych mohl vytahnout url - je vsude stejna
$pozice = key((array)$this->keywords);
$pozice2 = key((array) $this->keywords[$pozice]);
$this->template->classes = $this->classes;
$this->template->url = $this->keywords[$pozice][$pozice2]['url'];
$this->template->firma = $this->keywords[$pozice][$pozice2]['firma'];
$this->template->keywords = $this->keywords;
$this->template->web_id = $this->web_id;
}
?>
<?php
//uryvek ze sablony
{snippet pagin}
{control vp}
{/snippet}
{snippet analysis}
tabulky s daty ...
{/snippet}
?>
- darthcz
- Člen | 113
Po trošce ladění jsem zjistil, že pokud zavedu volání uvedené níže,
překreslení stránkování proběhne v pořádku. Pokud ale pošlu ajax
postem request na handle, stránkovač zmizí – jeho snippet má hodnotu
\n\n.
Nevíte, co s tím?
<script>
$("a.ajax, .paginator a").live("click", function (event) {
event.preventDefault();
$.get(this.href);
});
</script>
- darthcz
- Člen | 113
Tak jsem to nakonec vyřešil. Problém je v mém špatném návrhu. Prali se mi inicializace stránkovače. Pokud to nešlo přes handle, tak se inicializovalo pouze v action. Pokud to přes handle šlo, tak se to inicializovalo v action i v handle (filtrační parametry řeším právě dosazováním jiných hodnot do funkcí v action a handle). Vyřešil jsem to podmínkou isAjax, avšak není to moc hezké řešení. Stránkovač mizel, protože měl špatné informace o tom, na jaké stránce je.