Formulář není spojen s presenterem

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

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
+
0
-

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.

merlinof
Člen | 5
+
0
-

není chyba v typo? Sry jestli to je blbost teprve se tu rozkoukávám, ale řekl bych že Nette je hodně citlivé na názvy

ale v šabloně máš: href="vykresliEditForm!

a v presenteru function handleVykresliEditForm

Mikulas Dite
Člen | 756
+
0
-

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
+
0
-

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
  • 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řit createComponentFormZadaniMaturitniPrace 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)

loov
Člen | 49
+
0
-

Tak to co bylo potřeba udělat, bylo zaregistrovat si tu komponentu. Moc díky Mikulášovi jestli se někdy uvidíme na poslední sobotě zvu tě… :)