Filtrování přes formulář + stránkování

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

Chcí se zeptat jak by jste řešili kdyz mám formulář, který filtruje výpisy.
Ale ty výpisy poté potřeboju vypisovat podle strankování, a kdyz ve strankování přejdu na ndalší stránku tak se mi zruší filtrované nastavení.
Jak můžu zajistit aby když přejdu na jinou stránku použilo se to staré filtrování?

ViPEr*CZ*
Člen | 813
+
0
-

Řešil bych to přes sessions, nebo bych si do parametru URL posílal nějaký json a s tím by pak počítalo stránkování.

vvoody
Člen | 910
+
0
-

Na filter aj strankovanie pouzi perzistentne parametry

Edit: predpokladam ze formular len podla zadanych parametrov redirectne s parametrami filtra

Editoval vvoody (22. 7. 2012 13:32)

jtousek
Člen | 951
+
0
-

Jak již bylo řečeno, buď session nebo perzistentní parametry, podle toho jestli chceš aby se měnila URL.

Filip Procházka
Moderator | 4668
+
+1
-

URL by měla reprezentovat stav aplikace. Pokud k tomu není hodně dobrý důvod, měl by jsi použít persistentní parametry.

Domki
Člen | 310
+
0
-

A šlo by to prosím nějak konkretneji jak použíz perzistentne parametry nebo session?

Já mam v presenteru sestaveni formulare, a pote metodu ktera pri uspesnem odeslani to spracuje a ulozi do globalních promennych danyho presenteru a tyto promeny predam do rendermetody a tam to predam do sablony kde to vypisu,
Zobrazeni vyfiltrovanych udaju mi funguje bez redirectu, kdyz sem ho pouzil tak se mi znovu nacetl formular a data bez pouziti toho filtru.

ViPEr*CZ*
Člen | 813
+
0
-

Vše je v dokumentaci. ;-) Globální proměnná danýho presenteru… co to je?

vvoody
Člen | 910
+
0
-

ViPErCZ: jeho property :)

Domki: pridaj pred ne anotaciu ako je tu a pri spracovani formulara redirectni s parametrami z formulara (nazov parametrov samozrejme zhodny s nazvom @persistent parametrov). A vlastne vypis uz upravovat nemusis kedze uz teraz sa ti filtruje z property presenteru.

edit: pointa je v tom ze tie property s anotaciou @persistent sa automaticky naplnia hodnotami z requestu cize z redirectu

Editoval vvoody (22. 7. 2012 15:37)

Domki
Člen | 310
+
0
-

ViPErCZ: nomslel sem jako promenou ne jen lokalni pro danou metodu ale celou tridu

vvoody:
Takto vypadá ten kód chápu dobre ze kdyz pred promenou napisu persistent tak se mi bude prenaset sama vsude?

Nic mene stale to nefunguje kdyz prejdu na dalsí stranku tak se mi zobrazujou opet vsechny polozky. Co jeste musím změnit?

class FullBikesPresenter extends BasePresenter {

	/** @persistent */
	public $items = 30;

	/** @persistent */
	public $sort = 'nase_cena ASC';

	/** @persistent */
	public $znackyFiltr;

	public $znacky;
	public $poleI;

	public function startup() {
		parent::startup();
		$i=0;
		foreach($this->context->createFullBikes()->select('DISTINCT znacka') as $znacka){
			$this->znacky[$i] = $znacka->znacka;
			$this->poleI[$i] = $i+1;
			$i++;
		}
		$this->znackyFiltr = $this->znacky;
	}

	protected function createComponentFullBikesForm() {
		$form = new Form();
		$form->addSelect('sort', "Řadit", array('cenaVzestupne' => 'Cena vzestupně', 'cenaSestupne' => 'Cena sestupně'))->setPrompt('- Vyberte typ řazení -')->setDefaultValue('cenaVzestupne')->addRule(Form::FILLED, 'Je nutné vybrat způsob řazení.');
		$form->addSelect('items', "Počet", array('15' => '15', '30' => '30', '60' => '60', '90' => '90'))->setDefaultValue('30');
		$i=1;
		foreach($this->context->createFullBikes()->select('DISTINCT znacka') as $znacka){
			$form->addCheckbox($i++, $znacka->znacka)->setDefaultValue('CHECKED');
		}
		$form->addSubmit('view', 'Zobrazit');
		$form->onSuccess[] = callback($this, 'fullBikesFormSubmited');
		return $form;
	}


