Jak říct formuláři o existenci inputu, který vytvářím až v BaseControl?

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

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'.
  1. Nechci ruční rendering
  2. 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)

CZechBoY
Člen | 3608
+
0
-

V attached už máš formulář.

Landsman
Člen | 152
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Dá se nějak vynutit založení checkboxu s name obsahující container?
Či získat aktuální container?

Přes $form->getComponent(‚container1[container2]‘); se k němu nedostanu, hledá input :[

Editoval Landsman (16. 9. 2016 20:10)

CZechBoY
Člen | 3608
+
0
-

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.

Landsman
Člen | 152
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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
+
0
-

@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
+
0
-

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)

Landsman
Člen | 152
+
0
-

@Antik Chyba pryč, avšak input se vypsal před moji extension. Lze zakázat konkrétnímu prvku automatický render?

Editoval Landsman (16. 9. 2016 21:36)

Martk
Člen | 661
+
0
-

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
+
0
-

@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
+
0
-

Proč to neudělat takhle? Delam to tak vždy a funguje to. https://github.com/…-control.php