Výroba formulářové komponenty v továrničce
- sventek
- Backer | 16
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
- 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)
- 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.
- Ondřej Mirtes
- Člen | 1536
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
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
- Stačí napsat:
$uploadForm = new AppForm;
- Hlavička metody má být:
protected function createComponentUploadForm()
- 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.
- redhead
- Člen | 1313
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.
- sventek
- Backer | 16
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;
}
?>