Formulář jako Komponenta

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

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

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)

LiborM
Člen | 15
+
0
-

Děkuju za připomínky.

Jen bych se ještě rád zeptal jak pak obsloužit v továrničce

událost z formuláře :

	[...]
$this->form->addSubmit('odeslat','Odeslat')
    ->onClick[]=array ($this,'onFormClick');
	[...]

LiborM

Šaman
Člen | 2653
+
0
-

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();
    }
}
?>