widget parameter

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

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

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

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)

Aurielle
Člen | 1281
+
0
-

Vypadá to, že to ten regulár nevezme, takže se pokročí k parent::createComponent($name)

tomolas
Člen | 66
+
0
-

Bohuzial vezme, do tej vetvy to vleze. Skusal som to.
$match vypada takto:

array
  0 => string 'generatedForm_3' (length=15)
  1 => string '3' (length=1)
redhead
Člen | 1313
+
0
-

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

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 !