Komponenta tvoriaca formulare

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

Zdravim,
chcel by som vytvorit komponentu, ktora bude generovat formulare na zaklade dat z databazy (tam su ulozene otazky a mozne odpovede). V podstate chcem poskladat AppForm podla instrukcii z DB.

Dostal som sa po bod, ked viem formular(ten z mojej komponenty) vykreslit, ale ked kliknem na submit tlacitko nic sa neudeje.

Ma niekto napad, ako sa dostat k spracovaniu formularu ? (tipujem, ze je to totalna malickost)

prikladam zjednoduseny kod:

presenters/DefaultPresenter.php:

<?php

require_once dirname(__FILE__) . '/BasePresenter.php';
require_once APP_DIR . '/controls/FormGenerator.php';

class DefaultPresenter extends BasePresenter
{

   	public function renderDefault()
	{
		$formGenerator = new FormGenerator($this, 'generatedForm');
	}
}
?>

controls/FormGenerator.php

<?php


class FormGenerator extends Control
{

	public function render()
	{
		$form = new AppForm;
		$form->addText('policko', 'popiska')
			->addRule(Form::FILLED, 'prosim vypnit');
		$form->addSubmit('tlacitko', 'Submit tlacitko');
		$form->onSubmit[] = array($this, 'tlacitkoSubmitted');

		$this->template->form = $form;
		$this->template->setFile(APP_DIR . '/templates/FormGenerator/default.phtml');
		$this->template->render();
	}


	public function tlacitkoSubmitted(AppForm $form)
	{
		$this->flashMessage('HURA !! Formular bol odoslany.');
		redirect("Default:test");
	}

}
?>

