Jak nejlépe seskládat formulář

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

Mám takovýto problém:
Mám komponentu (datagrid), která v každém sloupci na druhém řádku bude mít nějaký input,select, nebo jiný formulářový prvek. Celý řádek pak bude formulář – tedy jeden formulář – bude to sloužit k vyhledávání ve sloupcích.
Takže v 1. sloupci vygeneruji:

<?php
    /** vygeneruje formularovy prvek */
    public function generateInput()
    {
        $this->searchInput = new TextInput('label');
    }
?>

A teď potřebuji (v presenteru nebo stačí přímo v šabloně) vzít všechny objekty, které mají ve vlastnosti searchInput nějaký objekt (extends FormControl) a „obalit je“ AppForm (abych mohl poté zpracovat v komponentě ten formulář).

Můžete mi někdo poradit jak v Nette obalit ty jednotlivé formulářové prvky do formuláře? A jak s ním potom pracovat? Důležité také je, že musím v šabloně ty prvky rozmístit stylem (ručně) – ten kód je vymyšlený:

<?php
  <tr><td>{$form->input1->render()}</td></tr>
?>

Máte s tím někdo zkušenost, nebo můžete mě někam odkázat. Nějak to nemohu nikde najít.

xificurk
Člen | 121
+
0
-

Jestli tomu dobře rozumím, bylo by nejlepší udělat si vlastní Renderer pro daný typ formuláře, který by právě toto obalení ohlídal… otázka je, jak moc je ta tabulka závislá na dalších datech, které nemají s formulářem „nic společného“.

Jakub Šulák
Člen | 222
+
0
-

Zeptám se jinak, jak mohu objekt typu $i = new TextInput(‚Label‘) vypsat do šablony pomocí {$i}?

Vím, že takto jednodušše to nejde, vypíše se chyba, že neexisujte metoda __tostring().
Takže tento objekt musím něčím obalit, ne? Pokud bych to obalil něčím, co tu metodu __tostring (nebo jiný renderovací nástroj), tak se mi to vypíše.

Mohu si samozřejmě udělat vlastní odvozenou třídu, ale nechci vrtat do frameworku, jistě tohle umí sám – jen já nevím jak.

kravčo
Člen | 721
+
0
-

najjednoduchšie je použiť input spolu s formulárom

$form = new Form;
$form->addText('moj_text', 'Toto je môj text:');

pričom formulár je v šablóne možné vykresliť pomocou {$form} (štandardne pomocou triedy ConventionalRenderer). Pre vlastné prispôsobenie vykresľovania je odporúčané napísať si vlastný renderer. Inak je možné použiť metódy getControl() & getLabel(), ktoré vrátia html prvku & jeho popisu (v tom poradí). Avšak v prípade, že údaje z formulára sa niekde ďalej spracúvajú, treba všetko ostatné (napr. správne url actionu pre formulár) vykresliť taktiež ručne…