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");
	}
}