Dynamická hodnota selectu a inputu u formuláře z komponenty

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

Ahoj,

potýkám se s takovým problémem. Mám v administraci seznam aut a při kliknutí na tlačítko upravit, se mi zobrazí single page konkrétního auta se zadanými údaji, které můžu upravit, tak aby se editovali. Problém je, že nevím jak v inputech zobrazit aktuální value a v selectu daný selected, abych věděl z jaké hodnoty vlastně upravuju

Formulář tvořím klasicky v presenteru stylem:

<?php

protected function createComponentEditForm()
{
$form = new Form();
$form->addText('price','Cena');
atd atd atd....
}

?>

A v template pak vykresluju pomocí „{control editForm}“. Kdybych sestavoval formulář klasicky až v html v šabloně, tak bych to samozřejmě řešil jednoduše:

<?php

{foreach $cars as $car}
<input type="text"  name="price" id="price" value="{$car->price}"/>
....

?>

Ale tím, že vykresluju formulář jako komponentu, nevím jak to nastavit. Díky za rady

vvoody
Člen | 910
+
0
-

Každý input (control) má metódu setDefaultValue

protected function createComponentEditForm()
{
	$form = new Form();
	$form->addText('price','Cena')->setDefaultValue('...');
}

alebo celý formulár zase metódu setDefaults

protected function createComponentEditForm()
{
	$form = new Form();
	$form->addText('price','Cena');

	$form->setDefaults(array(
		'cena' => '...'
	));
}
Donkeykong
Člen | 39
+
0
-

Moc dekuju za info. Ale jak v presenteru predam ty konkretni parametry? Myslim tim jak k nim ziskam pristup? V carRepository mam

<?php

public function findSingle($id)
	{
		return $this->findBy(array('id'=> $id));
	}

?>

a v presenteru pote:

<?php
public function renderSingle($id)
	{
		$this->template->cars = $this->carRepository->findBy(array('id'=>$id));
	}
?>

Cili v sablone pak neni problem predavat hodnoty pomoci foreach a nasledne $car->price $car->speed atd.

Ale jak vlozim idealne ty hodnoty sem primo v presenteru?

<?php

$form->setDefaults(array(
> 		'cena' => '...'
> 	));
?>

Editoval Donkeykong (2. 8. 2013 13:12)

Oli
Člen | 1215
+
0
-

Mělo by to vypadat asi takhel nějak:

private $cars;

public function actionSingle($id)
{
	$this->cars = $this->carRepository->findBy(array('id'=>$id));
	$this['editForm']->setDefaults(array(
		'price' => $this->cars->price,
		// ...
	));
}

protected function createComponentEditForm()
{
	$form = new Form();
	$form->addText('price','Cena');
	// ...
}

Editoval Oli (2. 8. 2013 13:25)

Donkeykong
Člen | 39
+
0
-

Toto uz jsem prave predtim zkousel a dostaval jsem: Cannot read an undeclared property Nette\Database\Table\Selection::$price.

Oli
Člen | 1215
+
0
-

nejsem si jistej jestli je to tím, ale mas ten vystup z repository zakoncenej ->fetch()? Něco jako:

...
$this->carRepository->findBy(array('id'=>$id))->fetch();
...

Ten kod co jsem ti poslal by to tiž měl fungovat ;-)

Donkeykong
Člen | 39
+
0
-

Ah, pridal jsem fetch a uz to slape. Diky. Chtel bych se ale zeptat jak je rozdil mezi

<?php

$this->carRepository->findBy(array('id'=>$id))->fetch();

?>

a

<?php
$this->carRepository->findBy(array('id'=>$id));

?>

V dokumentaci se u fetch pise: Returns next row of result. Ale to mi nejak nedava smysl.

Oli
Člen | 1215
+
0
-

Fetch vrati jeden radek. Pokud ho neuvedes tak vraci objekt, kterej musis prohnat foreachem. Pokud by jsi tam nemel fetch, tak by to slo (coz neni dobre) hodit do foreach bloku a nastavit limit na 1 a pristoupit az tam k tem hodnotam.

Donkeykong
Člen | 39
+
0
-

Moc diky, uz chapu