	public function fullBikesFormSubmited(Form $form) {

		$this->items = $form->values->items;


		if($form->values->sort == 'cenaVzestupne')
			$this->sort = 'nase_cena ASC';
		elseif($form->values->sort == 'cenaSestupne')
			$this->sort = 'nase_cena DESC';


		$this->znackyFiltr = null;
		$j=0;
		for($i=1; $i<=count($this->poleI); $i++) {
			if($form->values->$i == 1) {
				$this->znackyFiltr[$j] = $this->znacky[$i-1];
				$j++;
			}
		}

	}

	public function renderFullBikes($page = 1)
	{
		$this->template->znacky = $this->poleI;
		$result = $this->context->createFullBikes()->where('znacka', $this->znackyFiltr);

		$paginator = new Nette\Utils\Paginator;
		$paginator->setItemCount(count($result)); // celkový počet položek (např. článků)
		$paginator->setItemsPerPage($this->items); // počet položek na stránce
		$paginator->setPage($page); // číslo aktuální stránky, číslováno od 1

		$this->template->pageNavigator = $paginator;

		$this->template->products = $this->context->createFullBikes()->where('znacka', $this->znackyFiltr)->order($this->sort)->limit($paginator->getLength(), $paginator->getOffset());
	}
}

a pak v šabloně odkaz na strankovani

{if !$pageNavigator->last}
<a n:href=„this, page=>$pageNavigator->page+1“>Další</a>
 {/if}

Editoval Domki (22. 7. 2012 15:52)

vvoody
Člen | 910
+
0
-

Vo funkcii fullBikesFormSubmited musis vykonat redirect s parametrami.

	public function fullBikesFormSubmited(Form $form) {
		....
        $args = array(
			'items'=>...,
			'sort'=>...,
			'znackyFiltr'=>...
		);
		$this->redirect('this',$args);
}

Teraz budes mat stav filtra v url tak ako strankovanie a pritom by malo strankovanie zachovavat filter.

Editoval vvoody (22. 7. 2012 16:12)

Domki
Člen | 310
+
0
-

Místo tech teček májí byt hodnoty z formulare na filtr?
Doplnil jsem toto, a vypisuje to chybu strpos() expects parameter 1 to be string, object given
nevadi ze v promene znackyFiltr mam pole?

//predani persistent parametru aby slo strankovani
		$args = array(
                'items'=> $this->items,
                'sort'=> $this->sort,
                'znackyFiltr'=> $this->znackyFiltr
        );
		$this->redirect($this, $args);
vvoody
Člen | 910
+
0
-

prvy parameter redirectu, chyba jasne pise ze tam ma byt string ako som napisal cize ‚this‘ alebo proste link kde mas dany vypis ktory chces filtrovat, this preto lebo predpokladam ze ho mas na tej istej stranke ako filtrovaci formular

vvoody
Člen | 910
+
0
-
$this->redirect($this, $args);

zmen na

$this->redirect('this', $args);

co to udela?

Domki
Člen | 310
+
0
-

Ted nachápu, první parametr určuje kam se přesměruje?

výpis i filr. formulář mam ve stejný sabloně.

Když sem zkusil přepsat redirect takto: $this->redirect(„FullBikes:fullbikes“, $args);
tak se chyba uz nevypisuje ale nefunguje ani filtr. formular, kdyz ho odeslu tak se nic nedeje a vrati se zpet default hodnoty

Domki
Člen | 310
+
0
-

kdyz tam dam ‚this‘ chybu uz to taky nevypisuje
ale porad kdyz odeslu formular s jinym filtrem tak se vypise stejne vypis, a formular se vrati do puvodniho stavu

Domki
Člen | 310
+
0
-

Tak řazení a počet položek už funguje i se strankovaním
ale ty znacky ete ne, a pak ty formulare ze se mi vraci do default to vyresím tím když jim pred directem dam hodnotu co byla odeslana ze?

vvoody
Člen | 910
+
0
-

Domki napsal(a):

Místo tech teček májí byt hodnoty z formulare na filtr?
Doplnil jsem toto, a vypisuje to chybu strpos() expects parameter 1 to be string, object given
nevadi ze v promene znackyFiltr mam pole?

//predani persistent parametru aby slo strankovani
		$args = array(
                'items'=> $this->items,
                'sort'=> $this->sort,
                'znackyFiltr'=> $this->znackyFiltr
        );
		$this->redirect($this, $args);

