Hromadný submit formulářů

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

Dobrý den, potřebovala bych radu ohledně submitu pole inputů jedním tlačítkem.
Potřebuji vypsat fotky a ke každé z nich vlastní formulář pro editaci, ve kterém bude třeba název a popis. Jedním tlačítkem submit pak chci odeslat všechny změny. V html to jde udělat pomocí tagu input name=„title[]“, jak to udělat v nette mě nenapadá.

Filip Procházka
Moderator | 4668
+
0
-

Nette k tomuto má Containery. Pokud si to chceš usnadnit, tak Replicator.

Editoval HosipLan (7. 4. 2012 14:32)

olkins
Člen | 30
+
0
-

Containery jsem zkoušela, ale nemůžu přijít na jejich vykreslování. Pole fotek získám z databáze a pak ho foreachem vypisuju do šablony. A nevím jak do toho foreache přidám vykreslování formuláře, aby pro každou fotku byl právě jeden a jak pak do hidden pole formuláře přidám id fotky.

Filip Procházka
Moderator | 4668
+
0
-

Zkus příště posílat, co už máš hotové, ať se máme od čeho odpíchnout. Takže uděláme si základní kostru formuláře

use Nette\Application\UI;

protected function createComponentPhotosForm()
{
	$gallery = $this->database->table('gallery')->...;

	$form = new UI\Form;
	$photos = $form->addContainer('photos');
	foreach ($gallery as $image) {
		$photo = $photos->addContainer($image->id);
		$photo->addText('title', $image->title)
			->setOption('path', $image->path);
		$photo->addHidden('id')
			->setDefaultValue($image->id);
	}

	return $form;
}

Tu si můžeš zkusit vykreslit

{control photosForm}

a potom si můžeš hrát s detaily

{form photosForm}
	<div n:foreach="$form['photos']->components as $photo" class="photo">
		{* jméno containeru je vždy "photos-1" kde jednička je ID fotky *}
		{formContainer "photos-$photo->name"}
			{input title}
			<img src="{$basePath}/{$photo['title']->getOption('path')}" alt="" />
		{/formContainer}
	</div>
{/form} {* hiddeny se vykreslí automaticky na konci *}
olkins
Člen | 30
+
0
-

Diky moc. Pomohlo to. Už to skoro chodí. Jen mám malý problém. Vypisuje mi tuhle chybu při vykreslování Unknown macro {formContainer}. Nevíš čím by to mohlo být?

duke
Člen | 650
+
0
-

@olkins Nejspíš máš příliš starou verzi Nette.

olkins
Člen | 30
+
0
-

Používám verzi 2.0. beta…

olkins
Člen | 30
+
0
-

Zkusila jsem to změnit na novou verzi a vypisuje stejnou chybu…

duke
Člen | 650
+
0
-

Tak si stáhní alespoň stable verzi 2.0.x (např. zde) nebo pokud chceš nejnovější opravy tak vývojovou verzi nejlpíp přímo z githubu.

olkins
Člen | 30
+
0
-

Tak v té stabilní verzi mi to nechodí také..může to být problém v nějakém přípojení/nastavení?

Filip Procházka
Moderator | 4668
+
0
-

Stáhni si aktuální stable (2.0.3), smaž cache a musí to fungovat.

duke
Člen | 650
+
0
-

Nejpravděpodobnější vysvětlení je, že jsi to uploadnula jinam, než jsi měla, a že ti to pořád jede na staré verzi.

Jde o to, že to makro se instaluje v této metodě společně s makry {form}, {label} a {input}. Pokud ti to nehlásí tutéž chybu také u nich, znamená to, že se spouští starší verze této metody ze staršího Nette, kde {formContainer} ještě definováno není.

duke
Člen | 650
+
0
-

@HospiLan Jestli myslíš Nettí cache, tak netuším, jak by to mohlo pomoci. Vždyť když dojde k chybě při překladu latte souboru, tak se do cache nic neukládá (tam se ukládá až výsledek bezchybného překladu). Ale dokážu si představit, že by to mohla dělat nějaká jiná cache na jiné úrovni.

Edit: Nicméně souhlasím, že promazat cache je rozumné už z principu při každém upgradu Nette.

Editoval duke (7. 4. 2012 17:41)

olkins
Člen | 30
+
0
-

Existuje nejaky jiny zpusob, nez pouziti Containeru? Nebo jiny vypis pro starsi verzi Nette…Nejde mi predelat projekt na novou verzi :( a uz jsem z toho zoufala

Filip Procházka
Moderator | 4668
+
0
-

Containery fungují stejně dobře v Novém nette jako i starém. Problém máš ve vykreslování, takže ho upravíme, aby to fungovalo i ve starším Nette

{form photosForm}
	<div n:foreach="$form['photos']->components as $photo" class="photo">
		{input "photos-$photo->name-title"}
		<img src="{$basePath}/{$photo['title']->getOption('path')}" alt="" />
	</div>
{/form} {* hiddeny se vykreslí automaticky na konci *}
olkins
Člen | 30
+
0
-

Diky moc, funguje to :)

olkins
Člen | 30
+
0
-

Jeste mam jeden maly dotaz. Budu mit v tom vypisu jeste radioList pro vyber hlavni fotky alba. A chci aby byl zaskrtnut prave jeden. Da se to nejak v tomto pripade vyresit?