widget parameter
- tomolas
- Člen | 66
Zdravim Pani!
narazil som na problem pri predavani parametru z widgetu. Cielom je, aby som v sablone mohol napisat id formulara, ktory chcem vygenerovat (podla toho co mam v databaze). Formular sa nasledne vygeneruje, vykresli aj vyhodnoti sam. Neviem si ale predat parameter. Chcel by som to riesit nasledovne:
sablona:
<?php
{block #content}
Sem pride formular: <br />
{widget generatedForm 3}
{/block}
?>
DefaultPresenter.php:
<?php
...
public function createComponentGeneratedForm()
{
$form = new FormGenerator(3); //ta 3 je id formulara ktory sa posklada -- to je to, co chcem predat z {widget generatedForm XX}
$form->onSubmit[] = array('FormGenerator', 'generatedFormSubmitted');
return $form;
}
...
?>
(FormGenerator dedi od AppForm)
FormGenerator.php:
<?php
class FormGenerator extends AppForm
{
...
public function __construct($form_id) //sem do $form_id by som chcel dostat tu 3 z {widget generatedForm 3}
{
$args = func_get_args();
var_dump($args);
parent::__construct();
... //tu sa podla dat v databaze posklada formular
}
?>
viete mi prosim poradit, ako si predat ten parameter tak, aby som ho mohol pouzit pri skladani formulara v jeho konstruktore ? Je na tom nieco principialne zle ? Je to neskoro na predanie parametru?
Dakujem za kazdu odpoved !
Editoval tomolas (31. 1. 2010 16:45)
- redhead
- Člen | 1313
Jde o to, že widget slouží pouze pro renderování komponenty dle názvu za {widget
{widget abc 3} se přeloží jako
$control->getComponent('abc')->render(3);
abc bude vždy jedna a ta samá komponenta. K tomu, aby jsi mohl použít co potřebuješ, je nutné přepsat metodu createComponent (v presenteru, kde formulář vytváříš), nějak takto:
public function createComponent($name)
{
if(preg_match('/^generatedForm_(\d)*$/'), $name, $match)
{
return new FormGenerator($match[1]);
}
return parent::createComponent($name);
}
(snad tam není chyba, nezkoušel jsem)
Pak lze použít v šabloně toto:
{widget generatedForm_5}
{widget generatedForm_12}
Jinak ti ještě dobře poradím, nepřepisuj constructor u Controlů v Nette. Vyhneš se tím problémům.
Editoval redhead (31. 1. 2010 17:03)
- tomolas
- Člen | 66
Zdravim,
dakujem za radu. Celkom ale nechapem, kde to mam zmenit. V mojom pripade (v presenteru, kde formulář vytváříš) je DefaultPresenter. Ak tam dam toto:
<?php
public function createComponent($name)
{
if(preg_match('/^generatedForm_([0-9]+)$/', $name, $match)){ // moja verzia toho isteho
return new FormGenerator($match[1]);
}
return parent::createComponent($name);
}
?>
dostanem chybu:
Component with name 'generatedForm_3' does not exist.
(update)
sablona:
{block #content}
Takze tu sme v Default:default <br />
{widget generatedForm_3}
{/block}
Navyse toto riesenie (ak sa to podari spojazdnit) mi pride ako ‚trik‘. Je to jediny pristup k tomuto problemu ?
Editoval tomolas (1. 2. 2010 16:13)
- redhead
- Člen | 1313
Ono to nemusí být ani v tom reguláru, ale třeba v tom, že se komponenta nepřipojí k presenteru. A v tom je kámen úrazu u přepisování konstruktoru. Navíc mám pocit, že vracení komponenty returnem umí jenom vývojová verze (přidáno nedávno, myslím).
Zkus takhle:
//FormGenerator
public function __constructor($formId, $parent = NULL, $name = NULL)
{
parent::__constructor($parent, $name);
//...
}
//továrnička v presenteru
public function createComponent($name)
{
if(preg_match('/^generatedForm_([0-9]+)$/', $name, $match)) {
new FormGenerator($match[1], $this, $name); //tady se na return nehledi
}
parent::createComponent($name); //tady logicky taky ne
}
Editoval redhead (1. 2. 2010 16:23)
- tomolas
- Člen | 66
Dakujem !
Zabralo to. Vynoril sa este jeden problem: co s validaciou takeho formulara?
Hladala sa totiz metoda generatedForm_3Submited.
Stacilo vo FormGenerator.php pri vytvoreni formulara pridat
<?php
$this->onSubmit[] = array('FormGenerator', 'generatedFormSubmitted');
?>
Teraz sa formular vytvori, vykresli aj validuje podla toho parametra.
Este raz dakujem za rady !