Paginator – prenasanie dalsich parametrov v URL

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

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.

Glottis
Člen | 129
+
0
-

cao, koukni na persistentni parametry

https://doc.nette.org/…n/presenters

tolljump
Člen | 47
+
0
-

Dakujem za odpoved, lenze persistente parametre si viem nastavit pri riadny premennych, ktore mam zadane v skripte. Lenze tieto premenne ktore vkladam do URL adresy z filtra su generovane dynamicky. Viem aj takymto premennym nastavit @persistent?

tolljump
Člen | 47
+
0
-

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

No prece uplne jednoduse:

  1. v presenteru si vytvor dve private/protected properties $manufacturer a $velikost a nastav je na @persistent.
  2. v tovarnicce formulare nastavuj vychozi hodnoty podle tech properties z bodu 1
  3. 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
+
0
-

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

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

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.

tolljump
Člen | 47
+
0
-

Napadlo ma to tiez, len mi to trosku skomplikuje pracu. Tajne som dufal ze existuje nejaka funkcia, ktora dynamicky nastavuje novo-vytvarane premenne na persistent v pripade potreby.

tolljump
Člen | 47
+
0
-

Ak sakra… Len ma stacilo kopnut :-) Idem to este otestovat, ale zda sa ze som to prerobil na viacrozmerne pole v URL pricom $filter je @persistent. Diky moc ;-)

hAssassin
Člen | 293
+
0
-

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

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

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.