Formulář needituje ale ukládá znovu
- tutdelafrut
- Člen | 3
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
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
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
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:
- 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
- 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
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);
}
}
?>