Jak říct formuláři o existenci inputu, který vytvářím až v BaseControl?
- Landsman
- Člen | 152
Dědím BaseControl, kde vytvářím input typu file.
K němu vykresluji ještě dva další inputy (ok), ale formulář o nich
neví, nevrátí mi jejich values v loadHttpData() – vždy NULL;
Jak je připojit k formuláři, aniž bych je tam ručně vytvářel?
Zkoušel jsem je dát do konstruktoru, ale křičel na mě:
Component '' is not attached to 'Nette\Forms\Form'.
- Nechci ruční rendering
- Nechci poděděný vlastní form
is it possible?
EDIT:
přes následující zápis je vidím, ale to není vůbec košér.
$this->getForm()->getHttpData()
Editoval Landsman (16. 9. 2016 19:32)
- Landsman
- Člen | 152
CZechBoY napsal(a):
V
attached
už máš formulář.
Ten mimochodem také používám, i když je tam anotace ve smyslu, že bych je ručně používat. Musím nastavit
$form->getElementPrototype()->enctype = 'multipart/form-data';
Tzn přes to je připojit myslíš? On se renderuje v getControl, takže pro formulář už bude existovat:
Component with name 'officeImage_imageHidden' already exists
Editoval Landsman (16. 9. 2016 19:40)
- CZechBoY
- Člen | 3608
Asi teda nevim co řešíš :-)
Myslel jsem, že řešíš jak si má form control přidat k sobě nějaký
2 pomocný controly a pak v loadHttpData si z nich přečíst odeslaný
informace.
Přidej ty 2 přídavný controly v attached – ten by se měl zavolat
dřív než getControl.
Editoval CZechBoY (16. 9. 2016 19:42)
- Landsman
- Člen | 152
CZechBoY napsal(a):
Asi teda nevim co řešíš :-)
Myslel jsem, že řešíš jak si má form control přidat k sobě nějaký 2 pomocný controly a pak v loadHttpData si z nich přečíst odeslaný informace.
Přidej ty 2 přídavný controly v attached – ten by se měl zavolat dřív než getControl.
Rozumím, já je stále naivně zakládal až v getControl. To bude ono!
:)
Teď už jen zjistit, jak ho vypsat bez HTML::el();
Editoval Landsman (16. 9. 2016 19:51)
- Landsman
- Člen | 152
CZechBoY napsal(a):
Checkbox s názvem containeru? Jakože
mujCheckbox[$ID]
Aktuální container – nevím co si pod tím představuješ :-) Možná že bys ho našel v attached? Form je taky instancí třídy Container.
Ten input, který chci vložit bych rád vložil do stejné „větve“, tedy group, jako vkládám ručně ve formuláři onen input (extension).
Štve mě že $form->getGroups() vrátí prázdné pole.
Editoval Landsman (16. 9. 2016 20:34)
- Martk
- Člen | 661
Napadli mě 2 varianty, čistější:
class CustomControl extends BaseControl {
private $isAttached = FALSE;
public function __construct(...) {
parent::__construct(...);
$this->monitor(Nette\Forms\Container::class);
}
protected function attached($form) {
if ($form instanceof Nette\Forms\Container && !$this->isAttached) {
$this->isAttached = TRUE;
$form->addText('nextInput');
}
}
}
rychlejší:
class CustomControl extends BaseControl {
protected function attached($form) {
if ($form instanceof Nette\Forms\Form) {
$parent = $this->getParent();
$parent->addText('nextInput');
}
}
}
Editoval Antik (16. 9. 2016 20:51)
- Landsman
- Člen | 152
@Antik Díky. Ta první v případě, že je to uvnitř cyklu zakřičí: Component with name ‚nextInput‘ already exists.
Druhá šlape. Jak docílit ale toho, abych to si to mohl vykreslit ručně? Takto se mi to vykreslí vlastně „až za“. Já si v getControl() dělá ale takovou šmakuládu, aby to bylo pohromadě, obaleno divem atd.
Editoval Landsman (16. 9. 2016 21:04)
- Martk
- Člen | 661
Budeš muset controly vytvářet ručně a potom přidávat přes addComponent se třetím parametrem (https://api.nette.org/…ner.php.html#199)
protected function attached($form) {
if ($form instanceof Nette\Forms\Form) {
$parent = $this->getParent();
$parent->addComponent(new TextInput(), 'nextInput', $this);
}
}
- Landsman
- Člen | 152
@Antik Začíná z té věci být solidní porod tyjo.
https://s12.postimg.org/…tion_008.png
Máš na mysli, že si mám udělat nějaký vlastní Checkbox a podobně?
Editoval Landsman (16. 9. 2016 21:27)
- Martk
- Člen | 661
Aha, musí se tam dát jméno komponenty
protected function attached($form) {
if ($form instanceof Nette\Forms\Form) {
$parent = $this->getParent();
$parent->addComponent(new TextInput(), 'nextInput', $this->getName());
}
}
Toto nemám namysli, jen to, že nemůžeš pohodlně přidat komponentu přes addText apod.
Editoval Antik (16. 9. 2016 21:35)
- Martk
- Člen | 661
Pochopil jsem předešlou zprávu tak, že chceš vykreslit přidaný control před rodičem. Zakázat ho lze takhle nepěkně u DefaultFormRenderu, ale raději se bez tohohle obejdi a najdi jiné řešení ve tvém návrhu:
$control->setOption('rendered', true);
Editoval Antik (16. 9. 2016 21:54)
- Landsman
- Člen | 152
@Antik Asi už se blbě vyjadřuji, jak se tu s tím trápím, promiň. Celé to snažení tady je pro takovýto výsledek bez ručního renderu.
Editoval Landsman (16. 9. 2016 22:26)
- Oli
- Člen | 1215
Proč to neudělat takhle? Delam to tak vždy a funguje to. https://github.com/…-control.php