Formulář pro uložení i editaci nedostane id
- Username
- Člen | 36
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 .
- Username
- Člen | 36
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:
- predat si id pri tvorbe komponenty
- $this->getPresenter()->getParameter(…)
- CZechBoY
- Člen | 3608
Mohlo by ti pomoct: https://doc.nette.org/…editing-form
Jinak moje odpovědi na tvoje otázky:
- 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ě - Nejspíš si o pro to id šaháš už v konstruktoru, můžeš nejdříve
v metodě
attached
(při překrytí nezapomeň zavolatparent::attached($presenter)
. Případně v Nette 2.4 existuje událost$this->onAnchor($sender)
.
- Username
- Člen | 36
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)
- Username
- Člen | 36
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());
}
}