Paginator – prenasanie dalsich parametrov v URL
- tolljump
- Člen | 47
Zdravim vas.
Riesim problem ohladom routovania adries v Paginatora, ktory mi pri prechode na dalsie stranky nastavuje stale adresu {link this, ‚page‘ ⇒ $step} co je problem, pretoze mam v adrese zadavane dynamicky rozne dalsie parametre z filtra produktov a tie sa musia prenasat aj pri prechode na dalsie strany.
Ako to mam poriesit?
Dakujem pekne za rady.
- tolljump
- Člen | 47
Nebudem ani uvadzat priklady ze co chcem dosiahnut, rovno si prosim niekto pozrite stranku http://lanoblessa.sk/…/panska-moda .V hornej casti je filter. Odklikajte si nejake parametre a dajte filtrovat. Vsetko je OK, filtrovanie prebehne, produkty su spravne. No ako nahle dalej kliknete v strankovani na akukolvek dalsiu stranu, tak tie parametre z filtra, ktore sa prenasaju pomocou URL tam uz niesu. Z toho dovodu ze niesu perzistentne. Lenze ako mam urcit perzistentne parametre, ak sa ten filter generuje dynamicky, podla toho ake parametre uzivatel zada?
- hAssassin
- Člen | 293
No prece uplne jednoduse:
- v presenteru si vytvor dve private/protected properties
$manufacturer
a$velikost
a nastav je na @persistent. - v tovarnicce formulare nastavuj vychozi hodnoty podle tech properties z bodu 1
- v handle formulare (cili v metode po onSuccess) si z odeslanych hodnot napln tyto properties a presmeruj.
Thats all (snad sem na nic nezapomnel).
- tolljump
- Člen | 47
No az tak jednoduche to neni. Nemozem vytvorit presenteru $manufacturer ani $velkost ktore budu mat anotaciu @persistent, pretoze tieto vlastnosti vznikaju dynamicky. Su rozne, napr. $dlzka, $sirka, $obvod-hrudnika, atd. atd… Vsetko generovane z databazy, cize idealny sposob by bol, ze ked vytvaram napr. vo formulari text input s name=manufacturer, tak aby sa automaticky premenna $manufacturer nastavila na persistent. Toto potrebujem docielit
- tolljump
- Člen | 47
Tu je cast kodu ktora vytvara parametre filtra:
public function createComponentFilterForm(){
$form = new Form;
//$form->setTranslator($this->context->translator);
$allAtributes = $this->allAttributes;
$filerInputTypes = $this->shopModel->filerInputTypes;
foreach($allAtributes as $a){
$selectValues = $this->context->database->table('shop_products_attributes')
->where("$a->name <> ''")
->where('shop_products_id',$this->productsIds)
->select($a->name)
->group($a->name);
if(count($selectValues) > 0){
$values = array();
if($a->type == 'selectbox'){
$values['null'] = _('nezvolené');
}
foreach ($selectValues as $v){
/*if(strpos($v[$a->name],',')){
$vals = explode(",",$v[$a->name]);
foreach($vals as $s){
$values[$s] = $s;
}
}else*/if(strpos($v[$a->name],';')){
$vals = explode(";",$v[$a->name]);
foreach($vals as $s){
$values[$s] = $s;
}
}else{
$values[$v[$a->name]] = $v[$a->name];
}
}
$inputTitle = $a->title;
$inputName = $a->name;
//vytvorenie vstupu
$input = $form->$filerInputTypes[$a->type]($inputName,$inputTitle,$values);
//nastavenie default hodnoty z URL
if($this->getParam($a->name)){
$def = $this->getParam($a->name);
$input->setDefaultValue($def);
}
}
}
//...................... atd
- hAssassin
- Člen | 293
aha, ok, a co kdyby tedy byla jen jedna persistent property, treba
$filter
a bylo by to 2d pole? Na prvni urovny by byly nazvy tech
generovanych indexu (manufacturer, velikost, bara, sirka, …) a az pod kazdym
indexem by byly realny hodnoty? Sice se pak zmeni parametry v URL ale to by
snad moc vadit nemelo, ne?
Kazdopadne uz 100% nereknu jestli to bude fungovat, ale proc ne, pole v URL byt muze, proc by nemohlo byt dvojrozmerny, ze.
- hAssassin
- Člen | 293
No existuje funkce getPersistentParams()
(coz je zajimavy,
protoze se params prejmenovalo na parameters, ale to sem nepatri :-)), ktera
prave vychoze urcuje parametry podle @persistent
anotace.
Cili asi by se dala pretizit tak aby vracela pouze ty nove pridany v tovarnicce. Cili idealne takto:
class MyPresenter {
private $persistents = array();
...
protected function createComponentFilterForm() {
...
$this->persistents[] = $inputName = $a->name;
...
}
...
public static function getPersistentParams() {
$rc = new Nette\Reflection\ClassType(get_called_class());
return $rc->persistents;
}
...
}
Metoda je static, takze by to chtelo jeste si pohrat s tim, aby slo zavolat
i rodicovskou implementaci a mergnout obe pole (aby si mohl i nadale pouzivat
@persistent
). Jestli to bude ale 100% funkcni, netusim :) Ale za
zkousku to stoji.
EDIT: shit, chyba v kodu.
Editoval hAssassin (26. 4. 2013 0:36)
- tolljump
- Člen | 47
no aj getPersistentParams() som skusal, ale zastavilo to na tom ako vravis, ze to hadzalo chyby kvoli ostatnym @persistent ktore som mal nastavene. Idealne riesenie v tomto pripade bolo jednoznacne viacrozmerne pole $filter, ktore obsahuje dalsie polia podla parametrov filtra.
- hAssassin
- Člen | 293
ten merge by jit ale mel udelat, jen ted z hlavy ti nereknu jak predat spravne tridu, ale mozna by mohlo stacit neco takovyho:
public static function getPersistentParams() {
$rc = new Nette\Reflection\ClassType(get_called_class());
retrun array_merge($rc->persistents, $rc::getPersistentParams());
}
Pripadne parent::getPersistentParams()
a mergnout obe pole. To
fungovat musi.