Tabulkový renderer (několi sloupců), nastavování počátečních hodnot a psaní vlastního rendereru obecně
- v6ak
- Člen | 206
Někdy je potřeba vykreslovat formulář do tabulky tím způsobem, že mám pár sloupců a třeba v každém řádku několik formulářových vstupů. Toho lze v zásadě docílit dvěma způsoby:
- hrát si s formulářem v šabloně (zavání to strašnýma prasárnama, ostatně jsem byl za takové šablony kritizován)
- udělat vlastní renderer
O možnosti psát vlastní renderer jsem věděl již dávno. Teprve teď
jsem se do toho ale pustil. Myslel jsem si, že to bude relativně jednoduché.
Ale mýlil jsem se. Moc jsem si nepomohl i s děděním
z ConventionalRendereru a přepsáním renderBody, což sice taky do jisté
míry funguje, ale není to IMHO úplně čisté (logiku původní třídy
nespecializuji, ale měním).
Dostal jsem se tedy do fáze, kdy mi to funguje až na nastavování
počátečních hodnot (výchozí hodnoty, hodnoty ze špatně vyplněného
formuláře), částečně jsem to ohackoval a v podstatných rysech to
evidentně funguje jak má, ale nadšen z toho nejsem. Při vynechání
volání setRenderer na formuláři funguje vyplňování hodnot jak má.
Podíval jsem se na jiné renderery a zjistil jsem, že jich moc není.
ConventionalRenderer je velmi složitý, ScaffoldingRenderer řeší něco
jiného a i u několika málo dalších rendererů jsem nenašel řešení
mého problému. Často jsem našel jen krátkou informaci, že renderer si mohu
napsat vlastní.
- Jak souvisí renderer s nastavováním hodnot? Co tam mohu dělat špatně?
- Řešili jste někdo již vykreslování formuláře do tabulky?
- Kód mám, obsahuje něco málo hacků. Věřím, že takovou funkčnost by uvítalo více lidí. Nechce se někdo toho kódu ujmout? Myslím, že v mých rukou asi nebude podléhat zrovna živelnému vývoji. Vypustit bych jej asi mohl.
- A vůbec, existují nějaké best practices nebo nějaké tipy pro psaní rendererů?
Možná to bude chtít toto téma rozdělit na více částí, ale to spíše teprve uvidíme.
- v6ak
- Člen | 206
Představ si, že máš proměnlivý počet řádků. Pak to asi budeš chtít zpracovat nějakým for cyklem. Ještě by asi šlo, kdyby se šablona nějak dozvěděla o počtu řádků, což ale je taky problém, protože v době vytváření komponenty nelze obvyklým způsobem tyto informace předávat. Další možností je v renderu vynutit vytvoření formulářové komponenty, což je taky hack. Moje řešení tedy spočívalo v projetí formulářových prvků, zpracování jejich názvů, roztřídění do pole a následného vykreslování pole. A to je asi něco úplně jiného, než sis představoval.
- David Grudl
- Nette Core | 8228
V Nette se brzi objeví elastická formulářová komponenta, která bude tento problém řešit.