Vlastní renderer

- Oggy
- Člen | 306
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

- PetrP
- Člen | 587
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.

- na1k
- Člen | 288
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í
FormControla 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
RadioListrenderovat po jednom inputu? To už by ale byl prakticky novýFormControla 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
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
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
na1k napsal(a):
Ale prostě netuším, kam zasáhnout, protože když si ohnu
RadioListtak, aby se renderoval řekněme po jednom inputu, budu muset ohnout iRendereda 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
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 ;)


- na1k
- Člen | 288
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');
?>