Předání id formuláři z presenteru
- Marsme
- Člen | 75
Ahoj,
mám formulář pro editaci nastavení kategorií v eshopu. Pokud jsem v šabloně tak v její action si předám id a přes setter injection ho předám formuláři. Přesto třída formuláře nemá správnou hodnotu.
Formulář
<?php
namespace EshopModule;
use Nette\Application\UI\Form,
EshopModule\Renderers;
class CategoryAddForm extends Form
{
/** @var Category */
private $category;
/** @var int */
private $categoryId;
public function __construct(Category $category)
{
parent::__construct();
$this->category = $category;
}
public function buildForm()
{
$form = $this->form;
$form->getElementPrototype()->class("form-horizontal");
$form->setRenderer(new Renderers\SettingsFormRenderer());
$form->addProtection("Vypršel časový limit žádosti, odešlete prosím formulář znovu!");
$form->addText("name", "Název")
->setRequired("Musíte vyplnit položku '%label'");
$form->addText("menuname","Název v menu")
->setRequired("Musíte vyplnit položku '%label'");
$form->addText("link_rewrite", "Link rewrite")
->setOption("description", "Link rewrite je podoba názvu kategorie pro url.")
->setRequired("Musíte vyplnit položku '%label'");
$form->addSubmit("save", "Uložit");
$form->onSuccess[] = callback($this, "formProcess");
return $form;
}
public function formProcess(Form $form)
{
$values = $form->getValues();
try {
if (isset($this->categoryId) && $this->categoryId !== NULL) {
//update...
} else {
//insert...
}
} catch (Exception $e) {
$this->presenter->flashMessage($e->getMessage(), "alert-error");
}
$this->presenter->redirect("default");
}
public function setCategoryId($id)
{
$this->categoryId = $id;
}
}
?>
A v presenteru si předám id:
<?php
private $categoryId;
protected function createComponentCategoryAddForm()
{
$form = new CategoryAddForm($this->context->category);
$form->buildForm();
$form->setCategoryId($this->categoryId);
return $form;
}
public function actionCategoryDetail($id)
{
$this->categoryId = $id;
$this["categoryAddForm"]->setDefaults($this->category->getCategoryDetail($id));
$this->template->categoryId = $id;
$this->template->parameters = $this->category->getRows("id,name,unit", "category_parameters", "hidden=0");
}
?>
Přesto se mi do formuláře id nepředá i přes to že mám za to že action je v životním cyklu volána mnohem dřív než dojde k tomu zavolání továrničky formuláře.
Co s tím?
Verze nette 2.1.
- Oli
- Člen | 1215
Továrnička je volaná pokud je potřeba, takže ji můžeš myslím zavolat od startupu po {control} v šabloně.
Můžeš to zkusit předat v action tak jak máš ten setDefaults().
Prvně jsem myslel, že to máš dělaný továrničkou, ale až pozdějc jsem zjistil, že to je poděděný. Správnější přístup je myslím továrna. Ono to je hlavně přehlednější. Taky jsem to používal takhle, jako ty. Použití továrny je ale o mnoho přehlednější, minimálně tím, že v šabloně presenteru nemáš definici formuláře, pokud ji vytváříš ručně…