formulář pomoci multiplier, jak spracovat odeslat formulare
- Domki
- Člen | 310
cau zkousim pomocí tohoto : https://doc.nette.org/…n/multiplier
udelat ze ke kazdymu radku z dtb se mi vypise orig. formular.
V sablone mam: {control pocetZbForm-$zbVKosiku->id}
V presenteru:
use Nette\Application\UI\Form;
use Nette\Database\Connection;
use Nette\Image;
use Nette\Application\UI\Multiplier;
.
.
.
.
.
protected function createComponentPocetZbForm()
{
return new Multiplier(function ($itemId) {
$form = new Form();
$form->addText('pocet', NULL, 3, 3)->addRule(Form::INTEGER, 'Počet zboží musí být číslo od 1 do 100.')->addRule(Form::RANGE, 'Počet zboží musí být číslo od %d do %d.', array(1, 100));
$form->addHidden('zbVKosikuId', $itemId);
$form->addSubmit('zmenit', 'Změnit');
$form->onSuccess[] = callback($this, 'pocetZbFormSubmited');
return $form;
});
}
public function zboziDetailDoKosikuFormSubmited(Form $form)
{
dump($form->values->pocet);
dump($form->values->zbVKosikuId);
}
Takze kdyz odeslu formular tak by mi to melo vypsat pocet a id.
Ale místo toho mi v ladence vypíse chyba Undefined variable: this na radku
kde mam ten success[] …
Co stím?
A ete bych se zeptal zde si nemusím v configu registrovat tovarnicku na toto?
Editoval Domki (6. 8. 2012 10:30)
- mkoubik
- Člen | 728
V té anonymná třídě není $this
dostupné. Předej si tam
pomocí use nejlíp jen ten callback:
protected function createComponentPocetZbForm()
{
$callback = callback($this, 'pocetZbFormSubmited');
return new Multiplier(function ($itemId) use ($callback) {
$form = new Form();
$form->addText('pocet', NULL, 3, 3)->addRule(Form::INTEGER, 'Počet zboží musí být číslo od 1 do 100.')->addRule(Form::RANGE, 'Počet zboží musí být číslo od %d do %d.', array(1, 100));
$form->addHidden('zbVKosikuId', $itemId);
$form->addSubmit('zmenit', 'Změnit');
$form->onSuccess[] = $callback;
return $form;
});
}
- Domki
- Člen | 310
Ale ted mam ete problém kdyz chcu nastavit do toho formulare default hodnotu
pocet kterou bych bral z dtb jak to mam udelat?
tu ziskavam v startupu
public $zboziVKosiku;
public function startup() {
parent::startup();
$session = $this->context->session; //neco jako vytvoreni kontejneru? a pridani do promenne session
$section = $session->getSection('MySection'); ///asi muzeme mic vic promenych a tim
$section->setExpiration(0);
$this->zboziVKosiku = $this->context->createKosikNereg()->where('kosik_nereg.zakaznik_nereg_id = ?', $section->zakaznikId); //zde ziskam pocet
}
- ViPEr*CZ*
- Člen | 817
A co je za problém? Normálně máte dostupnou proměnnou s daty a použijete ji ve formuláři (nebo nechápu dotaz a je v něm málo informací) Btw. proč si to načítáte v startupu a ne až ve chvíli kdy to opravdu potřebuje aplikace (je k tomu nějaký dobrý důvod)?
Domki napsal(a):
Ale ted mam ete problém kdyz chcu nastavit do toho formulare default hodnotu pocet kterou bych bral z dtb jak to mam udelat?
tu ziskavam v startupupublic $zboziVKosiku; public function startup() { parent::startup(); $session = $this->context->session; //neco jako vytvoreni kontejneru? a pridani do promenne session $section = $session->getSection('MySection'); ///asi muzeme mic vic promenych a tim $section->setExpiration(0); $this->zboziVKosiku = $this->context->createKosikNereg()->where('kosik_nereg.zakaznik_nereg_id = ?', $section->zakaznikId); //zde ziskam pocet }
- Domki
- Člen | 310
no ve startupu to nacitam protoze si to takhle nactu a pak pouzivat v dalsich metodach
V tom formulari de mi o to ze kdyz tam takhle chci nastavit vychozí
hodnotu
->setDefaultValue($this->zboziVKosiu[„pocet“]);
tak to opet nejde protoze zas nemuzu odkazovat pres this,
a nefunguje ani kdyz to vybiram přimo v ty komponente protoze bych zase
pouzivat this
myslím takto:
protected function createComponentPocetZbForm()
{
$callback = callback($this, 'pocetZbFormSubmited');
return new Multiplier(function ($zboziId) use ($callback){
$pocet = $this->context->createKosikNereg->select('pocet')->where('zakaznik_nereg_id = ?', $section->zakaznikId)->where('zbozi_id = ?', $zboziId);
$form = new Form();
$form->addText('pocet', NULL, 3, 3)->setDefaultValue($pocet["pocet"])->addRule(Form::INTEGER, 'Počet zboží musí být číslo od 1 do 100.')->addRule(Form::RANGE, 'Počet zboží musí být číslo od %d do %d.', array(1, 100));
$form->addHidden('zbVKosikuId', $zboziId);
$form->addSubmit('zmenit', 'Změnit');
$form->onSuccess[] = $callback;
return $form;
});
}
Editoval Domki (6. 8. 2012 12:00)
- ViPEr*CZ*
- Člen | 817
No vždyť říkám… to jsou zase základy. Co takhle si všimnout slůvka use? Mrkni do nápovědy PHP… todle nemá nic společnýho s Nette.
$callback = callback($this, 'pocetZbFormSubmited');
$pocet = $this->context->createKosikNereg->select('pocet')->where('zakaznik_nereg_id = ?', $section->zakaznikId)->where('zbozi_id = ?', $zboziId);
return new Multiplier(function ($zboziId) use ($callback, $pocet){
$form = new Form();
$form->addText('pocet', NULL, 3, 3)->setDefaultValue($pocet["pocet"]);
}
Editoval ViPEr*CZ* (6. 8. 2012 12:07)
- Domki
- Člen | 310
NO tak teorii oop chapu.
ten kod je jako jak by to melo byt?
tohle sem jiz zkousel ale takhle to nejde protoze v teto podmínce
->where(‚zbozi_id = ?‘, $zboziId); jeste nezname promenou zboziId, to
prece získám az pri vytvorení objektu toho multiplier. a potrebuju aby pro
kazdej formular co se vytvorí tak ten pocet byl originalní podle toho id
- ViPEr*CZ*
- Člen | 817
No evidentně to potřebujete. Proč si nepošlete přes to klíčové slovo use nějaký objekt? Když si například do use pošlete ukazatel na připojení do databáze, tak už nebude problém si udělat uvnitř té funkce (callbacku) výběr už jen na tu jednu hodnotu co potřebujete. Nebo si tam rovnou pošlete vaší továrničku… ku příkladu:
return new Multiplier(function ($zboziId) use ($callback, $this->context->createKosikNereg){
...
Domki napsal(a):
No to nepotřebuji.
Takže podle vás bych měl udělat selectem výběr cca 2000 položek. a potom celej ten objekt dat projit a pouzit jen jedno?Sem prave myslel jestli nejde nějak udělat abych ve vnitř v tom objektu multiplier vybral uz jen tu jednu podle toho id?
- Domki
- Člen | 310
Tak nevím toto když sem dělal v čístým php tak to šlo v pohodě.
Ale ted se do toho pořád nějak motám a nevím co s tím.
Zkusil jsem přes use předat vytvorenej objekt, ale kdyz ve vnitr tím objektem
chcu pomocí foreach procházet, tak to vypisuje jen jeden radek, pritom v dtb
mam dva, a kdyz odmazu to foreach tak to vypise taky ty dva.
public function startup() {
parent::startup();
$session = $this->context->session; //neco jako vytvoreni kontejneru? a pridani do promenne session// a získáme přístup do sekce 'MySection':
$section = $session->getSection('MySection'); ///asi muzeme mic vic promenych a tim vice jmenych prostoru pro session?
$section->setExpiration(0);
$this->zboziVKosiku = $this->context->createKosikNereg()->where('kosik_nereg.zakaznik_nereg_id = ?', $section->zakaznikId);
}
protected function createComponentPocetZbForm()
{
$callback = callback($this, 'pocetZbFormSubmited');
$zbVkosiku = $this->zboziVKosiku;
return new Multiplier(function ($zboziId) use ($callback, $zbVkosiku){
$pocetAktZb = 0;
foreach($zbVkosiku as $zbVK)
{
if($zbVK["zbozi_id"] == $zboziId)
$pocetAktZb = $zbVK["pocet"];
}
$form = new Form();
$form->addText('pocet', NULL, 3, 3)->setDefaultValue($pocetAktZb)->addRule(Form::INTEGER, 'Počet zboží musí být číslo od 1 do 100.')->addRule(Form::RANGE, 'Počet zboží musí být číslo od %d do %d.', array(1, 100));
$form->addHidden('zbVKosikuId', $zboziId);
$form->addSubmit('zmenit', 'Změnit');
$form->onSuccess[] = $callback;
return $form;
});
}
Toto mi už funguje ale vykresli to jen jeden řádek z dtb, pri odstranení foreach to vypise vsechny.
Editoval Domki (6. 8. 2012 15:43)
- ViPEr*CZ*
- Člen | 817
Ale todle je PHP :-) tak se syntaxe může lišit. Například mnohonásobná dědičnost jako je v C++ tu taky „nejde“. No tak asi děláte něco někde špatně. Hledal bych to tady třeba:
if($zbVK["zbozi_id"] == $zboziId)
$pocetAktZb = $zbVK["pocet"];
Každopádně jde o logickou chybu pokud objekt $zbVkosiku obsahuje data která jsou očekávaná.
- ViPEr*CZ*
- Člen | 817
Domki napsal(a):
No v těchto řádcích to nebude protože i když nechám prázdný foreach
foreach($zbVkosiku as $zbVK)
{}
tak to vipíse jen jeden řádek.
Nevím … jestli to dobře chápu, tak jde o nějaký počet. Asi bych se nebál toho a udělal pro každý jeden dotaz do DB podle IDéčka z $zboziId a zavolal bych nad tím count(‚*‘).