Formulář pro uložení i editaci nedostane id

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Username
Člen | 36
+
0
-

Ahoj, prosím o pomoc, učím se s Nette a postupně předělávám web, co jsem splácal. Rád bych přesunul formuláře z presenteru do samostatné třídy. Narazil jsem na problém, kdy nevím, proč se mi nepředává Id ($klientId) editovaného záznamu. Snažil jsem se přečíst, co se dalo, ale bez úspěchu.

Továrna:

namespace App\KlientiModule\Forms;

use Nette;
use Nette\Application\UI\Form;
use Nette\SmartObject;
use App\KlientiModule\Model\KlientiManager;

class KlientFormFactory extends Form
{
/** @var Nette\Database\Context */
private $database;
/** @var KlientiManager */
private $klientiManager;

public function __construct(Nette\Database\Context $database, KlientiManager $klientiManager)
{
$this->database = $database;
$this->klientiManager = $klientiManager;
}

public function create()
{
$form = new Form;
$form->addEmail('email', 'E-mail:')
->addRule(Form::EMAIL, 'Email nemá správný formát');

$form->addSubmit('odeslat', 'Odeslat');

$form->onSuccess[] = [$this, 'processForm'];
return $form;
}

public function processForm($form, $values)
{
$klientId = $this->getParameter('klientId'); // tady to vyhodí chybu
if ($klientId) {
$this->klientiManager->upravKlienta($klientId, $values);
} else {
$this->klientiManager->ulozKlienta($values);
}
}

}

Presenter:

namespace App\KlientiModule\Presenters;

use Nette;
use App\KlientiModule\Forms;
use App\KlientiModule\Model\KlientiManager;

class KlientPresenter extends \App\KlientiModule\Presenters\BasePresenter
{
/** @var KlientiManager */
private $klientiManager;

public function __construct(KlientiManager $klientiManager)
{
$this->klientiManager = $klientiManager;
}

/** @var Forms\KlientFormFactory @inject */
public $klientFormFactory;

protected function createComponentKlientForm()
{
$form = $this->klientFormFactory->create();
$form->onSuccess[] = function ($form, $values) {
$this->flashMessage("Úprava proběhla úspěšně.", 'success');
$this->redirect('default');
};

return $form;
}

public function actionUpravit($klientId = NULL)
{
$klient = $this->klientiManager->vypisKlienta($klientId);
if (!$klient) {
$this->error('Klient nebyl nalezen');
}
$this['klientForm']->setDefaults($klient->toArray());
}
}

Děkuji za váš čas a pomoc .

CZechBoY
Člen | 3608
+
0
-

Ty totiz tahas parametr komponenty, ale realne je to parametr presenteru.
Takze dve moznosti:

  1. predat si id pri tvorbe komponenty
  2. $this->getPresenter()->getParameter(…)
Username
Člen | 36
+
0
-

1. predat si id pri tvorbe komponenty
myslíš tím v presenteru v Action medodě?
2. $this->getPresenter()->getParameter(…)
To mi vráti chybu Component '' is not attached to ‚Nette\Application\UI\Presenter‘.

CZechBoY napsal(a):

Ty totiz tahas parametr komponenty, ale realne je to parametr presenteru.
Takze dve moznosti:

  1. predat si id pri tvorbe komponenty
  2. $this->getPresenter()->getParameter(…)
CZechBoY
Člen | 3608
+
0
-

Mohlo by ti pomoct: https://doc.nette.org/…editing-form

Jinak moje odpovědi na tvoje otázky:

  1. V action metodě si uložíš ID do property ($this->id = $id) a potom v createComponent ho předáš továně a ta ho předá komponentě
  2. Nejspíš si o pro to id šaháš už v konstruktoru, můžeš nejdříve v metodě attached (při překrytí nezapomeň zavolat parent::attached($presenter). Případně v Nette 2.4 existuje událost $this->onAnchor($sender).
Username
Člen | 36
+
0
-

Děkuji za odkaz, četl jsem ho, ale můj problém mi neobjasnil. Už asi týden projíždím fórum, ale většina dotazů se týká formulářů v UI\Control, ale já jej mám v UI\Form, protože mi to přišlo jednoduší. Tak si říkám, že když většina používá formuláře v UI\Control tak to bude mít důvod, a jestli by nebylo lepší se pokusit také svůj formulář předělat do UI\Control? Vycházel jsem z https://doc.nette.org/…s/form-reuse

Editoval Username (21. 8. 2017 21:26)

CZechBoY
Člen | 3608
+
0
-

Ty mas primo tu tovarnicku implementovanou po svym (nepouzivas generovou tovarnicku). Takze ti staci pridat parametr do metody create($id) v te tve FormFactory.

Username
Člen | 36
+
0
-

Udělal jsem úpravy, které můj problém nevyřešily. V čem dělám chybu? Děkuji za pomoc.
Továrna:

namespace App\KlientiModule\Forms;

use Nette;
use Nette\Application\UI\Form;
use Nette\SmartObject;
use App\KlientiModule\Model\KlientiManager;

class KlientFormFactory extends Form
{
/** @var Nette\Database\Context */
private $database;
/** @var KlientiManager */
private $klientiManager;
/** @var int */
private $klientId;

public function __construct(Nette\Database\Context $database, KlientiManager $klientiManager)
{
parent::__construct();
$this->database = $database;
$this->klientiManager = $klientiManager;
}

public function create($klientId)
{
$klientId = $this->klientId;
$form = new Form;
$form->addEmail('email', 'E-mail:')
->addRule(Form::EMAIL, 'Email nemá správný formát');

$form->addSubmit('odeslat', 'Odeslat');

$form->onSuccess[] = [$this, 'processForm'];
return $form;
}

public function processForm($form, $values)
{
$klientId = $this->klientId;
if ($klientId) { // id se nepředá, protože se tato podmínka nevykoná a uloží se nový záznam
$this->klientiManager->upravKlienta($klientId, $values);
} else {
$this->klientiManager->ulozKlienta($values);
}
}

}

Presenter:

namespace App\KlientiModule\Presenters;

use Nette;
use App\KlientiModule\Forms;
use App\KlientiModule\Model\KlientiManager;

class KlientPresenter extends \App\KlientiModule\Presenters\BasePresenter
{
/** @var KlientiManager */
private $klientiManager;
/** @var int */
private $klientId;

public function __construct(KlientiManager $klientiManager)
{
$this->klientiManager = $klientiManager;
}

/** @var Forms\KlientFormFactory @inject */
public $klientFormFactory;

protected function createComponentKlientForm()
{
$form = $this->klientFormFactory->create($this->klientId);
$form->onSuccess[] = function ($form, $values) {
$this->flashMessage("Úprava proběhla úspěšně.", 'success');
$this->redirect('default');
};

return $form;
}

public function actionUpravit($klientId)
{
$this->klientId = $klientId;
$klient = $this->klientiManager->vypisKlienta($klientId);
if (!$klient) {
$this->error('Klient nebyl nalezen');
}
$this['klientForm']->setDefaults($klient->toArray());
}


}
CZechBoY
Člen | 3608
+
0
-

mas obracene prirazeni v create metode, spravne takto

$this->klientId = $klientId;

Editoval CZechBoY (23. 8. 2017 0:03)

Username
Člen | 36
+
0
-

Paráda už to šlape, mockrát ti děkuji za pomoc a trpělivost se začátečníkem.

CZechBoY
Člen | 3608
+
0
-

nz. klidne se ptej :-)