QuickStart – formulář načtení hodnot
- kralik
- Člen | 230
Ahoj všichni,
Moc se mi zalíbilo Nette a chtěl bych se v něm naučit. Tak jsem si
vytisknul QuickStart a procházím jej a inspiruji se při psaní své první
aplikace.
Bohužel jsem narazil a nějak se v tom plácám.
Nevím jak v ukázkovém příkladu nabídnout možnost editovat vybranou položku? Link na action Edit funguje, k tomu jsem vytvořil nový form „EditForm“, ale nedaři se mi k jeho prvkům načíst hodnoty z DB pro dané $id.
Rozšiřuji aplikaci QuickStart, takže to celé vychází právě
z ní.
Přikládám odkaz na presenter „StrojlistPresenter“ zde
Mooc díky za rady.
- h4kuna
- Backer | 740
do továrniček se nepředává id, ale jméno továrničky si udělej dump($id); // vypíše se editForm
id si předěj přes nějakou vlastnost v presenteru, udělej si tam třeba
<?php
final class StrojlistPresenter extends BasePresenter {
private $idStroje;
protected function startUp()
{
$this->idStroje = $this->getParam('id');
}
public function createComponentEditForm($id)
{
//$stroj = new Stroj;???
$stroj = $this->model->findStroj($this->idStroje);
//když mám komponentu na vkládání a na editaci stejnou, tak formulář načtu z komponenty pro vkládání
//patřičně upravím onSubmit
$form = $this->createComponentStrojForm();
$form->onSubmit = NULL;
$form->onSubmit[] = callback($this, 'processEditForm');
//nebo si ty submity očísluj $form->onSubmit[0] = callback($this, 'processEditForm');
//a můžeš vynechat $form->onSubmit = NULL;
$data = array(
'nazev' => 'test',
'cislo' => '1254',
);
//$form->setDefaults($data);
$form->setDefaults($stroj);
return $form;
}
?>
Editoval matata (2. 2. 2011 12:15)
- kralik
- Člen | 230
Ahoj díky, už to funguje, jen mi není moc jasný princip.
Píše mi to varování:„Warning: Method StrojlistPresenter::startup() or its
descendant doesn't call parent::startup()“
Pomohl bys mi ještě s metodou Update
Kód:
public function processEditForm(AppForm $form)
{
if($form['save']->isSubmittedBy()) {
$this->flashMessage('Stroj byl editován.');
$values = $form->getValues();
$stroj = new Stroj;
$stroj->nazev = $values['nazev'];
$stroj->cislo = $values['cislo'];
$stroj->sektor = $values['sektor'];
$stroj->linka = $values['linka'];
$stroj->zahajen_provoz = new DateTime;
$this->model->Update($stroj);
}
$this->redirect('Strojlist:show');
}
a v Modelu:
public function update(Stroj $stroj)
{
return dibi::query('UPDATE [stroj] SET', (array) $stroj, 'WHERE [id]=%i', $this->idStroje); // využijeme toho,
}
Ale neproběhne tento update.
Můžu si nějak v Nette vypsat obsah nějaké proměnné nebo jej někde najít jinde?
Mooc díky
Editoval kralik (2. 2. 2011 17:41)
- kralik
- Člen | 230
tak jsem se s tím popral.
nu, začínající lama
přikládám pro úplnost
Část presenteru:
<?php
final class StrojlistPresenter extends BasePresenter
{
/** @var StrojManager */
private $strojManager = NULL;
private $idStroje;
protected function startUp()
{
$this->idStroje = $this->getParam('id');
}
public function createComponentEditForm($id)
{
// najde stroj v DB a zaznam ulozi do pole $stroj
$stroj = $this->model->findStroj($this->idStroje);
//když mám komponentu na vkládání a na editaci stejnou, tak formulář načtu z komponenty pro vkládání
//patřičně upravím onSubmit
$form = $this->createComponentStrojForm();
$form->onSubmit = NULL;
$form->onSubmit[] = callback($this, 'processEditForm');
$form->setDefaults($stroj);
return $form;
}
public function processEditForm(AppForm $form)
{
if($form['save']->isSubmittedBy()) {
$this->flashMessage('Stroj byl editován.');
$values = $form->getValues();
$stroj = new Stroj;
$id = $this->idStroje;
$stroj->nazev = $values['nazev'];
$stroj->cislo = $values['cislo'];
$stroj->sektor = $values['sektor'];
$stroj->linka = $values['linka'];
// $stroj->zahajen_provoz = new DateTime;
$this->model->update($stroj, $id);
}
$this->redirect('Strojlist:show');
}
}
?>
V modelu:
<?php
public function update(Stroj $stroj, $id)
{
return dibi::query('UPDATE [stroj] SET', (array) $stroj, 'WHERE [id]=%i', $id);
}
?>
Díky za nakopnutí :-)