Filtrování přes formulář + stránkování
- Domki
- Člen | 310
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í?
- vvoody
- Člen | 910
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)
- Filip Procházka
- Moderator | 4668
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
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.
- vvoody
- Člen | 910
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
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
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
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);
- Domki
- Člen | 310
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
- vvoody
- Člen | 910
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
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++;
}
}
- Domki
- Člen | 310
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
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
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
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
- Domki
- Člen | 310
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
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
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
- Domki
- Člen | 310
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
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
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
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
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
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
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
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
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
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
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
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
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
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());
}
}
- Vojtěch Dobeš
- Gold Partner | 1316
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
.
- Domki
- Člen | 310
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?