Dynamicke vytvaranie formulara

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 dilemu, ako jednoducho vyriesit pridavanie produktov do kosika v e-shope pomocou formulara. Pri stranke s jednym produktom by to nebol problem, kedze som vytvoril component

public function createComponentCart(){
		$form = new Form;
//atd....

Tento komponent obsahuje selectbox na vyberanie parametrov produktu (napr. velkost), input na zadavanie mnozstva a odosielaci submit button. Vsetko je v poriadku, ale ako tento formular duplikovat tak, aby som ho aplikoval na kategoriu produktov, aby kazdy produkt mal svoj formular na pridanie do kosika.

Lenze ak v latte sablone zavolam {control cart}, a menim pred tym ID produktu, podla ktoreho sa ma formular vygenerovat, tak sa stale nacitava len formular s hodnotami prveho produktu – prveho vykreslenia komponentu.

Ako komponent formulara prekreslovat stale pri kazdom vyrenderovani?

tolljump
Člen | 47
+
0
-

Funkcia z presentra:

public function createComponentCart(){
		$form = new Form;
		$form->setTranslator($this->context->translator);

		if(is_numeric($this->cartProductId)){
			$form->addHidden('productId',$this->cartProductId);
			$productId = $this->cartProductId;
		}else{
			$form->addHidden('productId',$this->product->id);
			$productId = $this->product->id;
		}

		$productParameters = $this->shopModel->getAllProductParametersValues($productId);

		foreach($this->allParameters as $param){
			if ($param->in_cart == 1 && $productParameters[$param->name] != ''){
				$defaults = array($productParameters[$param->name]);
				if(strpos($productParameters[$param->name],',')){
					$defaults = explode(",",$productParameters[$param->name]);
				}
				if(strpos($productParameters[$param->name],';')){
					$defaults = explode(";",$productParameters[$param->name]);
				}

				$defaults = array_combine($defaults, $defaults);
				if(count($defaults) == 1){
					$form->addHidden($param->name,reset($defaults));
				}else{
					$form->addSelect($param->name,$param->title,$defaults)
						//->setDefaultValue($defaults)
						->setRequired('Musíte zvoliť jednu z možností');
				}
			}
		}
		$min_max_quantity = array(1,null);
		if($this->product->min_purchase != 0){
			$min_max_quantity[0] = $this->product->min_purchase;
		}
		if($this->product->max_purchase != 0){
			$min_max_quantity[1] = $this->product->max_purchase;
		}

		$form->addText('quantity', 'Množstvo')
			->setDefaultValue(1)
			->setType('number')
			->setRequired('Musíte zadať množstvo tovaru')
			->addRule($form::FILLED, 'Musíte zadať množstvo tovaru')
			->addRule(Form::RANGE, "Musí byť viac ako ".$min_max_quantity[0].' a maximálne '.$min_max_quantity[1], $min_max_quantity)
			->addRule($form::INTEGER, 'Musíte zadať číslo')
			->getControlPrototype()->setClass('cart_quantity');

		if($min_max_quantity[0] > 0){
			$form['quantity']->setDefaultValue($min_max_quantity[0]);
		}

		$form->addSubmit('submitcart', 'Do tašky')
			->setAttribute('class', 'submitcart ajax');

		$form->onSuccess[] = callback($this, 'cartFormSubmitted');

		return $form;
	}

V .latte sablone chcem nasledne vykreslovat tento formular pre rozne produkty, tak som to chcel riesit tymto sposobom:

{? $presenter->cartProductId = $dProduct->id}
{control cart}
David Matějka
Moderator | 6445
+
0
-

mrkni Nette\Application\UI\Multipler jak ho pouzit najdes treba tady: https://doc.nette.org/…n/multiplier

EDIT:
metoda createComponent* se zavola vzdy jen jednou, je to pouze tovarnicka na komponentu daneho jmena, proto kdyz menis to ID tak to nema na nic vliv.

Editoval matej21 (11. 6. 2013 0:10)

tolljump
Člen | 47
+
0
-

Paráááda :) Trosku trebalo pogooglit a pocitat forum, aby to fungovalo, pretoze nejak mi to z toho prikladu neslo, ale vsetko som rozchodil presne tak ako potrebujem. Diky moc ;-)