Jak předat parametr do továrničky?
- samic
- Člen | 18
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 :-)
- cesilek
- Člen | 3
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)
- Vojtěch Dobeš
- Gold Partner | 1316
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
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
Držím palce, je to dobré rozhodnutí :). Existují i nástroje, které mohou pomoci s převodem.
- Vojtěch Dobeš
- Gold Partner | 1316
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
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
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
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)