Jak ručně renderovat formulář s konteinery

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

Ahoj, zkouším ručně renderovat formulář s konteinery (2 úrovně) ale nějak se mi to nedaří
Formulář vytvářím takto:

$form = new App\DefaultForm();
$cFields = $form->addContainer('fields');
foreach($this->form->fields as $field) {
	$cField = $cFields->addContainer('f'.$field->id);
	$cField->addText('position', 'Pozice');
	$cField->addText('type', 'Typ');
	$cField->addText('param', 'Parametr');
}

Latte šablona vypadá takto

{form formForm}
	{formContainer fields}
		<div n:foreach="$form->controls as $name => $field">
			{formContainer $name}
				{input position}
				{input type}
				{input param}
			{/formContainer}
		</div>
	{/formContainer}
{/form}

Problém je v tom že makro input nemůže najít prvek ve vnořeném konteineru. Hlásí chybu

Component with name ‚position‘ does not exist.

Nejaký nápad?

Jan Tvrdík
Nette guru | 2595
+
0
-

@murdej: Metoda getControls() kterou voláš funguje jinak, než očekáváš. Vrací všechny instance Nette\Forms\IControl rekurzivně. Viz https://github.com/…ontainer.php#L220. Proiteruj radši $form->components.

murdej
Člen | 26
+
0
-

Diky, uz to funguje

{form formForm}
	{formContainer fields}
		<div n:foreach="$formContainer->components as $name => $formField">
		...