Rozšíření formuláře o defaultní nastavení
- EarlGrey
- Člen | 14
Ahoj všichni,
chtěl bych si založit několik vzorových šablon pro formuláře (jako například in-line formulář, vertikální formulář, atd…). Rád bych se zeptal, jestli je můj postup správný, případně co navrhujete jiného.
- Vytvořím si objekty, které vytvoří formulářové šablony a v konstruktor nastaví proměnné správně (pro každý formulář nový) a uložím to do libs složky
- V presenterech pak založím formulář jako potomka právě té které tříd
Je to prosím rozumný postup? Nejsem si tím úplně jistej, protože
parametry se totiž předávají až po
spuštění $form->getRenderer()
Pro infomraci, paramentry, co chci změnit jsou:
$renderer->wrappers['pair']['container'] = Html::el('div')->class('control-group');
$renderer->wrappers['controls']['container'] = NULL;
$renderer->wrappers['control']['container'] = Html::el('div')->class('controls');
$renderer->wrappers['control']['description'] = Html::el('p')->class('help-block');
$renderer->wrappers['label']['container'] = NULL;
$renderer->wrappers['label']['suffix'] = '';
Díky,
Martin
- Vojtěch Dobeš
- Gold Partner | 1316
Jde ti pouze o latte šablony? Nejjednodušším řešením by mohla být
kdekoliv v app/templates
uložená sada šablon, kde by jsi
formulář libovolně vykresloval formulářovými makry. V šablonách view
nebo prostě tam, kde bys formulář potřeboval, bys pak zavolal
{include ...}
s cestou k žádoucí šabloně.
- Vojtěch Dobeš
- Gold Partner | 1316
Proto jsem navrhoval použití formulářových maker – ta totiž na tohle nastavení naspoléhají, respektive je obcházejí: kód formuláře si přímo určuješ v šabloně, nikoliv tímto předdefinovaným „upravováním parametrů“.
Pokud bys chtěl naopak záviset čistě na těchto parametrech, udělal bych
si potomky Nette\Application\UI\Form
a ideálně v metodě
attached()
(pokud by byl
$parent insstaneof UI\Presenter
) si provedl sestavení formuláře
(add...
metody, pravidla atd.) včetně nastavení pole
->wrappers
.
Osobně se přikláním k šablonám, dávají větši svobodu.
- EarlGrey
- Člen | 14
Díky moc, zkusím si oboje – abych se s Nette trošku seznámil. Můžu
mít ještě jeden dotaz na tu metody attached()
? Koukal jsem na
ní a není mi úplně jasné, kdy přesně se spustí. Pokud bych jí tedy
upravil na:
/**
* This method will be called when the component (or component's parent)
* becomes attached to a monitored object. Do not call this method yourself.
* @param IComponent
* @return void
*/
protected function attached($obj)
{
if ($obj instanceof self) {
throw new Nette\InvalidStateException('Nested forms are forbidden.');
}
$this->$renderer->wrappers['pair']['container'] = Html::el('div')->class('control-group');
$this->$renderer->wrappers['controls']['container'] = NULL;
$this->$renderer->wrappers['control']['container'] = Html::el('div')->class('controls');
$this->$renderer->wrappers['control']['description'] = Html::el('p')->class('help-block');
$this->$renderer->wrappers['label']['container'] = NULL;
$this->$renderer->wrappers['label']['suffix'] = '';
}
bylo by to ok? Nebo bych ještě předtím musel v attached()
renderer vytvořit?
Díky!
- Vojtěch Dobeš
- Gold Partner | 1316
Eh… :)
attached()
se volá v okamžiku připojení k rodiči, a to pro každou „generaci“ rodičů :). Komponenty se můžou skládat do sebe, přičemž takový praděd všech komponent je presenter. My chceme, aby se formulář sám nastavil jen jednou (jinak bychom se dvakrát pokoušeli přidávat prvky se stejným jménem atd., což nejde), proto je nejlepší hlídat právě připojování k presenteru.
protected function attached($parent)
{
parent::attached($parent); // VŽDYCKY VOLAT NEJDŘÍVE PARENT!!!
if ($parent instanceof Nette\Application\UI\Presenter) {
// tento kód se zavolá bezpodmínečně jen jednou
$this->addText('something')... bla bla bla
}
}
- Nějaké nested forms podle mě není třeba ošetřovat (respektive
s klidem v duši to přenechme originální třídě právě voláním
parent::...
. - Měl jsi nejspíš na mysli
$this->renderer->wrappers
, tvoje varianta ti zařve na nedefinovanou lokální proměnnou$renderer
. - Renderer se vytváří „líně“ přímo v metodě
getRenderer()
(přičemž díkyNette\Object
je konstrukce$this->renderer
právě její volání), takže není třeba nijak zajišťovat jeho vytvoření.
Editoval vojtech.dobes (20. 5. 2012 20:32)