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 parametr akce.

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
{
    /** @var object */
    private $record;

    /**
     * Edit record
     */
    public function actionEdit($id = 0)
    {
        // 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[] = [$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[] = [$this, "processRecordForm"];
    // ...
}

/**
 * Record process
 * @form recordForm
 */
public function processRecordForm(Form $form)
{
    if ((int) $this->getParameter('id') && !$this->record) { // kontrola existence záznamu pouze v případe editace
        throw new BadRequestException;
    }

    $values = $form->getValues();

    if($this->record) { // 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");
    }
}