templates/Default/default.phtml

	{block #content}
	Sem pride generovany formular: <br />
	{control generatedForm}
	{/block}

templates/FormGenerator/default.phtml

	{$form}

(pouzivam Nette 9.1 / PHP 5.2)

Dakujem za kazdu radu!
Tomas

Davelister
Člen | 28
+
0
-

Zkus ten AppForm pridelat k tomu form generatoru.
Takhle ti ten AppForm visi ve vzduchu(nema rodicovskou komonentu), takze nevi na jakou url se odeslat.

$form = new AppForm($this,'form-name');
tomolas
Člen | 66
+
0
-

Dakujem, skusil som..
$form = new AppForm($this,‚meno‘);
ale nefunguje.

predtym sa formular odosielal na tu adresu, na ktorej bol zobrazeny. Teraz na ?do=generatedForm-meno-submit a hlasi chybu:

BadSignalException #403

The signal receiver component ‚generatedForm-meno‘ is not found.

Mate este nejaky napad ?

Dakujem

Editoval tomolas (4. 12. 2009 18:18)

redhead
Člen | 1313
+
0
-

v render metodách je už pozdě. Doporučuju to dát do továrniček createComponent<NazevKomponenty>()

public function createComponentGeneratedForm()
{
	new FormGenerator($this, 'generatedForm');
}
// a potom stejně u controlu
public function createComponentMeno()
{
                $form = new AppForm($this, 'meno');
                $form->addText('policko', 'popiska')
                        ->addRule(Form::FILLED, 'prosim vypnit');
                $form->addSubmit('tlacitko', 'Submit tlacitko');
                $form->onSubmit[] = array($this, 'tlacitkoSubmitted');
}

Editoval redhead (4. 12. 2009 18:24)

Ondřej Mirtes
Člen | 1536
+
0
-
public function createComponentGeneratedForm()
{
        return new FormGenerator($this, 'generatedForm');
}

Navíc mi ten kód přijde trochu prapodivný, v submit metodě bys měl volat $this->presenter->flashMessage, aby se ta zprávička předala šabloně presenteru.

A musíš volat $this->redirect().

Navíc když chceš mít formulář jak komponentu, tak bych ho extendoval od AppForm a prvky přidával v konstruktoru (a nezapomeň volat konstruktor rodiče). Mít ho extendovaný od Control a pak se ještě starat o jeho renderování je nepohodlné.

tomolas
Člen | 66
+
0
-

Dakujem za odpovede!
stale sa ale stracam. >>redhead nechapem tomu rozdeleniu(preco vytvarat 2 komponenty, ked chcem 1 ?).. idem mi o to, aby som mohol jednym volanim vytvorit do stranky formular.
Nieco na system:

{control FormGenerator 5} //5 bude id formulara ulozene v db, podla ktoreho poskladam vysledny formular

Prvky formulara sa nevykreslia, ale do vystupu stranky sa dostane:

Sem pride formular: <br /> <br />
<form action="/blabla/?do=generatedForm-submit" method="post">

</form>

kod som trocha zmenil..
formGenerator.php:

<?php


class FormGenerator extends AppForm
{
	private $form;

	public function __construct($parent = NULL, $name = 'dummy_name')
	{
		$this->form = new AppForm($parent, $name);
		$this->form->addText('policko', 'popiska');
		$this->form->addSubmit('tlacitko', 'Submit tlacitko');
		$this->form->onSubmit[] = array($this, 'tlacitkoSubmitted');

#		parent::__construct($parent, $name); 	// co ma byt tu ? mam to volat pred,
		parent::__construct();					// alebo az po vsetkom
	}


	public function tlacitkoSubmitted(FormGenerator $form)
	{
		echo 'sme tu';
	}

}
?>

DefaultPresenter.php

<?php

require_once dirname(__FILE__) . '/BasePresenter.php';
require_once APP_DIR . '/controls/FormGenerator.php';

class DefaultPresenter extends BasePresenter
{
    	public function renderDefault()
	{
	}


	public function createComponentGeneratedForm()
	{
		return new FormGenerator($this, 'meno');
	}
}
?>

templates/Default/default.phtml:

{block #content}
Sem pride formular: <br /> <br />
{control generatedForm}
{/block}

Vidi niekto kde je problem ?

Dakujem za kazdu reakciu!
Tomas

Ondřej Mirtes
Člen | 1536
+
0
-

Určitě je špatně třeba to, že podle továrniky se formulář jmenuje generatedForm, ale v konstruktoru mu dáváš jméno meno.

bazo
Člen | 620
+
0
-

mozes to urobit dvoma sposobmi: bud tu komponentu podedis od Control alebo od AppFormu.
ako control:

<?php
class FormGenerator extends Control
{
        private $form;

        public function __construct()
        {
                $this->form = new AppForm($this, 'form');
                $this->form->addText('policko', 'popiska');
                $this->form->addSubmit('tlacitko', 'Submit tlacitko');
                $this->form->onSubmit[] = array($this, 'tlacitkoSubmitted');
		return $this->form;
        }

        public function tlacitkoSubmitted($form)
        {
                echo 'sme tu';
        }
	public function render($nejaky_var) //nejaky var pride z {control formGenerator var}
	{
		echo $this->form; //tu sa ti to vykresli
	}
}
?>

alebo AppForm

<?php
class FormGenerator extends AppForm
{
        public function __construct()
        {
        		parent::__construct();
                $this->addText('policko', 'popiska');
                $this->addSubmit('tlacitko', 'Submit tlacitko');
                $this->onSubmit[] = array($this, 'tlacitkoSubmitted');
				$this->addText('bla', 'bla');
        }


        public function tlacitkoSubmitted($form)
        {
                echo 'sme tu';
        }

		public function render($nejaky_var)
		{
			echo $this;
		}
}
?>

ked zavolas {control formGenerator 5} tak sa zavola $this['formGenerator]->render(5)

tomolas
Člen | 66
+
0
-

Och..
..tak toto v konstruktore je samozrejme blbost. Neuvedomil som si, ze teraz dedim od AppForm a uz nie od Control

<?php
..
$this->form = new AppForm($parent, $name);
$this->form->addText('policko', 'popiska');
..
?>

spravne bude

<?php
$this->addText(...)
?>

Dakujem za pomoc!

redhead
Člen | 1313
+
0
-

tomolas napsal(a):

>>redhead nechapem tomu rozdeleniu(preco vytvarat 2 komponenty, ked chcem 1 ?)..

ajta krajta, neber to v úvahu, špatně jsem si to přečet. Dávám si facku.