QuickStart – formulář načtení hodnot

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

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
+
0
-

Ahoj, je fajn že jsi dal odkaz, ale PHP skripty z důvodu bezpečnosti, krádeží …, nejdou stahovat defaultně. Přepiš ho na *.txt

Zkoušíš aplikaci na localhostu?

kralik
Člen | 230
+
0
-

Opraveno.
Ano na localhostu, (přes WAMP)

Díky

h4kuna
Backer | 740
+
0
-

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
+
0
-

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
+
0
-

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í :-)