Zpracování editačního formuláře

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

Zdravím,

zasekl jsem se na takovém problému. Mám v modelu třídu, která mi generuje formulář, podle dat vytažených z jiné třídy. Formulář se správně vykreslí i s hodnotami v databázi, ale když ho chci odeslat, tak se mi to nedostane do metody onSuccess. Naopak se znovu volá metoda createComponent a začne zase vykreslovat formulář, jenže nyní už nemám naplněné proměnné, takže se formulář nevykreslí a skončí to na výjimce. Přikládám metody z presenteru a metodu z modelu pro vytvoření formuláře. Předem díky za rady.

<?php

	  public function createComponentEditForm(){

		 $this->dataTable = new \App\Model\Zakazky();

		 $form = $this->dataTableManager->getEditForm($this->dataTable, $this->id);

		 return $form;


	  }

	  public function editFormSucceeded($form)
{

		$values = $form->values;
		$this->dataTableManager->zakazkyEdit($values);
		$this->redirect("Homepage:");
}




public function getEditForm(\App\Model\IDataTable $dataTable, $id){

		$data = $this->getItemById($dataTable, $id);
		$sloupce = $dataTable->getTableColums();
		$columsTitles = $dataTable->getTableColumsTitle();


		 $form = new Nette\Application\UI\Form;
        $form->elementPrototype->addAttributes(array('class' => 'sky-form boxed'));

		$i = 0;
		foreach ($data as $item) {
			$form->addText($sloupce[$i], $columsTitles[$i])
					->setDefaultValue($item);

			$i++;
		}

        $form->addSubmit('send', 'Uložit');

        $form->onSuccess[] = array($this, 'editFormSucceeded');

		return $form;



	}


?>

Editoval hancs (15. 6. 2016 13:07)

David Matějka
Moderator | 6445
+
0
-

Naopak se znovu volá metoda createComponent

pri zpracovani se formular musi znovu vytvorit, aby nette znalo jeho strukturu, vsechny validacni pravidla a hlavne callback. Nevyvola se vyjimka prave nekde v getEditForm kvuli chybejicim datum, jak pises?

hancs
Člen | 57
+
0
-

Ano přesně tak, nemám hodnotu id. Zeptám se tedy, jak si ho nejlépe předat?

David Matějka
Moderator | 6445
+
0
-

A jaky data ti chybeji, ze to vyhazuje vyjimku? ukaz vice kodu..

hancs
Člen | 57
+
0
-

Fukce getItemById mi vrati null, protože id je null. Id je id prvku v databázi.

<?php
	public function getList(\App\Model\IDataTable $dataTable){
		$data = $this->db->table($dataTable->getTableName());
		$sloupce = $dataTable->getTableColums();
		$id = $dataTable->getID();
		$columsTitles = $dataTable->getTableColumsTitle();
		return array($data,$sloupce,$id, $columsTitles);

	}

	public function getItemById(\App\Model\IDataTable $dataTable, $id)
	{
		$dataPole = $this->getList($dataTable);
		$data = $dataPole[0];
		return $data->where('id', $id)->fetch();
	}

?>

A předávám si ho v renderEdit

<?php
  public function renderZakazkyEdit($id){
		   $this->dataTable = new \App\Model\Zakazky();
		   $this->template->id = $id;
		   $this->id = $id;



	  }

?>
David Matějka
Moderator | 6445
+
+1
-

inicializuj to v actionZakazdyEdit a v render metode to akorat posles do sablony

public function actionZakazkyEdit($id){
	$this->dataTable = new \App\Model\Zakazky();
	$this->id = $id;
}

public function renderZakazkyEdit($id){
	$this->template->id = $this->id;
}

a vsechny ty modelove tridy by sis mel registrovat jako sluzby a predavat pres DI

hancs
Člen | 57
+
0
-

Díky moc za radu, už to funguje. K těm modelovým třídám. Já používám rozhraní, které mi ostatní třídy co reprezentují tabulky v databázi implementují, tak abych mohl generovat editační formuláře nezávisle na tabulce. Když je přidám přes DI a zaregistruju je, tak nevím, jak bych potom volil, jestli požít instanci zakázky, nebo např. zboží.