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í
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ž
ConventionalRenderer
u .. 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
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
RadioList
tak, aby se renderoval řekněme po jednom inputu, budu muset ohnout iRendered
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
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');
?>