Rozšíření formuláře o defaultní nastavení

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

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.

  1. 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
  2. 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
+
0
-

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

EarlGrey
Člen | 14
+
0
-

Díky za odpověď – ale můžu tyhle parametry pro renderování formuláře nastavovat v šabloně? Jde mi o to, abych nemusel výše zmíněné nastavení volat při tvorbě každého formuláře znova.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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

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

Eh… :)

  1. 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
	}
}
  1. 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::....
  2. Měl jsi nejspíš na mysli $this->renderer->wrappers, tvoje varianta ti zařve na nedefinovanou lokální proměnnou $renderer.
  3. Renderer se vytváří „líně“ přímo v metodě getRenderer() (přičemž díky Nette\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)

EarlGrey
Člen | 14
+
0
-

Díky za trpělivost!

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Rádo se stalo.