Vlastní renderer

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

Není někde postup..vysvětlení vlastního renderu pro vykreslení formuláře? .
Pokouším se o to, ale nefunguje mi to občas..ale je to spíše asi z neznalosti fungování renderu..kreslí

mám něco takového..ale při změněn u group.containeru např. na table class=neco to table nevy

<?php
/** @var array  of HTML tags */
	public $wrappers = array(
		'form' => array(
			'container' => NULL,
		),
        'group' => array(
            'container' => 'div class=group',
            'label' => 'h3',
        ),
	);
?>

kdy se volá fce renderPair? ..

díky

Oggy
Člen | 306
+
0
-

tam postup psaní vlastního rendereru.. nebo jak funguje ten CoventialRenderer ..tam není

PetrP
Člen | 587
+
0
-

Oggy napsal(a):

tam postup psaní vlastního rendereru.. nebo jak funguje ten CoventialRenderer ..tam není

ale je, toto je defakto alfa a omega CoventialRendereru, daj se s tím dělat psí kusy:

$renderer = $form->getRenderer();
$renderer->wrappers['controls']['container'] = 'dl';
$renderer->wrappers['pair']['container'] = NULL;
$renderer->wrappers['label']['container'] = 'dt';
$renderer->wrappers['control']['container'] = 'dd';

no a vlastní renderer nejlépe uděláš tak že podědíš CoventialRenderer.

Většinou si ale vystačíš z wrappers, getControlPrototype, getLabelPrototype, setOption.

Oggy
Člen | 306
+
0
-

dá se přidat jednotlivé FormGroup class? .. pokoušel jsem se o to ve vlastním rendereru…kde group přidám setOption(‚class‘,‚common‘).. abych ji odlišil od jiných group.. ale nepodařilo se mi zatím hodnotu option přidat do class té group

Editoval Oggy (13. 7. 2009 23:53)

na1k
Člen | 288
+
0
-

Nechci otevírat nové téma, tak budu pokračovat tady.

Mám trochu problém s vykreslením vlastního, dost specifického formuláře – má jít o výběr způsobu dodání zboží z eshopu (dobírka, osobní odběr,..) – jednoduše RadioList, ale při vykreslení potřebuju do tabulky kromě klíč a hodnota (jako je běžné u radio inputu) předat pro každou možnost doplňující informace. A aby to nebylo málo, tak to celé krásně rozdělit do tabulky tak, aby byla každá možnost na jednom řádku (a ne jako se teď renderuje celý control v jednom kuse).

Takže možnosti mám asi tyto:

  • napsat vlastní FormControl a nechat ho natvrdo vykreslit v řádku tabulky jak potřebuju .. nevýhoda je ale velice malá znovupoužitelnost (renderování controlu bych pak už zvenčí nepřebil)
  • napsat vlastní odnož ConventionalRendereru .. tady je otázka, jestli by to vůbec řešilo můj problém a taky když se podívám na kód, tak se mi do toho moc nechce :)
  • vypustit Nette Forms, formulář napsat natvrdo přímo do šablony a nějak to zbastlit tak, aby jeho odeslání Nette pobralo
  • (Přinutit RadioList renderovat po jednom inputu? To už by ale byl prakticky nový FormControl a navíc bych musel řešit kolize jmen a validaci – vzájemné vyloučení)

Co mi poradíte? Rád bych použil něco jednoduchého a znovupoužitelného, ale nějak nevím kterou cestou se vydat.

jasir
Člen | 746
+
0
-

na1k napsal:

ještě je jedna možnost, v šabloně si vykreslit formulář po svém:

{!$form->render('begin')}

{foreach $form->getComponents(TRUE, 'Nette\Forms\IFormControl' as $formcontol} {
    ...
    {if $formcontrol->name !== 'submitbutton'}
	    {!$formcontrol->label}
	    {!$formcontrol->control}
	    ...
	    //použít nějak $formcontrol->name k přístupu k dalším datům?
    {/if}
}
{!$form['submitbutton']->control}
{!$form->render('end')}

Editoval jasir (26. 7. 2009 12:48)

na1k
Člen | 288
+
0
-

Tohle jsem zkoušel jako první, ale narazil jsem na to, že RadioList má v controlu všechny inputy po hromadě a jediné, co je dělí je (zvenčí zřejmě nastavitelný) $separator. Ten mi ale stačit nebude pokud chci mít na jednom řádku tabulky v jedné buňce input, v další popisek a v další třeba ještě cenu. Viz API

Ale prostě netuším, kam zasáhnout, protože když si ohnu RadioList tak, aby se renderoval řekněme po jednom inputu, budu muset ohnout i Rendered a to už mi přijde jako velký zásah kvůli takové blbince.

jasir
Člen | 746
+
0
-

na1k napsal(a):

Ale prostě netuším, kam zasáhnout, protože když si ohnu RadioList tak, aby se renderoval řekněme po jednom inputu, budu muset ohnout i Rendered a to už mi přijde jako velký zásah kvůli takové blbince.

Okej, co takhle udělat si vlastní MyRadioList, kde třeba můžeš přepsat jen metodu getControl(), přidat jí vlastní argument $descriptions a rendrovat si to v něm jak potřebuješ?
Tj. k dvojici $label, $control přidat ještě $description?

<?php
class MyRadioList extends RadioList {
  public function getControl($key=NULL,$descriptions=NULL)
  {
  }
}
?>

btw. všiml sis toho parametru $key? Nepomohl by ti nějak?

na1k
Člen | 288
+
0
-

Ta poznámka o $key mě vyloženě nakopla, nějak jsem to předtím přehlížel. Stejně jsem se ale nevyhnul vlastnímu čerstvému FormControl (při dědění z RadioList jsem narazil na nějaké problémy) a potom ruční renderování (právě kvůli iterování přes jednotlivé inputy a dodávání správného $key)

Výsledek vypadá takto (musím se pochlubit :)), díky za pomoc ;)

jasir
Člen | 746
+
0
-

na1k se chlubí: Výsledek vypadá takto (musím se pochlubit :)), díky za pomoc ;)

Vypadá to pěkně, zkus se pochlubit kódem ;-) Myslím, že by nás to docela zajímalo :)

Editoval jasir (27. 7. 2009 22:39)

na1k
Člen | 288
+
0
-

Nějak mi uniklo, že ještě někdo reagoval :)

O kód se samozřejmě rád podělím, ale předem upozorňuju, že kvalita není zrovna vysoká (jen teď nemám čas to opravovat) – bylo potřeba to udělat co nejrychleji a funkčně. Protože je to celkem dlouhé, pastnul jsem to jinam

Popravdě ani nevím, jestli to splňuje všechny náležitosti FormControlu – vyráběl jsem to úpravou stávajícího RadioButtonu. Pokud uvedete v $desc pouze dvě hodnoty, nebude prostřední sloupec rozdělený na dva řádky. Použití je následující

<?php
// Hodnoty (popisky) se použijí pouze v případě, že nepoužijeme $desc
$opts = Array(0 => 'Dobírka', 1 => 'Převod');
// Popisky položek, jejich rozmístění je vidět ve zdrojáku, párování je na základě klíčů
$desc = Array(
   0 => Array('Dobírka', 'Zboží vám zašleme poštou', '150,-'),
   1 => Array('Převod + Osobní převzetí', 'Zaplatíte převodem a vyzvednete u nás', '0,-'),
);
// ExtendedRadio
$radio = new ExtendedRadioList('metody', $opts, $desc);
$form->addComponent($radio, 'methods');
?>