Formulář jako Komponenta
- LiborM
- Člen | 15
Zdravím fórum,
hledal jsem způsob jak si definovat formulář, který budu používat několikrát v celé aplikaci.
Vytvořil jsem si (taky z důvodů naučení se) Komponentu s formulářem.
soubor BugFormControl.php (app\components) s definicí Komponenty :
<?php
class BugFormControl extends Control{
public $onFormClick; // handler na obsloužení formuláře
public $form;
public function __construct($parent,$name) {
parent::__construct($parent,$name);
$this->form=new AppForm($this,'form');
$this->form->addText('pokus','Pokus');
$this->form->addSubmit('odeslat','Odeslat')
->onClick[]=array ($this,'onFormClick');
}
public function render() {
$template = $this->template;
$template->form=$this->form;
$template->setFile(dirname(__FILE__) . '/BugFormControl.phtml');
$template->render();
}
public function handleOnFormClick(SubmitButton $button) {
$this->onFormClick();
}
}
?>
soubor BugFormControl.phtml (app\components) s layoutem formuláře
včetně manuálního vykreslování prvků formuláře :
<?php
{control form begin}
{!$form['pokus']->label} -----> {!$form['pokus']->control}....{!$form['odeslat']->control}
{control form end}
{control form errors}
?>
Do souboru HomePresenter.php (app\presenters) jsem přidal :
<?php
public function startup() {
parent::startup();
$form=new BugFormControl($this,'bugForm');
$form->onFormClick[]=array ($this,'clickBugForm'); //obsloužení handleru
}
....
....
public function clickBugForm(SubmitButton $button) {
$value=$button->getForm()->getValues();
$this->flashMessage($value['pokus']);
}
?>
A do souboru default.phtml (templates\Homepage) jsem přidal :
<?php
....
<div>
<p>{$message}</p>
{control bugForm} // Vykreslení formuláře
</div>
....
?>
Mám otázku na fórum…Je tento způsob vytváření formuláře korektní ?
Pokud ne, proč ?
Pokud Ano, jsem rád a doufám, že to někomu pomůže
LiborM
- Vyki
- Člen | 388
No.. určitě by bylo lepší použít továrničku.
<?php
//komponenta
class Mojekomponenta extends Control
{
[...]
public function render()
{
[...]
$this->template->setFile(__DIR__. '/sablona.phtml');
$this->template->render();
}
}
//a v presenteru volat
[...]
public function createComponentMojekomponenta()
{
return new Mojekomponenta();
}
[...]
?>
//a v sablone
{widget mojekomponenta}
Je jedno jestli v té komponentě vytváříš form, nebo třeba menu, základní princip se neliší. EDIT: A ještě dej pozor na
<?php
new AppForm($this,'form');
//pouzij jenom
new AppForm;
?>
viz: https://forum.nette.org/…rm-setmethod
Editoval Vyki (27. 3. 2010 23:15)
- Šaman
- Člen | 2664
Ahoj, můžete někdo nahodit řešení otázky o post výše, pls?
Rekapitulace:
Nějak mi to nejde pospojovat callbackama tak, abych po odeslání
formuláře zavolal metodu presenteru
HomepagePresenter->clickBugForm()
. Případně z toho co
funguje, je něco doporučeno dělat jinak? Rád bych (si) vytvořil takový
tutorial jak na znovupoužitelné formuláře, pochopitelný i pro ty co
komponenty ještě netvořili. Díky.
HomepagePresenter: (kódy patří do Skeletonu z verze 0.93)
<?php
class HomepagePresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->message = 'We hope you enjoy this framework!';
}
public function createComponentBugFormControl()
{
$form = new BugFormControl;
$form->onFormClick[] = callback ($this,'clickBugForm');
return $form;
}
public function clickBugForm(SubmitButton $button) {
$value = $button->getForm()->getValues();
$this->flashMessage($value['pokus']);
}
}
?>
Komponenta BugFormControl:
<?php
class BugFormControl extends Control{
public $onFormClick; // handler na obsloužení formuláře
public $form;
public function __construct() {
parent::__construct();
$this->form = new AppForm();
$this->form->addText('pokus','Pokus');
$this->form->addSubmit('ok', 'Send')
->onClick[] = callback ($this,'onFormClick');
}
public function render() {
$this->template->form = $this->form;
$this->template->setFile(dirname(__FILE__) . '/BugFormControl.phtml');
$this->template->render();
}
public function handleOnFormClick(SubmitButton $button) {
$this->onFormClick();
}
}
?>