Jak předávat id při editaci záznamu
Chcete-li editovat záznam, musíte předat jeho id ukládající funkci.
Můžete k tomu sice použít $form->addHidden(), ve většině
případů je ale vhodnější použít persistentní
parametr.
Nejdůležitějším poznatkem z celého kódu je však fakt, že práva k záznamu se musí kontrolovat i v akci, i v signálu. Odeslání formuláře je také signál (přistupný z url).
use Nette\Application\UI\Form;
use Nette\Application\BadRequestException;
use Nette\Application\ForbiddenRequestException;
class RecordPresenter extends BasePresenter
{
/** @persistent int */
public $id;
/** @var object */
private $record;
/**
* Edit record
*/
public function actionEdit($id)
{
// načtení záznamu z databáze
$this->record = $this->model->records->fetch($id);
if (!$this->record) { // kontrola existence záznamu
throw new BadRequestException;
} elseif ($this->record->userId != $this->user->id) { // kontrola oprávnění
throw new ForbiddenRequestException;
}
$this["recordForm"]->setDefaults($this->record); // nastavení výchozích hodnot
}
/**
* Form to edit record
*/
protected function createComponentRecordForm()
{
$form = new Form;
$form->addText("myValue", "Name:", 20, 60);
$form->addSubmit("send", "Send");
$form->onSuccess[] = callback($this, "recordUpdate");
return $form;
}
/**
* Record update
* @form recordForm
*/
public function recordUpdate(Form $form)
{
if (!$this->record) { // kontrola existence záznamu
throw new BadRequestException;
}
$values = $form->getValues();
$this->model->records->update($this->record->id, $values);
$this->flashMessage("Record updated!", "success");
$this->redirect("edit");
}
}
Dalším krokem může být vyčlenění získání záznamu do samostatné metody.
Stejný formulář pro přidání i uložení záznamu
Tedy pro jeden formulář pro více akcí je třeba upravit výše uvedený kód takto:
/**
* Form to manage record
*/
protected function createComponentRecordForm()
{
// ...
$form->onSuccess[] = callback($this, "processRecordForm");
// ...
}
/**
* Record process
* @form recordForm
*/
public function processRecordForm(Form $form)
{
if ($this->id AND !$this->record) { // kontrola existence záznamu pouze v případe editace
throw new BadRequestException;
}
$values = $form->getValues();
if($this->id) { // upravujeme záznam
$this->model->records->update($this->record->id, $values);
$this->flashMessage("Record updated!", "success");
$this->redirect("edit");
}
else { // přidáváme záznam
$this->model->records->insert($values);
$this->flashMessage("Record inserted!", "success");
$this->redirect("default");
}
}
petr.pavel | 27. 3. 2012, 20:59 | comment
Myslím, že by to chtělo vysvětlit, jak se do $this->model dostal model.