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
	
$manufacturera$velikosta 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.