Makra pro „ruční“ vykreslování formulářů
- neznalek
- Člen | 60
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]…
- Patrik Votoček
- Člen | 2221
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;
};);
}
}
- ras
- Člen | 135
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?
- bojovyletoun
- Člen | 667
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
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
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
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
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)