formulář pomoci multiplier, jak spracovat odeslat formulare

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

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

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

jo tak to funguje dík

Ale to je v presenteru.

Nebo jako ze this neni dostupne v te tride multiplier?

Domki
Člen | 310
+
0
-

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

To jsou všechno základy OO jazyka.

Domki napsal(a):

jo tak to funguje dík

Ale to je v presenteru.

Nebo jako ze this neni dostupne v te tride multiplier?

ViPEr*CZ*
Člen | 817
+
0
-

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


	}
Domki
Člen | 310
+
0
-

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

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

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

No celé Vám to psát nebudu… to mělo být nakopnutí. Ale jde o to injketovat dovnitř nějaká data… a buď si je injektujete přímo a nebo si injektujete objekt, který na základě až uvnitř získaných dat se rozhodne co vrátí. ;-)

Domki
Člen | 310
+
0
-

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?

ViPEr*CZ*
Člen | 817
+
0
-

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

Aham, děkuji.
V nette začínám, tak nevím že něco takovýdleho můžu udělat.

ViPEr*CZ*
Člen | 817
+
0
-

Domki napsal(a):

Aham, děkuji.
V nette začínám, tak nevím že něco takovýdleho můžu udělat.

To ale nemá nic společnýho s Nette jak už jsem psal. :-)

Domki
Člen | 310
+
0
-

No tak nevím, ale v Javě která je objektová jsem se s takovýmto předáváním nesetkal.

Domki
Člen | 310
+
0
-

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

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á.

Domki
Člen | 310
+
0
-

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.

ViPEr*CZ*
Člen | 817
+
0
-

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(‚*‘).

Domki
Člen | 310
+
0
-

No v tom cyklu chci projit vse z dtb a porovnavam a kdyz $zboziId bude stejny s tim id_zbozi z dtb tak si ulozim pocet, kterej pak davam formulari jako default

ViPEr*CZ*
Člen | 817
+
0
-

Tak neforeachujte to pole, ale vždy si vytáhněte z DB jen určitý count pro určitý ID.

Domki
Člen | 310
+
0
-

Ted vás nějak nechápu.
Ale to je jedno, to asi udělám nak jinak bez toho muliplieru