Formulář není spojen s presenterem
- loov
- Člen | 49
Pokusím se Vám nastínit svoji situaci. Po kliknutí na odkaz ve stránce chci, aby se mi zobrazil formulář s předvyplněnými daty. Snažím se to řešit nějak takto:
V šabloně je vykreslen odkaz:
<?php
<a n:href="vykresliEditForm! $task->data->idz">Upravit</a>
?>
V presenteru pak mám metodu na vytvoření formuláře:
<?php
public function handleVykresliEditForm($idz)
{
$form = $this->createComponentEditTaskForm($idz);
$form->onOkClick[] = callback($this, 'editTaskOkClick');
$this->template->form = $form->render();
}
?>
Samotný formulář získávám přez tuto metodu:
<?php
public function createComponentEditTaskForm($idz)
{
if(!empty ($idz))
{
$task = Task::getTaskById($idz);
if (!isset($task))
throw new ExceptionResourceNotFound("Požadované zadání nebylo nalezeno.");
}
else
{
throw new ExceptionResourceNotFound("Nemohu načíst data z databáze. Neznámé idz.");
}
$form = new formZadaniMaturitniPrace($task);
return $form;
}
?>
V definici formuláře mám
<?php
/** tovarnicka na formular */
public function createComponentFormZadaniMaturitniPrace($name)
{
$form = new NAppForm($this, $name);
?>
A zde zjišťuju zda byl form odeslán
<?php
if(!$form->isSubmitted())
$form->setDefaults($this->defaults);
?>
Jenže pokud nyní kliknu na odkaz ve stránce pro vykreslení formu vyskočí mi laděnka s touto chybou Form is not anchored and therefore can not determine whether it was submitted. Mohli by jste mi prosím nějak poradit co bych měl udělat?
Editoval loov (25. 2. 2011 7:57)
- Foowie
- Člen | 269
formZadaniMaturitniPrace
je komponenta která obsahuje
továrničku na formulář? „A zde zjišťuju zda byl form odeslán“ …
kde zde? V action metodě? V render metodě? v konstuktoru komponenty
formZadaniMaturitniPrace
? v továrničce formuláře?
Pokud je formZadaniMaturitniPrace
, předej i v konstruktoru
presenter a jméno komponenty, jako například do formuláře.
- Mikulas Dite
- Člen | 756
Tohle se nepoužívá
$this->createComponentEditTaskForm($idz);
Jo, je to hodně matoucí…
Místo toho se to volá takhle (https://api.nette.org/…ntainer.html#…)
$this->getComponent('editTaskForm');
// resp.
$this['editTaskForm'];
Edit: to tvoje createComponentEditTaskForm
ale není
továrnička v pravém slova smyslu, tedy takový, která by generovala
component
. Jestli je třída formZadaniMaturitniPrace
jenom potomek Form
, tak to stačí zaregistrovat pomocí https://api.nette.org/…ntainer.html#…
$this->addComponent(IComponent $component, string $name);
Původně tu „továrničku“ voláš s parametrem $task
, ten
ale patří až metodě render. Továrnička dostává automaticky
$name
.
Ujasni si, co je pravá IComponent
a ověř, jestli ji vždy
registruješ pomocí továrničky, která se volá správně.
Editoval Mikulas Dite (24. 2. 2011 21:23)
- loov
- Člen | 49
Fowie:
- ano formZadaniMaturitniPrace je třída která dědí z NControl a obsahuje továrničku na formulář
<?php
public function createComponentFormZadaniMaturitniPrace($name)
{
$form = new NAppForm($this, $name);
?>
- a dále v té továrničce se také nachází onen if
<?php
if(!$form->isSubmitted())
$form->setDefaults($this->defaults);
?>
merlinof:
- né v tom by chyba být neměla
Mikulas Dite:
- metoda $this->createComponentEditTaskForm($idz) není továrnička jako
taková to máš pravdu tahle metoda mě vlastně má získat data z databáze
prostřednictvím $idz
- pak se v ní (
createComponentEditTaskForm
) již zavolá formZadaniMaturitniPrace($task) což už je třída obsahující továrničku a která má za úkol vrátit naplněný formulář daty
- pak se v ní (
- ona totiž žádná komponenta EditTaskForm ne-existuje, používám jeden
formulář na editaci i zadávání dat, onen
createComponentFormZadaniMaturitniPrace
, který je ve tříděformZadaniMaturitniPrace
, takže si myslím, že$this['editTaskForm'];
by mě nepomohlo - tedy já když chci vytvořit editační formulář (z metody
createComponentEditTaskForm
se zda že by to mžl být formulář s názvem editTaskForm), tak vlastně chci vytvořitcreateComponentFormZadaniMaturitniPrace
a naplnit ho daty
Snad to říkám dost srozumitelně, doufám… :-) Teď mě napadá, že
problém by skutečně mohl být v typo, protože já se snažím skrze
createComponentEditTaskForm
vytvořit
createComponentFormZadaniMaturitniPrace
. No dneska si k tomu sednu
mrknu na to. Moc díky za odpovědi ;-) A jestli Vás ještě
něco napadne sem s tím, budu jen rád když se naučím s nette zacházet co
nejlépe.
Editoval loov (25. 2. 2011 9:52)