Component with name ‚todoForm‘ does not exist

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

Zdravím,
pokouším se vytvořit Todo aplikaci a mám problém s neexistující třídou. Do souboru Todo.php jsem přidal následující kód pro vykreslení formuláře:

	public function createComponentTodoForm()
	{
		$form = new AppForm;
		$form->addText('text', 'Úkol', 60, 100)
			 ->addRule(Form::FILLED, 'Musíte vyplnit text!');
		$form->addSubmit('save', 'Uložit');
		$form->addSubmit('back', 'Zpět')->setValidationScope(NULL);

		$form->onSubmit[] = callback($this, 'processTodoForm');

		return $form;
	}

	public function processTodoForm(AppForm $form)
	{
		if($form['save']->isSubmittedBy()) {
			$this->flashMessage('Úkol vložen.');
			$values = $form->getValues();

			$todo = new Todo;
			$todo->text = $values['text'];
			$todo->added = new DateTime;
			$this->model->createTodo($todo);
		}
		$this->redirect('Todolist:show');
	}

A v souboru add.phtml, kde by se tento formulář ml vykreslit, mám tyto dva řádky:

{block content}
{widget todoForm}

a při přístupu na stránku, která by tento formulář měla vykreslit, dostanu toto hlášení „Component with name ‚todoForm‘ does not exist.“.
Přeložit si tuto hlášku sice dovedu, ale nevím, kde by měla být chyba, zatím se v Nette trochu plácám a v každé deuhé věci dostanu nějaký error..

Neporadili byste, v čem je tentokrát chyba?

i.magine
Člen | 81
+
0
-

Zkusil bych:

public function createComponentTodoForm($name)
{
        $form = new AppForm($this, $name);

....
Manny7
Člen | 67
+
0
-

tohle jsem už zkoušel, ale bohužel bez výsledku. Začínám přemýšlet, jestli nemám tyto 2 metody umístěny ve špatném souboru

redhead
Člen | 1313
+
0
-

Co je Todo.php? Obě tyhle metody by měly být v presenter třídě.

Manny7
Člen | 67
+
0
-

Posutpoval jsem následovně
Nevěděl jsem, kam umístit ty 2 metody pro formulář, tka jsem je dal do Todo.php (/app/models) – v tomto adresáři mám ještě soubor TodoManager.php
V /app/templates/Todolist/ mám add.php

Ale nějak nevím, co s tou hláškou, která po mně chce „todoForm“ třídu

redhead
Člen | 1313
+
0
-

Teď jsem ti to psal, ty metody musí být ve třídě presenteru (TodolistPresenter.php). Je to napsané i v QS, takže si nepostupoval asi pozorně.. (hláška po tobě nechce třídu, ale componentu jménem todoForm, která se vytváří právě tou metodou createComponentTodoForm a ta musí být v presenteru)

btw: šablony by měly mít koncoku .phtml (ne .php, ale to je detail)

Editoval redhead (25. 7. 2010 16:13)

Patrik Votoček
Člen | 2221
+
0
-

přesněji instanci komponenty s nazvem todoForm.

Manny7
Člen | 67
+
0
-

tak jsme to poupravil, přemístil do TodolistPresenter.php, ale vyskytla se mi ještě chybka – dostávám nyní error typu: „Class ‚AppForm‘ not found“. Ten Error log mi ukazuje na řádek:
„$form = new AppForm;“ – zkoušel jsem tomuto metodu poupravit podle toho, co jsem našel tady na foru:

	public function createComponentTodoForm($name)
	{
		$form = new AppForm($name);
		$form->addText('text', 'Úkol', 60, 100)
			 ->addRule(Form::FILLED, 'Musíte vyplnit text!');
		$form->addSubmit('save', 'Uložit');
		$form->addSubmit('back', 'Zpět')->setValidationScope(NULL);

		$form->onSubmit[] = callback($this, 'processTodoForm');

		return $form;
	}

Ale to budu dostávat pořád tu samou chybku.

Jerry123456789
Člen | 37
+
0
-

Souhlasí verze PHP a Nette? (5.2/5.3)?
a ma to bejt AppForm($this, $name);

Manny7
Člen | 67
+
0
-

Ano, verze PHP a Nette mi souhlasí. A když použiju to, co jsi napsal (AppForm($this, $name);), tak dostanu tuto hlášku: „Class ‚AppForm‘ not found“

Ani
Člen | 226
+
0
-

Tak jde o to jestli nepoužíváš verzi s namespace. Případně jestli máš správně nastavený robotloader. Nicméně v obou případech by to se to zaseklo už dříve.