Zpracování editačního formuláře
- hancs
- Člen | 57
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
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
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
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
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ží.