Formulář needituje ale ukládá znovu

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

Ahoj, začínám s nette a mám problém s editačním formulářem. Používám jeden formulář pro přidávání článků i pro editaci. Do editačního formuláře článek sice načtu, ale znovu se mi přidá a needituje se. Problém je asi v getParameter, ale nevím jaký. Poradí někdo?(nette 2.0.10, PHP 5.3)

clanekPresenter

 protected function createComponentTaskForm()
{
    $kategorie = $this->kategorieRepository->findAll()->fetchPairs('ID_kategorie', 'Vekove_rozmezi');

    $form = new Form($this, 'taskForm');
    $form->addTextArea('Text', 'Článek:')
    $form->addText('Nazev', 'Název:', 40, 100)
        ->addRule(Form::FILLED, 'Je nutné napsat název.');
    $form->addSelect('ID_kategorie', 'Pro:', $kategorie)
        ->setPrompt('- Vyberte -')
        ->addRule(Form::FILLED, 'Je nutné vybrat kategorii.');
    $form->addSubmit('create', 'Vytvořit')->setAttribute('class', 'default');
    $form->onSuccess[] = callback($this,"taskFormSubmitted");
    return $form;
}

public function taskFormSubmitted(Form $form)
{

   $id =$this->getParameter('ID_clanku');
        if ($id > 0) {
            $this->clanekRepository->find($id)->update($form->values);
            $this->flashMessage('Článek upraven.', 'success');
        } else {
            $this->clanekRepository->createClanek($this->getUser()->getId(),$form->values->Text, $form->values->Nazev, $form->values->ID_kategorie);
   $this->flashMessage('Článek přidán.', 'success');
   $this->redirect('Homepage:clanky');
        }
}

clanekRepository

public function createClanek($user, $clanek, $nazev, $assignedKategorie)
{
    return $this->getTable()->insert(array(
        'Text' => $clanek,
        'ID_kategorie' => $assignedKategorie,
        'ID_uzivatel' => $user,
        'Datum_vytvoreni' => new \DateTime(),
        'Nazev' => $nazev
    ));
}
David Matějka
Moderator | 6445
+
0
-

no tak to zalezi s jakym parametrem na stranku s editaci odkazujes :)

mrkni sem, treba to pomuze https://doc.nette.org/…editing-form

tutdelafrut
Člen | 3
+
0
-

matej21 napsal(a):

no tak to zalezi s jakym parametrem na stranku s editaci odkazujes :)

mrkni sem, treba to pomuze https://doc.nette.org/…editing-form

podle toho jsem to zkoušel a nešlo to, asi to pořádně nechápu

myslíš toto?
clanekPresenter

public function renderEdit($id) {
       $form = $this['taskForm'];
          $row = $this->clanekRepository->findBy(array('ID_clanku' => $id))->fetch();
           if (!$row) {
               $this->error('Záznam nebyl nalezen');
           }
           $form->setDefaults($row);


   }
vjirovsky
Člen | 12
+
0
-

Přesně jak píše matej21, mrkni na ten návod.

Tam se ukládá do proměnné třídy

 /** @var object */
    private $record;


...
 $this->record = $this->model->records->fetch($id);

u tebe se sice načtou data do formuláře, ale když to odešle, tak neví ke které položce v databázi to odeslat.

Máš dvě možnosti jak to upravit:

  1. uprav to podle toho návodu (tj. dej to do actionEdit a udělej si proměnnou v třídě (presenteru) kterou si předáš ten řádek z actionEdit do taskFormSubmitted
  2. do formuláře si dej hidden s id které pak budeš zpracovávat (přes $values) – tohle nedoporučuju, měl bys pak k řešení spousty navázaných problémů

Editoval vjirovsky (12. 6. 2013 9:21)

tutdelafrut
Člen | 3
+
0
-

upravil jsem to následovně, ale stále to nefunguje a ukládá se to znovu…pravděpodobně se mi nenačítá to ID_clanku(if ($this->ID_clanku)..poradí někdo?

clanekRepository

class ClanekPresenter extends BasePresenter
{
    public $ID_clanku;

 /** @var Nette\Database\Table\ActiveRow */
	private $clanek;

/** @var Todo\KategorieRepository */
private $kategorieRepository;

/** @var Todo\ClanekRepository */
	private $clanekRepository;

/** @var Todo\UzivatelRepository */
	private $uzivatelRepository;



    protected function startup()
{
    parent::startup();
  $this->clanekRepository = $this->context->clanekRepository;
  $this->uzivatelRepository = $this->context->uzivatelRepository;
    $this->kategorieRepository = $this->context->kategorieRepository;
}

public function renderClanky()
    {
        $this->template->clanky = $this->clanekRepository->najdiNazev();
    }

   public function renderClanek($id = 0) {
        $this->template->clanky = $this->clanekRepository->findId($id)->fetch();

    }

   protected function createComponentTaskForm()
{
    $kategorie = $this->kategorieRepository->findAll()->fetchPairs('ID_kategorie', 'Vekove_rozmezi');

    $form = new Form($this, 'taskForm');
    $form->addTextArea('Text', 'Článek:')
        ->getControlPrototype()->class('mceEditor');
    $form->addText('Nazev', 'Název:', 40, 100)
        ->addRule(Form::FILLED, 'Je nutné napsat název.');
    $form->addSelect('ID_kategorie', 'Pro:', $kategorie)
        ->setPrompt('- Vyberte -')
        ->addRule(Form::FILLED, 'Je nutné vybrat kategorii.');
    $form->addSubmit('create', 'Vytvořit')->setAttribute('class', 'default');
    $form->onSuccess[] = callback($this,"taskFormSubmitted");

    return $form;
}


public function taskFormSubmitted(Form $form)
{
  if ($this->ID_clanku AND !$this->clanek) { // kontrola existence záznamu pouze v případe editace
        throw new BadRequestException;
    }
     $values = $form->getValues();

        if ($this->ID_clanku) {
            $this->clanekRepository->update($this->clanek->ID_clanku,$values);
            $this->flashMessage('Článek upraven.', 'success');
        } else {
            $this->clanekRepository->createClanek($this->getUser()->getId(),$form->values->Text, $form->values->Nazev, $form->values->ID_kategorie);
   $this->flashMessage('Článek přidán.', 'success');
   $this->redirect('Homepage:clanky');
        }
}

       public function actionEdit($ID_clanku) {
       $form = $this['taskForm'];
          $this->clanek = $this->clanekRepository->findBy(array('ID_clanku' => $ID_clanku))->fetch();
           if (!$this->clanek) {
               $this->error('Záznam nebyl nalezen');
           }
           $form->setDefaults($this->clanek);


   }

}
?>
David Matějka
Moderator | 6445
+
0
-

nad $ID_clanku ti chybi anotace @persistent