Jak předat parametr do továrničky?

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

Ahoj,

můžete mi prosím někdo poradit jak předat parametr do továrničky? Hledal jsem odpověď na fóru ale z rad jsem nebyl moc moudrý…

Jedná se mi o to, že bych potřeboval na stránce vykreslovat více formulářů s různými anketami – proto bych při každém vytvoření formuláře potřeboval dostat ID ankety podle kterého bych si z databáze vytáhl všechny potřebné údaje…

V šabloně mám něco jako:

{foreach $ankety as $anketa}

{control anketaForm, $anketa[‚ID_ankety‘]}

{/foreach}

A v presenteru mám poté následující továrničku:

<?php

protected function createComponentAnketaForm($name, $id_ankety)
{
  $form = new AnketaFormHrac($this, $name);

  $anketa = AnketyModel::getByID($id_ankety);

  ...
}

?>

Vyhazuje mi to následující Warning:

Missing argument 2 for Front_HomepagePresenter::createComponentAnketaForm(), called in C:\Program Files\xampp\htdocs\volejbal\framework\libs\Nette\ComponentModel\Container.php on line 178 and defined

Předem děkuji za všechny rady a tipy :-)

samic
Člen | 18
+
0
-

to je vytvoření více stejných komponent – ale kde je to samotné předávání parametru do každé komponenty? přehlížím něco?

enumag
Člen | 2118
+
0
-

To id máš nejspíš jako parametr akce, takže stačí $this->getParameter('id').

samic
Člen | 18
+
0
-

enumag napsal(a):

To id máš nejspíš jako parametr akce, takže stačí $this->getParameter('id').

To myslíš k tomu i-multiplier nebo k mému kódu? protože pokud k mému kódu tak mi to píše:

Call to undefined method Front_HomepagePresenter::getParameter()

enumag
Člen | 2118
+
0
-

What? Co máš za verzi Nette?

Myslel jsem k tvému kódu.

Editoval enumag (20. 3. 2013 22:17)

samic
Člen | 18
+
0
-

Někdo s nějakou další radou? nebo můžete mi někdo prosím více vysvětlit i-multiplier a zohlednit u toho můj kód? Díky

samic
Člen | 18
+
0
-

enumag napsal(a):

What? Co máš za verzi Nette?

Myslel jsem k tvému kódu.

2.0-beta

cesilek
Člen | 3
+
0
-

Předání parametru do továrničky tvůj problém totiž nevyřeší, protože v Nette nemůžeš vykreslit komponentu se stejným názvem na stránce dvakrát. Budeš tedy muset použít třídu multiplier. Přesné řešení je popsáno v tom odkazu od Noxe.
Předávání id v šabloně se řeší pomocí pomlčky a v továrničce to poté získáš jako parametr té anonymní funkce předávané do consutoru třídy multiplier.

Editoval cesilek (20. 3. 2013 22:58)

enumag
Člen | 2118
+
0
-

2.0-beta

Jo tak tam se ta metoda asi ještě jmenuje getParam.

samic
Člen | 18
+
0
-

enumag napsal(a):

2.0-beta

Jo tak tam se ta metoda asi ještě jmenuje getParam.

Kombinace tohoto v šabloně:

{control anketaForm, $anketa[‚ID_ankety‘]}

a tohoto v presentru:

$id_ankety = $this->getParam(‚id‘);

mi to ten parametr nezíská :-(

Editoval samic (20. 3. 2013 23:39)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nejprve bych uvedl, že rozhodně nedoporučuju předávat makru {control} žádné argumenty kromě názvu komponenty. A teď, pokud pro každé to ID ankety potřebuješ unikátní komponentu, tak je vhodné využít právě Multiplier. Funguje to tak, že ty makru control předáš složený název komponenty: továrnička, která bude vracet instanci toho Multiplieru, má nějaké jméno, a to jméno bude na začátku. Za pomlčkou pak můžeš uvést nějakou dynamickou část (třeba to ID ankety), a to se předá callbacku předanému do Multiplieru jako první argument. Eh :).

{foreach $ankety as $anketa}
	{control anketaForm-$anketa['ID_ankety']}
{/foreach}
protected function createComponentAnketaForm()
{
	return new UI\Multiplier(function ($idAnkety) {
		$form = new AnketaFormHrac;
		$anketa = AnketyModel::getByID($idAnkety);
		...
	});
}
samic
Člen | 18
+
0
-

vojtech.dobes napsal(a):

Nejprve bych uvedl, že rozhodně nedoporučuju předávat makru {control} žádné argumenty kromě názvu komponenty. A teď, pokud pro každé to ID ankety potřebuješ unikátní komponentu, tak je vhodné využít právě Multiplier. Funguje to tak, že ty makru control předáš složený název komponenty: továrnička, která bude vracet instanci toho Multiplieru, má nějaké jméno, a to jméno bude na začátku. Za pomlčkou pak můžeš uvést nějakou dynamickou část (třeba to ID ankety), a to se předá callbacku předanému do Multiplieru jako první argument. Eh :).

{foreach $ankety as $anketa}
	{control anketaForm-$anketa['ID_ankety']}
{/foreach}
protected function createComponentAnketaForm()
{
	return new UI\Multiplier(function ($idAnkety) {
		$form = new AnketaFormHrac;
		$anketa = AnketyModel::getByID($idAnkety);
		...
	});
}

Tim padem prichazi upgrade z beta 2.0 na 2.0 – jsem zvedavy jak dlouho mi to potrva :(

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Držím palce, je to dobré rozhodnutí :). Existují i nástroje, které mohou pomoci s převodem.

samic
Člen | 18
+
0
-

vojtech.dobes napsal(a):

Držím palce, je to dobré rozhodnutí :). Existují i nástroje, které mohou pomoci s převodem.

po nastrojich se podivam diky :) je toho hodne co se bude muset z beta 2.0 zmenit?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Tady – https://forum.nette.org/…z-0-9-na-2-0 – je poměrně podrobný seznam, dokonce myslím, že existuje ještě nějaký další.

ondrakrajcik
Člen | 45
+
0
-

Mám podobný problém, ale řešení které tu bylo pro mě není pravé.

Mám formulář pro editování dat v Databázi. Chci aby se do formuláře nahrály data z příslušného řádku, takže metodě createComponentMujFormular() chci předat parametr – proměnnou $id, aby se do políček mohly načíst příslušná data.

Má otázka je jak předám parametr? představuju si, že by to mohlo být nějak takto:

V presenteru

createComponentMujFormular($id)
{...}

V templatě

{control MujFormular, id => 5}

To jsem jen tak zkusil a nefunguje to. Je vůbec možné předávat této metodě parametr?

David Matějka
Moderator | 6445
+
0
-

ne, takhle to mozne neni. precetl sis tuhle diskuzi? pokud mas na strance vice formularu, pouzij multiplier. pokud ne, tak si ten parametr ziskas v presenteru pres $this->getParameter('id')

Šaman
Člen | 2666
+
0
-

Vždyť se to tu teď řešilo a v dokumentaci je to taky jasně napsaný.

makro

{control MujFormular, id => 5}

se ti přeloží na php kód

<?php
$control->getComponent('MujFormular')->render(array('id' => 5));
?>

Takže předáváním parametrů v šabloně pomocí makra {control} můžeš předat parametr jen render metodě.
Pokud by ti tohle nestačilo, tak si ty parametry budeš muset předat už v továrničce (do konstruktoru, nebo nepovinné parametry setterem). Do továrničky ale nepředáváš parametry pomocí makra control!

Editoval Šaman (21. 2. 2014 16:28)