[Best practice] Hodnoty ->setDefaults()

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
0
-

Jak nastavit setDefaults nejlépe, aby se po odeslání nevzikala chyba s chybějící hodnotout? Ukážu na kódu:

// formulář pro editaci
protected function createComponentRecordForm()
{
	$form = new Form;
	$id = $this->getParam("id"); // číslo záznamu
	$defaults = $this->models->myModel->getRecord($id); // hodnoty našeho záznamu

	$form->addText(...);
	// ...

	$form->setDefaults($defaults);
	// ...
}

Zde nastane po odeslání vždy problém s tím, že $defaults není definováno.

Jak to děláte vy?

EDIT: Odstraněny zavádějící informace.

Editoval Schmutzka (6. 1. 2012 23:04)

Patrik Votoček
Člen | 2221
+
+2
-

Řeším to celkem dost jednoduše. V továrničce na komponenty pouze inicializuju komponentu se všemi jejími závislostmi. Rozhodně v továrničce komponentu / formulář neplním defaultními daty.

class FooPresenter extends BasePresenter
{
	protected function loadItem($id)
	{
		$item = $this->getContext()->itemService->find($id);
		if (!$item) {
			$this->flashMessage("Item with id $id does not exist", 'error');
			$this->redirect('default'); // aka items list
		}
		return $item;
	}

	protected function createComponentRecordForm()
	{
        	$form = new Form;
		$form->addText(...);
	        // ...
	}

	public function actionEdit($id)
	{
		$item = $this->loadItem($id);
		$defaults = $this->someMagicHere($item);
		$this['recordForm']->setDefaults($defaults);
	}
}
Filip Procházka
Moderator | 4668
+
0
-

Souhlasím s Patrikem, prakticky není co dodat :)

Tomáš Votruba
Moderator | 1114
+
0
-

Pěkné, díky. To mi vytáhlo trn z paty.

Montanus
Člen | 10
+
0
-
	public function actionEdit($id)
	{
		$this->template->title = 'Edtiovat: Texty';

		$this->pole = $this->model->getTable('texty')->fetch($id);

		if (!$this->pole) throw new BadRequestException;

		$this["recordForm"]->setDefaults($this->pole);
	}

$this[„recordForm“] to nezná: Component with name ‚recordForm‘ does not exist.
Co dělám špatně, díky. Mám verzi pro PHP 5.2

Felix
Nette Core | 1189
+
0
-

Mas nekde funkce

public function createComponentRecordForm() {..}

?

Montanus
Člen | 10
+
0
-

Felix napsal(a):

Mas nekde funkce

public function createComponentRecordForm() {..}

?

Jo tak to funguje :-D Díkes ;-)

Jan Mikeš
Člen | 771
+
0
-

Muzu se zeptat jak potom v callbacku po odeslani formulare rozlisujete zda se jedna o editaci nebo pridavani, nebo mate 2 ruzne callbacky v zavislosti na view?

Trosku jsem se na tom zasekl a nevim co z toho by bylo cistejsi reseni nebo neco uplne jineho co me nenapadlo…

Jan Endel
Člen | 1016
+
0
-

Osobně mám většinou při editaci parametr id v url. Takže stačí jen:

$id = (int) $this->getParam('id');

if ($id > 0) {
//edituju
}
else {
//přidávám
}
Jan Mikeš
Člen | 771
+
0
-

Ano, nad tim jsem premyslel. Pak je zde jeste moznost pridat hidden input s id, jenze tomu lze podstrcit rozdilnou hodnotu nez je v parametru url.

Z hlediska best practice me proto zajimalo co pouzivate vy, nebo jestli nekdo navrhne nejake reseni o ktere jsem netusil :)

Tomáš Votruba
Moderator | 1114
+
0
-

Lexi napsal(a):

Ano, nad tim jsem premyslel. Pak je zde jeste moznost pridat hidden input s id, jenze tomu lze podstrcit rozdilnou hodnotu nez je v parametru url.

Z hlediska best practice me proto zajimalo co pouzivate vy, nebo jestli nekdo navrhne nejake reseni o ktere jsem netusil :)

Veškeré odpovědi na své otázky bys měl najít v Kuchařce: Jak předávat id při editaci záznamu