Ako získať premennú z {widget } vo funkcii createComponent?

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

Zdravím,
je možné nejako získať premennú $param1 zo šablony

<?php
  // šablona
  {widget Form $param1}
?>

a použiť ju v továrničke?

<?php
    public function createComponentForm($name) {
        $form = new AppForm($this, $name);
	$param1 = ?????
	if ($param1) {
		....
	}
        return $form;
    }
?>

viem, že $param1 sa pošle ako parameter do metódy render, ale ak vytváram AppForm, potom nepoužívam render, ale priamo v createComponent vytváram formulár a na základe $param1 by som chcel niektoré položky do formulára pridať a niektoré nepridať. Ako to môžem urobiť? Ďakujem.

Ondřej Mirtes
Člen | 1536
+
0
-

Bohužel, to nijak nejde a odporuje to i logice. Všechno nastavení formuláře už musí být přístupné v továrničce. Kdybys mu předal nějaká nastavení až při renderování widgetu, tak by o nich při zpracování (v submit metodě) vůbec nevěděl.

Napiš, co konkrétního chceš provést, a najdeme alternativní řešení.

gawan
Člen | 110
+
0
-

Len som si chcel ušetriť písanie. Mám dva podobné formuáre, ktoré sa líšia len v jednej položke. Napríklad:

<?php

public function createComponentFormAAA($name) {
    	$form = new AppForm($this, $name);
    	$form->addText('spolocne1', 'spoločná položka 1');
    	$form->addText('spolocne2', 'spoločná položka 2');
        // ... atď
    	$form->addText('aaa', 'specialna položka pre form AAA');
	return $form;
}

public function createComponentFormBBB($name) {
    	$form = new AppForm($this, $name);
    	$form->addText('spolocne1', 'spoločná položka 1');
    	$form->addText('spolocne2', 'spoločná položka 2');
        // ... atď
    	$form->addText('bbb', 'specialna položka pre form BBB');
	return $form;
}

?>

a myslel som, že by sa to dalo robiť pomocou jednej metódy nejako takto:

<?php

public function createComponentForm($name) {
    	$form = new AppForm($this, $name);
    	$form->addText('spolocne1', 'spoločná položka 1');
    	$form->addText('spolocne2', 'spoločná položka 2');
        // ... atď
	if ($premenna_widget == 'AAA' {
	    	$form->addText('aaa', 'specialna položka pre form AAA');
	} else {
	    	$form->addText('bbb', 'specialna položka pre form BBB');
	}
	return $form;
}

?>

a potom by mi stačilo v šablóne akurát použiť:

<?php
	{widget form 'AAA'}
	{widget form 'BBB'}
?>

je niečo také možné?

_Martin_
Generous Backer | 679
+
0
-

Protože na tohle není žádné Best Practice, řešil bych to asi takto:

	private function createComponentFormBase()
	{
		$form = new AppForm;
		$form->addText('spolocne1', 'spoločná položka 1');
		$form->addText('spolocne2', 'spoločná položka 2');

		return $form;
	}


	protected function createComponent($name)
	{
		if($name == 'FormAAA') {
			$form = $this['formBase'];
			$form->addText('aaa', 'specialna položka pre form AAA');
			return $form;

		} elseif($name == 'FormBBB') {
			$form = $this['formBase'];
			$form->addText('bbb', 'specialna položka pre form BBB');
			return $form;

		} else {
			return parent::createComponent($name);
		}
	}

Popravdě, osobně bych si udělal „vlastní továrničku“ na ten formulář (tj. ne createComponentXXX) a potom dvě standardní továrničky pro formulář AAA a BBB a v nich bych si zavolal tu vlastní a k získanému formu bych přidal potřebný prvek.

LuKo
Člen | 116
+
0
-

Šlo by to i tímto způsobem?

<?php
private function createBaseForm($name) {
    	$form = new AppForm($this, $name);
    	$form->addText('spolocne1', 'spoločná položka 1');
    	$form->addText('spolocne2', 'spoločná položka 2');
        // ... atď
	return $form;
}

public function createComponentFormAAA($name) {
    	$form = createBaseForm($name);
    	$form->addText('aaa', 'specialna položka pre form AAA');
	return $form;
}

public function createComponentFormBBB($name) {
    	$form = createBaseForm($name);
    	$form->addText('bbb', 'specialna položka pre form BBB');
	return $form;
}
?>
	{widget formAAA}
	{widget formBBB}
Ondřej Mirtes
Člen | 1536
+
0
-

Zrušil bych ty atributy $name (ty metody tento parametr nepotřebují, viz https://forum.nette.org/…iewtopic.php?…), protože by mohly dělat nepořádek, jinak je to imho v pořádku.

v6ak
Člen | 206
+
0
-

Odporuje logice? To snad ne. Ale odporuje to současnému systému.
Stačí si představit, že máš továrnu na továrnu na formuláře. (Už vidím tu výrobní linku, ze které vyjíždí továrny…) To by šlo už teď, jen by se to blbě používalo.
Tak jinak: instance továrnou již vytvořeného objektu (zde formuláře) by byla identifikována jak názvem továrny, tak jejími parametry, nejlépe v nějakém normalizovaném tvaru. Pak v tom nevidím jakýkoli problém.

Ondřej Mirtes
Člen | 1536
+
0
-

Ano, rozhodně by to nějakým způsobem šlo udělat, ale rozhodně ne předáváním parametrů až v render fázi, což gawan dělal. Tím jsem myslel, že to odporuje logice.

v6ak
Člen | 206
+
0
-

No ten můj způsob to dělá přesně tak.

Teď mě ale napadá, že by byl problém s identifikací formulářů (zpracování odeslání). Řešit by to šlo strukturovaným ID, ale to by bylo ještě větší překopání frameworku.

A stále si myslím, že to neodporuje logice, jen je to (možná poněkud zásadnější) změna současného systému.

Ondřej Mirtes
Člen | 1536
+
0
-

A jak se formulář dozví o tom, jak má být nastavený (např. při zpracování), když je tato informace až v render fázi – šabloně?

LuKo
Člen | 116
+
0
-

Tato úprava chování Controlu po vzoru Presenteru je asi nesmysl, že?

<?php
class MyControl extends Control
{
	public function action($param) { ... }
        public function render($param) { ... }

	public function actionSmall($param) { ... }
        public function renderSmall($param) { ... }
}

class MyPresenter extends Presenter
{
	public function createComponentMyControl()
	{
		return new MyControl;
	}
}
?>
{control myControl "AAA"}
{control myControl:small "BBB"}
v6ak
Člen | 206
+
0
-

No jde o to, že by muselo být možné tyto argumenty předat i přes id formuláře při zpracovávání požadavku. Říkám, určité překopání by to chtělo.
LuKo: Nerozumím, ale asi jo.

Ondřej Mirtes
Člen | 1536
+
0
-

Jak zajistíš volání těch action metod? Nezapomeň na zavolání i před přijímáním signálu.

LuKo
Člen | 116
+
0
-

S komponentami se teprve sžívám, proto zatím nedokážu odhadnout, co by zavedení action metod obnášelo za úpravy logiky frameworku. Podvědomě tuším, že je to blbost, ale co kdyby náhodou byla nějaká možnost to tak udělat ;-)

Jan Tvrdík
Nette guru | 2595
+
0
-

Zatím vyjdi z předpokladu, že je to totální blbost a dále se tím nezabývej.