Výroba formulářové komponenty v továrničce

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

Ahoj,

tak jsem se konečně rozhodl, že přestanu objevovat kolo a pustil jsem se do studia Nette. Snažil jsem se poctivě projít co šlo, ale bez pomoci se nejspíš neobejdu. Tak bych poprosil o radu s následujícím:

Podle tohoto popisu jsem pochopil, že pro vytvoření komponenty pomocí továrničky by mělo stačit vytvořit v Presenteru funkci createComponent<Name> a pak už v šabloně rovnou používat {control <Name>}.

Tak jsem zkusil do Presenteru vložit:

<?php
	protected function createComponentUploadForm ($name)
	{
		// generování formuláře na úvodní stránce
		$UploadForm = new AppForm(this,'UploadForm');
		$UploadForm->addFile('obrazek', 'Vyberte obrázek ze svého disku:')
				->addRule(Form::MIME_TYPE, 'Vybraný soubor není obrázek jpg', 'image/jpg');
		$UploadForm->addSubmit('submit1', 'Nahrát obrázek na server')
			 	->onClick[] = 'OkClicked'; // nebo 'OkClickHandler'
		return $UploadForm;
	}
?>

a v šabloně mám:

...
{control UploadForm}
...

Ale vyhazuje to, že komponenta neexistuje: Component with name 'UploadForm' does not exist.

Ještě bych se chtěl zároveň zeptat na jednu věc – v příkladu v quickstartu jsou komponenty jako potomci Control. Mezi presenterem a controlem rozdíl chápu, jenom jsem chtěl vědět jestli práce s komponentama v továrničce funguje uplně stejně v obou. Zrovna u tohoto příkladu jsem trochu v rozpacích, kam komponentu umístit. Formulář mi přijde jako prvek sloužící k interakci s uživatelem, ale tady na fóru jsem viděl, že je všichni dávají do presenteru.

Díky

Editoval sventek (3. 1. 2010 19:09)

redhead
Člen | 1313
+
0
-
  1. komponenta musí začínat malým pismenem, někdo tu už řikal, že by to tu chybovou zprávu chtělo lépe vysvětlit (u metody továrničky bude podle pravidel slušného psaní začínat velkým)
  2. rozdíl není. Jde o to, co je to za komponentu, u formu do presenteru. Např. u nějaké tabulkové komponenty, ktera bude obsahovat další komponentu např. pro vyrenderovaní paginatoru, tak do componenty/controlu.
redhead
Člen | 1313
+
0
-

ještě jsem si všiml chybky:

$UploadForm = new AppForm($this, 'UploadForm'); //this musí začínat dolarem ($this)
Ondřej Mirtes
Člen | 1536
+
0
-

Patří tam malé u – uploadForm.

Práce s továrničkami funguje v obou stejně, protože Presenter je potomek Controlu.

De facto všichni potomci třídy Control slouží k interakci s uživatelem, že :) Formulář můžeš mít jak v Presenteru, tak jakou součást nějaké komponenty.

sventek
Backer | 16
+
0
-

Díky za rychlé reakce. Velikost prvního písmene si teď uvědomuju, že jsem někde četl, ale neudržel. $this byl překlep. Ale bohužel ani po těch změnách se nestala žádná změna:
Component with name 'uploadForm' does not exist.

Nemá být ještě něco zmíněno v renderDefault, případně jestli nevadí, že je to celé v DefaultPresenter?

Vypadá to asi následovně:

<?php
class DefaultPresenter extends Presenter
{
	public function renderDefault()
	{
		// obecné popisky
		$this->template->title = "Titulek";
	}
	protected function createComponentuploadForm ($name)
	{
		// generování formuláře na úvodní stránce
		$uploadForm = new AppForm($this,'uploadform');
		$uploadForm->addFile('obrazek', 'Vyberte obrázek ze svého disku:')
				->addRule(Form::MIME_TYPE, 'Vybraný soubor není obrázek jpg', 'image/jpg');
		$uploadForm->addSubmit('submit1', 'Nahrát obrázek na server')
			 	->onClick[] = 'OkClicked'; // nebo 'OkClickHandler'
		return $uploadForm;
	}
}
?>
Ondřej Mirtes
Člen | 1536
+
0
-
  1. Stačí napsat: $uploadForm = new AppForm;
  2. Hlavička metody má být: protected function createComponentUploadForm()
  3. Na komponentu se pak odkazuješ: $this['uploadForm'] či v šabloně {control uploadForm}

Je pravda, že velikost písmen u názvů komponent má dost velký WTF faktor, chtělo by to s ním něco udělat.

sin
Člen | 82
+
0
-

to createComponentuploadForm musi byt createComponent<Name> coz znamena createComponentUploadForm a pak uz dale to volas jako <name> pokud se nepletu… aspon me to tak funguje…

redhead
Člen | 1313
+
0
-

nemělo by to být jedno? PHP je case-insensitive co se týče názvu funkcí/metod (samozřejmě, pro přehlednost píšeme velké písmeno). Spíš jestli tu komponentu využíváš v šabloně (přes {widget}) u view toho DefaultPresenteru. Ono v šablonách jiných presenterů fungovat samozřejmě nebude. Jestli ji potřebuješ ve všech presenterech tak továrničku dej do BasePresenteru.

redhead
Člen | 1313
+
0
-

Jinak další WTF faktor, jak sem už několikrát viděl (a já se nachytal taky) je u toho constructoru/returnu pro připojení k rodiči. Možná bychom s tou dokumentací měli konečně něco dělat..

sventek
Backer | 16
+
0
-

Paráda pánové. Děkuju mnohokrát.

Pokud by někdo narazil na stejný problém, tak dávám funkční kombinaci velkých/malých písmen:

<?php
protected function createComponentUploadForm ($name)
	{
		// generování formuláře na úvodní stránce
		$uploadForm = new AppForm($this,'uploadForm'); // závorka není nutná !
		$uploadForm->addFile('obrazek', 'Vyberte obrázek ze svého disku:')
				->addRule(Form::MIME_TYPE, 'Vybraný soubor není obrázek jpg', 'image/jpg');
		$uploadForm->addSubmit('submit1', 'Nahrát obrázek na server')
			 	->onClick[] = 'OkClicked'; // nebo 'OkClickHandler'
		return $uploadForm;
	}
?>