Makra pro „ruční“ vykreslování formulářů

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

Dejme tomu ze mam nejaky doraznik, kde otazky a odpovdi nacitam z tabulky.. Otazka bude v policku [label]. Odpoved bude ve forme [checkbox] [label]

Kostra:

<tr>
	<td>Koníčky</td>
	<td>
		<input type="checkbox"> plavani<br />
		<input type="checkbox"> foceni<br />
		...
	</td>
</tr>

Zkousel jsem to udelat pres conteiner, ale nepodarilo se.. Taky je trosku problem s tim ze nazvy checkboxu musi byt ve forme: test_form[otazka][odpoved]…

Jan Tvrdík
Nette guru | 2595
+
0
-
neznalek
Člen | 60
+
0
-

No chtel bych si to ridit trosku stylama.. a uz mam definovany form macro..

Čelo
Člen | 42
+
0
-

Nemá někdo upravené FormMacros pro aktuální vývojovou verzi s předělaným Latte filterem?

Filip Procházka
Moderator | 4668
+
0
-
Patrik Votoček
Člen | 2221
+
0
-
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
	//...

	public function templatePrepareFilters($template)
	{
		$template->registerFilter(function($s) {
			$parser = new \Nette\Latte\Parser;
			$parser->setDelimiters('\\{(?![\\s\'"{}*])', '\\}');

			// context-aware escaping
			$parser->escape = '$template->escape';

			// initialize handlers
			$parser->handler = new \Nette\Latte\DefaultMacros;
			\JanTvrdik\Templates\FormMacros::register($parser->handler);
			$parser->handler->initialize($parser, $s);

			// process all {tags} and <tags/>
			$s = $parser->parse($s);

			$parser->handler->finalize($s);

			return $s;
		};);
	}
}
Čelo
Člen | 42
+
0
-

Nezbývá než poděkovat… takže díky

ras
Člen | 135
+
0
-

Jsem sice Nette zacatecnik, ale myslim, ze by bylo skvele a pro prehlednost super, kdyby misto nasledujiciho kodu

Honza Marek napsal(a):
Šablona:

{form nazevFormu}

{widget nazevFormu errors} {* errory je potřeba ještě vymyslet *}

<p>{label name class => "big", text => "Jméno:"} {input name size => 30}</p>
<p>{input ok text => "Odeslat formulář"}</p>

{/form}

stacilo uvest pouze

{form nazevFormu, nazevSablony.latte}

→ cimz by se tato „formSablona“ nacetla do soucasne sablony

Vyhody:

1.) moznost umistit formulare na jedno misto

2.) opakovane vyuzivat jednu sablonu pro vice formularu, resp. na vice strankach (snaha o DRY)

3.) citelnejsi kod sablony

Nebo si myslite, ze je to krok spatnym smerem?

na1k
Člen | 288
+
0
-

ras, já používám toto:

{include "$THEME_DIR/@form.latte", form => $control['editForm']} ?>

Nevím jestli je to ten nejideálnější způsob a je možné, že už na to funguje nějaká zkratka, ale je to funkční a myslím i dostatečně názorné pro nezasvěceného diváka.

bojovyletoun
Člen | 667
+
0
-

Dost promakané je to v Neuronu. Formulář (mimo jiné features) získá automaticky šablonu ve tvaru (BookingForm.php → BookingForm.phtml). V presenteru pak stačí vytvořit createcomponentXyz(){new BlaForm;} a vložit do šablony klasicky {control Xyz}

Celkově se mi na tom líbí nápad, že formy samy o sobě jsou samostatné jednotky, kterým pohromadě řeknu jak mají vypadat, co mají dělat po odeslání atd. A takhle ho stačí jen prksnout do presenteru. A ještě lepší je EntityForm, který se rovnou sváže s modelem.

Editoval bojovyletoun (21. 4. 2011 22:05)

neznalek
Člen | 60
+
0
-

Snazil jsem se vypsat container, ale nedari se nevite kde by mohla byt chybka:

Presenter

<?php
$f = new Nette\Application\AppForm;
$fServices = $f->addContainer('container');
$fService = $fServices->addContainer('c1');
$fService->addCheckbox('i', 'Item 1');
$fService = $fServices->addContainer('c2');
$fService->addCheckbox('i', 'Item 2');
$f->addSubmit('submit', 'Odeslat');
?>

View:

{form orderService}
<table class="settingTable">
	{formContainer container}
	<tr>
		<td>{label i}</td>
		<td>{input i}</td>
	</tr>
	{/formContainer}
</table>
{input submit}
{/form}

Hlasi to chybu: Component with name ‚i‘ does not exist.

Vysledek po uprave sablony by mel byt, data se bodou nacitat z tabulky toto je priklad..
{nazev sluzby} | {cena} | {checkbox}

Davelister
Člen | 28
+
0
-

No, pokud vidim dobre, mas tam nejakou takovouto strukturu:

Form/container/c1/i
              /c2/i

Tudiz v containeru „container“ zadne i neexistuje, to je az pod c1(prip.c2).
Todle by uz mohlo fungovat:

{form orderService}
<table class="settingTable">
        {formContainer container}
	        {formContainer c1}
		        <tr>
                		<td>{label i}</td>
		                <td>{input i}</td>
		        </tr>
	        {/formContainer}
        {/formContainer}
</table>
{input submit}
{/form}

Editoval Davelister (23. 4. 2011 1:36)

neznalek
Člen | 60
+
0
-

Me staci udelat pouze:

{nazev sluzby 1} | {cena 1} | {checkbox 1}
{nazev sluzby 2} | {cena 2} | {checkbox 2}
...              | ..       | ..

K tomu by mel stacit jeden konteiner, ale kdyz napisi:

<?php
$fServices = $f->addContainer('container');
$fServices->addCheckbox('i', 'Item 1');

$fServices = $f->addContainer('container');
$fServices->addCheckbox('i', 'Item 2');
?>

Nazev container existuje.. Pocet sluzeb nevim budou se vyposivat z db..

Editoval neznalek (23. 4. 2011 1:49)

Davelister
Člen | 28
+
0
-

Nemuzes pridavat 2× container se stejnym nazvem. Tady mas nastin toho jak by se to dalo zhruba vyresit.

Udelej jeden container, do ktereho das vsechny sluzby a pak kazda sluzba bude ve specialnim containeru.

$form = new AppForm..;
$servicesContainer = $form->addContainer('services');
for($i=0;$i<5;$i++){ // prida 5 podcontaineru
	$itemContainer = $servicesContainer->addContainer($i);
	$itemContainer->addText(..);
	$itemContainer->addText(..);
	$itemContainer->addCheckbox(..);
}

A do sablony:

{form xxx}
	{formContainer services}
		{foreach $services as $id}	 //pole s nazvy vsech containeru, to si musis nekde udelat
			{formContainer $id}
				{input text}
				{input text2}
				{input checkbox}
			{/formContainer}
		{/foreach}
	{/formContainer}
{/form}

Editoval Davelister (23. 4. 2011 2:12)