Dynamicke vytvaranie formulara
- tolljump
- Člen | 47
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
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
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)