Komponenta tvoriaca formulare
- tomolas
- Člen | 66
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
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
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
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
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
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
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
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
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!