Aha teraz pozeram ako naplnas to pole args, samozrejme ze tam musis dat hodnoty z formulara, ako by to mohlo takto fungovat ked tie hodnoty z formulara zahodis.

Editoval vvoody (22. 7. 2012 16:54)

Domki
Člen | 310
+
0
-

vsak ale to dáváme ne
V tý samy metode
hned nad tímto kodem mám kod ktery ty data z formulare ulozi do techto promennych

tento kod

$this->items = $form->values->items;


                if($form->values->sort == 'cenaVzestupne')
                        $this->sort = 'nase_cena ASC';
                elseif($form->values->sort == 'cenaSestupne')
                        $this->sort = 'nase_cena DESC';


                $this->znackyFiltr = null;
                $j=0;
                for($i=1; $i<=count($this->poleI); $i++) {
                        if($form->values->$i == 1) {
                                $this->znackyFiltr[$j] = $this->znacky[$i-1];
                                $j++;
                        }
                }
vvoody
Člen | 910
+
0
-

Aha, ale ono neni potrebne vkladat tie hodnoty do tych properties presenteru, ale samozrejme fungovat to bude aj takto. Pisem to len preto, aby si nedosiel k omylu, ze to je pre tu perzistentnost nevyhnutne.

Domki
Člen | 310
+
0
-

No ja sem to do tehle promenych ukladal abych k nim pak mohl pristupovat v render metode k prdani do sablony, kde mám dotaz na získaní vypisu polozek. Nebo se to dela jinak?

Nic mene stále mi nefunguje filtrovani ani strankování co se týče filtrování znacek ktery dostavam z checkboxu a nasledne ty vybrany mam jako pole. znackyFiltr

Domki
Člen | 310
+
0
-

Zde dyzkat celej aktuální kod

use Nette\Application\UI\Form;
use Nette\Database\Connection;

class FullBikesPresenter extends BasePresenter {

	/** @persistent */
	public $items = 30;

	/** @persistent */
	public $sort = 'nase_cena ASC';

	/** @persistent */
	public $znackyFiltr;

	public $znacky;
	public $poleI;

	public function startup() {
		parent::startup();
		$i=0;
		foreach($this->context->createFullBikes()->select('DISTINCT znacka') as $znacka){
			$this->znacky[$i] = $znacka->znacka;
			$this->poleI[$i] = $i+1;
			$i++;
		}
		$this->znackyFiltr = $this->znacky;
	}

	protected function createComponentFullBikesForm() {
		$form = new Form();
		$form->addSelect('sort', "Řadit", array('cenaVzestupne' => 'Cena vzestupně', 'cenaSestupne' => 'Cena sestupně'))->setPrompt('- Vyberte typ řazení -')->setDefaultValue('cenaVzestupne')->addRule(Form::FILLED, 'Je nutné vybrat způsob řazení.');
		$form->addSelect('items', "Počet", array('15' => '15', '30' => '30', '60' => '60', '90' => '90'))->setDefaultValue('30');
		$i=1;
		foreach($this->context->createFullBikes()->select('DISTINCT znacka') as $znacka){
			$form->addCheckbox($i++, $znacka->znacka)->setDefaultValue('CHECKED');
		}
		$form->addSubmit('view', 'Zobrazit');
		$form->onSuccess[] = callback($this, 'fullBikesFormSubmited');
		return $form;
	}


	public function fullBikesFormSubmited(Form $form) {

		$this->items = $form->values->items;


		if($form->values->sort == 'cenaVzestupne')
			$this->sort = 'nase_cena ASC';
		elseif($form->values->sort == 'cenaSestupne')
			$this->sort = 'nase_cena DESC';



		$this->znackyFiltr = null;
		$j=0;
		for($i=1; $i<=count($this->poleI); $i++) {
			if($form->values->$i == 1) {
				$this->znackyFiltr[$j] = $this->znacky[$i-1];
				$j++;
			}
		}


		//predani persistent parametru aby slo strankovani
		$args = array(
                'items'=> $this->items,
                'sort'=> $this->sort,
                'znackyFiltr'=> $this->znackyFiltr
        );
		$this->redirect('this', $args);

	}

