Filtrace se stránkováním Ajaxem

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
darthcz
Člen | 113
+
0
-

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
+
0
-

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
+
0
-

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.

joe
Člen | 313
+
0
-

Nějak tam nevidím, že by paginator měl pak fungovat na již vyfiltrovaných stránkách. Nepoužíváš pro filtrování formulář nebo z čeho získáváš ty data pro filtrování? Metody pro komponenty by měly být protected.