	public function renderFullBikes($page = 1)
	{
		$this->template->znacky = $this->poleI;
		$result = $this->context->createFullBikes()->where('znacka', $this->znackyFiltr);

		$paginator = new Nette\Utils\Paginator;
		$paginator->setItemCount(count($result)); // celkový počet položek (např. článků)
		$paginator->setItemsPerPage($this->items); // počet položek na stránce
		$paginator->setPage($page); // číslo aktuální stránky, číslováno od 1

		$this->template->pageNavigator = $paginator;

		$this->template->products = $this->context->createFullBikes()->where('znacka', $this->znackyFiltr)->order($this->sort)->limit($paginator->getLength(), $paginator->getOffset());
	}
}
vvoody
Člen | 910
+
0
-

Mam strach, ze nemas tusenie k comu sluzi funkcia redirect :)

Po odoslani formulara sa zmeni url? su tam vidno hodnoty filtra?

$form->addCheckbox($i++,...

S tymto si nejsom isty, ci moze meno zacinat cislom (resp byt cislo). Co je v $this->znackyFiltr po spracovani formu?

$this->znackyFiltr = null;
                $j=0;
                for($i=1; $i<=count($this->poleI); $i++) {
                        if($form->values->$i == 1) {
                                $this->znackyFiltr[$j] = $this->znacky[$i-1];
                                $j++;
                        }
                }
	dump($this->znackyFiltr);
	die();
Domki
Člen | 310
+
0
-

no jako prd tím mi to filtrovalo, ale kdyz sem pridal strankovani tak uz ne
cisla tam davam z duvodu ze znacky vybírám z dtb a nevím dopredu kolik jich bude a jaky budou jejich jmená, takhle mam proste cisla od 1 do n

to je pole retezcu, s jednotlivyma znackama, pomoci toho pak zde:
$this->template->products = $this->context->createFullBikes()->where(‚znacka‘, $this->znackyFiltr)->order($this->…
vybirám polozky na vypsaání
a prave v tom filtru si vyberu jen naky znacky a ty naky ktery mam vybrany jsou v promene znackyFiltr

vvoody
Člen | 910
+
0
-

vvoody napsal(a):
Po odoslani formulara sa zmeni url? su tam vidno hodnoty filtra?

Domki
Člen | 310
+
0
-

A jinak url pokud ve formulari zmením hodnoty selctu( způsob razeni nebo pocet polozek) tak se zmeni
ale pokud změním pouze ty checkboxy tak nic
Před:

http://localhost/PHP/PHP-Nette_Framework/Test_Nette/www/full-bikes/fullbikes?znackyFiltr%5B0%5D=GHOST&znackyFiltr%5B1%5D=APACHE&znackyFiltr%5B2%5D=LAPIERRE&znackyFiltr%5B3%5D=CTM

Po:

http://localhost/PHP/PHP-Nette_Framework/Test_Nette/www/full-bikes/fullbikes?znackyFiltr%5B0%5D=GHOST&znackyFiltr%5B1%5D=APACHE&znackyFiltr%5B2%5D=LAPIERRE&znackyFiltr%5B3%5D=CTM
vvoody
Člen | 910
+
0
-

vvoody napsal(a):
S tymto si nejsom isty, ci moze meno zacinat cislom (resp byt cislo). Co je v $this->znackyFiltr po spracovani formu?

$this->znackyFiltr = null;
                $j=0;
                for($i=1; $i<=count($this->poleI); $i++) {
                        if($form->values->$i == 1) {
                                $this->znackyFiltr[$j] = $this->znacky[$i-1];
                                $j++;
                        }
                }
	dump($this->znackyFiltr);
	die();

Teraz tato cast postu :) co vypise dump?

Domki
Člen | 310
+
0
-

array(3) [
0 ⇒ „GHOST“ (5)
1 ⇒ „APACHE“ (6)
2 ⇒ „CTM“ (3)
]

Jednotlivý znacky

vvoody
Člen | 910
+
0
-

V tom url vidim ten parameter znackyFiltr. Mam to tak chapat, ze sa vobec neaplikuje v renderFullBikes? Akoby bolo to pole prazdne?

Domki
Člen | 310
+
0
-

no
v tom dotazu to vybíra porad vsechny znacky i kdyz ve filtru mam zaskrtly jen naky
takze ne prazdne ale jakoby porad obsahovalo vsechny znacky neovlivneno formularem

konketne zde byli 3 z celkovych 4
ale vypsali se mi vsechny 4

ale kdyz odmazu ten redirect tak to filtrovalo

vvoody
Člen | 910
+
0
-

v statrtupe odmaz

$this->znackyFiltr = $this->znacky;
Domki
Člen | 310
+
0
-

Ano ted jsem dal dump ete do render metody
a v ty tozobrazi pole se 4 mi znackami (vsemi z formulare)

a na konci metody ublic function fullBikesFormSubmited(Form $form) {
dump vypise jen ty 3 znacky ktery byli vybrány

Domki
Člen | 310
+
0
-

Aáá výborný už to funguje díky
akorat teda tento řádek sem tam měl pro to ze v promeny znacky mam vsechny znacky takze ty co vypisuju pri prvním zobrazení, a v znackyfiltr ty co byli vybrany
takze ted kdyz prejdu na stranku tak se mi nezobrazi ty polozky dokud nezmacknu zobrazit.

a pote mohu se ete zeptat jak docilim aby i po odeslaní formulare mi zustal formular nastaven tak jak sem ho odeslal
zkousel sem toto co sem nasel na foru
$form->setDefaults(array(
‚count‘ ⇒ $form->values->items,
));
ale to nefunguje

vvoody
Člen | 910
+
0
-

Preco nastavujes count ked taku polozku vo forme nemas?

$form->setDefaults(array(
                'items'=> $this->items,
                'sort'=> $this->sort
        ));

a

foreach($this->context->createFullBikes()->select('DISTINCT znacka') as $znacka){
	$form->addCheckbox($i, $znacka->znacka)->setDefaultValue($this->znackyFiltr[$i]);
	$i++;
}

edit: aj ked to ti bude asi hadzat notice

Editoval vvoody (22. 7. 2012 19:12)

Domki
Člen | 310
+
0
-

ten count to byl jen příklad z fora, a to sem zkoušel upravený z toho fora a neslo to.
Kdyz sem tam dal to co jsi psal tak u tech items a sort no nehlasilo chybu, ale porad kdyz sem vybral a odeslal items po 15 tak tam skočí 30(ty mam definovany jako default uz pri vytvareni form), ten kod jsem pridal do metody fullBikesFormSubmited

co se tyce toho foreach a těch znacek tak kdyz odeslu zaskrtly vsechny checkboxy tak to nic nehlasi
ale kdyz zaskrtnu jen naky tak to hlasi nedevinovany offset

Editoval Domki (22. 7. 2012 21:26)

Domki
Člen | 310
+
0
-

Ted jsem koukal ze vlastne v tom foreach jak jsi psal tak ze jsem tam pred tím udelal to ze byly zaskrtly vsechny.
Tak sem to poupravil aformular na ty znacky uz funguje spravne

A uz jsem poresil i to ze pri prvnim zobrazovani se polozky nezobrazovali a muselo se prvne odeslat formular

Takže už blbne jen u toho selectu – items a sort to pořád nezobrazi to co jsem vybral

Editoval Domki (22. 7. 2012 21:32)

Domki
Člen | 310
+
0
-

Tak už sem vyřešil i ty selecty, ono sem při vytvaření formulaře tam přiřazoval hned na zacatku tu default hodnotu spatnou.
Takže už vše běží suprově.
Jen bych se etě zeptal zdanevadí z pohledu bezpečnosti ze do formulare jako value dávám hodnotu přímo z dtb. Př value=„cena ASC“
?

VOODY: Děkuji moc za pomoc a vytrvalost.

Domki
Člen | 310
+
0
-

Chtěl bych se ještě zeptat k tomuto tématu.
Nyní jsem udělal odesilani filtrovaciho formuláře pomocí ajaxu a nastal problém že pak už nefunguje stránkování.

Když nastavim nak filtrovací form, odesle se to ajaxove a vypis se prepise aktualne(filtrovanej) pomoci ajaxu, a pak kliknu na prejiti na další stránku. Tak se mi zobrazi vsechny položky bez aplikovani filtru
Když sem koukal na kod tak sem zjistil ze to bude nejspíš tímto:

//predani persistent parametru aby slo strankovani
			$args = array(
					'items'=> $this->items,
					'sort'=> $this->sort,
					'rok'=> $this->rok,
					'znackyFiltr'=> $this->znackyFiltr,
					'page' => 1,
					'kategorie' => $this->kategorie
			);

		if (!$this->presenter->isAjax())
		{
			$this->redirect('this', $args);
		}
		else
		{
			$this->invalidateControl();
		}

Kdy si nastavim argumenty ktery jsou persistentní ale predavam je jen kdyz se prepise pomoci redirect, a když jde o ajax tak ne.

Jak dostanu ty argumenty sem:
else
{
$this->invalidateControl();
}
? díky

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Prostě je nastav:

$this->presenter->args = something;

Prostě ten persistentní parametr nastav přímo přiřazením, hned vedle toho invalidate. V šabloně (resp. v tom snippetu) se pak budou linky generovat s novými parametry.

Domki
Člen | 310
+
0
-

Aha děkuji o tom sem nevěděl jak to takhle udělat
Akorát ještě
$this->presenter->args to args je jako 1 promena do ktery se neco ulozi?
a kdyz potrebuju nastavit vice parametru a mam je v poli?
tyto promenny co sou v poli potrebuju predat:

$args = array(
                                        'items'=> $this->items,
                                        'sort'=> $this->sort,
                                        'rok'=> $this->rok,
                                        'znackyFiltr'=> $this->znackyFiltr,
                                        'page' => 1,
                                        'kategorie' => $this->kategorie
                        );

A kdyz sem to zkusil jednotlive ta to vubec neodesila formular
takto:

if (!$this->presenter->isAjax())
		{
			$this->redirect('this', $args);
		}
		else
		{
			$this->presenter->items = $this->items;
			$this->presenter->sort = $this->sort;
			$this->presenter->rok = $this->rok;
			$this->presenter->znackyFiltr = $this->znackyFiltr;
			$this->presenter->page = 1;
			$this->presenter->kategorie = $this->kategorie;

			$this->invalidateControl();


		}

Editoval Domki (15. 8. 2012 20:00)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nejsem si jistý jestli uvedený kód je v presenteru nebo nějaké komponentě (->redirect() lze jen v presenteru, pokud se nemýlím). Persistentní parametry jsou public členské proměnné třídy presenteru či komponenty, takže je třeba je na odpovídající instanci nastavit. Mnou uvedený příklad byl jen obecný.

Když budu mít persistentní parametr $foo:

/** @var @persistent */
public $foo;

Mohu ho nastavit na instanci presenteru (v presenteru pak na $this, pochopitelně):

$presenter->foo = 'ahoj';

Doufám, že je to jasnější.

Domki
Člen | 310
+
0
-

ano je to v presenteru
persisten promenne mam

/** @persistent */
public $items;
/** @persistent */
public $sort;
/** @persistent */
public $rok;
/** @persistent */
public $znackyFiltr;
/** @persistent */
public $kategorie;

takze by se to melo nastavit takto:
$this->presenter->items = $this->items;
Ale takhle mi to vubec neodesialo formulář.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Tomu nerozumím, co to znamená, že se neodesílá formulář? Tohle nastavování se přeci provádí až v reakci na odeslání formuláře.

Domki
Člen | 310
+
0
-

No ano provadi se to v metode pro odeslaní formulare
Ale kdyz to mam takto:

if (!$this->presenter->isAjax())
		{
			$this->redirect('this', $args);
		}
		else
		{
			$this->presenter->items = $this->items;
			$this->presenter->sort = $this->sort;
			$this->presenter->rok = $this->rok;
			$this->presenter->znackyFiltr = $this->znackyFiltr;
			$this->presenter->page = 1;
			$this->presenter->kategorie = $this->kategorie;

			$this->invalidateControl();


		}

ale kdyz menim udaje ve formulari tak to nic nezmeni v datech.
A kdyz to odstranim, tak to uz odesila formular takto:

if (!$this->presenter->isAjax())
		{
			$this->redirect('this', $args);
		}
		else
		{
			$this->invalidateControl();


		}

A to predani tech parametru by melo byt tak jak to mam v tom prvni kodu správně?

Editoval Domki (15. 8. 2012 21:57)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Oh dear, stále tomu nerozumím. Pošli třeba celý kód, a zkus ho slušně zformátovat, ušetříš bolesti mou šedou kůru mozkovou :).

Podezření: proč tam nastavuješ $this->items, co je to za proměnnou? Proč tam nenastavuješ něco z té proměnné $args?

Domki
Člen | 310
+
0
-

Ok tady to posilam
to this->item
je aktualni promena pro celej presenter co mam, hned na zacatku presenteru:

<?php
use Nette\Application\UI\Form;
use Nette\Database\Connection;

/**
 * Presenter na výpis zbozi dané kategorie
 *
 *
 *
 * Filtrování podle roku funguje pouze do roku 2100
 */
class ZboziKategoriePresenter extends BasePresenter
{
	/** @persistent */
	public $items;
	/** @persistent */
	public $sort;
	/** @persistent */
	public $rok;
	/** @persistent */
	public $znackyFiltr;
	/** @persistent */
	public $kategorie;

	public $znacky;
	public $roky;
	public $poleI;
	public $kategorieInf;

	public function startup() {
		parent::startup();
		$this->kategorie = $this->getParameter('kategorie');

		$session = $this->getSession('mySession');// možností pouziti SESSION ///asi muzeme mic vic promenych a tim vice jmenych prostoru pro session?

		$session->nadKat;//vytvoreni session

		if($session->nadKat != $this->getParameter('kategorie')) // kdyz se prejde na jinou kategorii vymazat data
		{
			$this->znackyFiltr = NULL;
			$this->znacky = NULL;
			$this->poleI = NULL;
			$this->kategorieInf = NULL;
			$this->items = NULL;
			$this->sort = NULL;
			$this->rok = NULL;
			$this->roky = NULL;
		}

		$session->nadKat = $this->getParameter('kategorie');

		$this->kategorieInf = $this->context->createKategorie()->select('id_kategorie, nazev_kategorie, nazev_kategorie_cz, nadnazev_kategorii, popis_kategorie')->get($this->getParameter('kategorie'));

		//vytvoreni pole vsech znacek
		$i=0;
		foreach($this->context->createZbozi()->select('DISTINCT znacka')->where('kategorie', $this->kategorieInf["nazev_kategorie"])->order('znacka ASC') as $znacka){
			$this->znacky[$i] = $znacka->znacka;
			$this->poleI[$i] = $i+1;
			$i++;
		}

		//vytvoreni pole vsech roku
		$this->roky[0] = '-Všechny roky-';
		$i=1;
		foreach($this->context->createZbozi()->select('nazev')->where('kategorie', $this->kategorieInf["nazev_kategorie"]) as $nazevProRoky)
		{
			if( ((substr($nazevProRoky->nazev, -4)) > 2000) && ((substr($nazevProRoky->nazev, -4)) < 2100) )
			{
				if(!in_array(substr($nazevProRoky->nazev, -4), $this->roky))
					$this->roky[$i++] = substr($nazevProRoky->nazev, -4);
			}
		}
		sort($this->roky);

		//default hodnoty
		if(!isset($this->znackyFiltr))
			$this->znackyFiltr = $this->znacky;
		if(!isset($this->items))
			$this->items = 15;
		if(!isset($this->sort))
			$this->sort = 'nase_cena ASC';
		if(!isset($this->rok))
			$this->rok = 0;
	}


	protected function createComponentZboziKategorieForm() {
		$form = new Form();
		$form->getElementPrototype()->class = 'ajax'; //kvuli ajaxu musi byt i samotny form
		$form->addSelect('sort', 'Řadit podle: ', array('nase_cena ASC' => 'Ceny', 'nase_cena DESC' => 'Ceny sestupně', 'znacka ASC' => 'Výrobce', 'znacka DESC' => 'Výrobce sestupně'))->setDefaultValue($this->sort)->setAttribute("class", "onChangeSubmit ajax");
		$form->addSelect('items', 'Položek: ', array('9' => '9', '15' => '15', '30' => '30', '60' => '60', '90' => '90', '120' => '120'))->setDefaultValue($this->items)->setAttribute("class", "onChangeSubmit ajax");
				//vytvorenii formulare pro výběr roku
		$form->addSelect('rok', "Rok: ", $this->roky)->setDefaultValue($this->rok)->setAttribute("class", "onChangeSubmit ajax");
				//vytvorenii formulare pro výběr značek
		$i=1;
		foreach($this->context->createZbozi()->select('DISTINCT znacka')->where('kategorie', $this->kategorieInf["nazev_kategorie"])->order('znacka ASC') as $znacka){
			if(in_array($znacka->znacka, $this->znackyFiltr))
				$form->addCheckbox($i++, $znacka->znacka)->setDefaultValue('checked')->setAttribute("class", "onChangeSubmit ajax");
			else
				$form->addCheckbox($i++, $znacka->znacka)->setAttribute("class", "onChangeSubmit ajax");
		}
		$form->onSuccess[] = callback($this, 'zboziKategorieFormSubmited');
		return $form;
	}

	public function zboziKategorieFormSubmited(Form $form) {
		$this->items = $form->values->items;
		$this->sort = $form->values->sort;
		$this->rok = $form->values->rok;

		$this->znackyFiltr = null;
		$j=0;
		for($i=1; $i<=count($this->poleI); $i++) {
			if($form->values->$i == 1) {
				$this->znackyFiltr[$j++] = $this->znacky[$i-1];
			}
		}

		//predani persistent parametru aby slo strankovani
			$args = array(
					'items'=> $this->items,
					'sort'=> $this->sort,
					'rok'=> $this->rok,
					'znackyFiltr'=> $this->znackyFiltr,
					'page' => 1,
					'kategorie' => $this->kategorie
			);

		if (!$this->presenter->isAjax())
		{
			$this->redirect('this', $args);
		}
		else
		{
			$this->presenter->items = $this->items;
			$this->presenter->sort = $this->sort;
			$this->presenter->rok = $this->rok;
			$this->presenter->znackyFiltr = $this->znackyFiltr;
			$this->presenter->page = 1;
			$this->presenter->kategorie = $this->kategorie;

			$this->invalidateControl();


		}
	}


	public function renderZboziKategorie($page = 1)
	{
		if($this->rok == 0)//ziskani roku na vypis a filtr pro paginator
			$rok = '';
		else
			$rok = $this->roky[$this->rok];

		$this->template->kategorieInf = $this->kategorieInf; //predani inf o kategorii
		$this->template->znacky = $this->poleI; //predani poleI - jednotlivy name k znackam

		$result = $this->context->createZbozi()->where('znacka', $this->znackyFiltr)->where('nazev LIKE ?', '%'.$rok)->where('kategorie', $this->kategorieInf["nazev_kategorie"]);
		$paginator = new Nette\Utils\Paginator;
		$paginator->setItemCount(count($result)); // celkový počet položek (např. článků)
		$paginator->setItemsPerPage($this->items); // počet položek na stránce
		$paginator->setPage($page); // číslo aktuální stránky, číslováno od 1
		$this->template->pageNavigator = $paginator;

		//predani zbozi do sablony
		$this->template->polozkyZbozi = $this->context->createZbozi()->where('znacka', $this->znackyFiltr)->where('nazev LIKE ?', '%'.$rok)->where('kategorie', $this->kategorieInf["nazev_kategorie"])->order($this->sort)->limit($paginator->getLength(), $paginator->getOffset());
	}
}
22
Člen | 1478
+
0
-

vojtech.dobes napsal(a):

Prostě je nastav:

$this->presenter->args = something;

proč v presenteru voláš $this->presenter?

Domki
Člen | 310
+
0
-

A jak by to mělo být?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Ahá… ad @22, ono nebylo zřejmé, kde se kód nachází, jestli v presenteru nebo v komponentě.

Ad @Domki: nemusíš znovu nastavovat $this->presenter->items, jednak v presenteru přistupovat k presenteru je drbání se třetí rukou za čtvrtým uchem, a hlavně ty už jsi do té proměnné potřebné hodnoty přiřadil. Fungovat by to mělo. Průšvih je, že pokud se dobře dívám, ty podle těchto proměnných získáváš data z DB už v metodě startup. To je na začátku celého životního cyklu. A protože v ajaxovém požadavku se nestartuje další životní cyklus (redirect de facto znovu nastartuje aplikaci, v tvém případě s novými parametry z formuláře), tak ty sice přiřadíš hodnoty na správné místo, ale data už jsou stažená podle těch starých hodnot.

Přesuň stahování dat alespoň do render<Foo> metody nebo si v ní vynuť přenačtení těchto dat. Zpracování formuláře totiž probíhá mezi metodami action a render.

22
Člen | 1478
+
0
-

Já nevím, proč v presenteru voláte $this->getPresenter();
čekám, že mi to někdo z vás dvou vysvětlí…

Domki
Člen | 310
+
0
-

No ono když z toho kodu výše odmazu toto:
$this->presenter->items = $this->items;
$this->presenter->sort = $this->sort;
$this->presenter->rok = $this->rok;
$this->presenter->znackyFiltr = $this->znackyFiltr;
$this->presenter->page = 1;
$this->presenter->kategorie = $this->kategorie;
Tak jako ajax funguje ale kdyz to mam nak vyfiltrovaný a pak prejdu ve strankovani na dalsi stranku tak se ten filtr zrusi a zobrazjou se uz vsechyn polozky
To ze sem tam peidal nastavovani $this->presenter->items bylo kvuli tomu ze sem myslel ze to pak zustane i po strankovani coz je blbost
Nak nevím jaký stahovani dat más na mysli?