jak předat parametr do componenty vytvořené v presenteru
- joseff
- Člen | 233
Zdravím, v presenteru jsem si vytvořil metodu
Presenter:
createComponentEditForm($id)
{
//... vytvoreni forulare
}
Sablona:
{control editForm(1)}
Vyvola chybu.
Component with name 'editForm(1)' does not exist.
Nevite tedy jak mam predat parametr do componenty ze sablony? Diky
- Patrik Votoček
- Člen | 2221
froggy napsal(a):
Komponentu mám ale v presenteru vytvořenou tímto způsobem, ale snad by to mělo fungovat podobně:
$this->miniform = new Formular($this, 'miniform');
ale no fuj když už žak už:
$this['miniform'] = new Formular($this, 'miniform');
nic méně i tak doporučuju používat spíš továrničky
Jinak tohle je správně:
{control miniform, 17, 'formular.latte'}
volá to jako by
echo $this['miniform']->render(17, 'formular.latte')
tj metodu render
na komponentě registrované jako
miniform
s parametry 17
a 'formular.latte
- Vojtěch Dobeš
- Gold Partner | 1316
Továrničky se dynamicky vytvářet nedají (IMHO je továrnička metodou
presenteru). Nicméně se dá přepsat metoda createComponent
, ale
pokud je možné se tomu vyhnout, je lepší se tomu vyhnout (když změníš
její chování, tak pak nemůžeš vytvářet klasické továrničky, nebo
možná můžeš, ale musíš na to myslet…). Prostě bude lepší se zeptat:
na co je to potřeba? Třeba se najde lepší řešení.
- pavouk
- Člen | 12
Myslim ze hledas toto:
Presenter
public function actionDefault
{
foreach($nejakePole as $item)
{
$this['myForm'.$item->id] = createComponentMyForm($item->id)
}
}
Sablona normalka
{foreach $nejakepole as $item}
{var controlName = 'myform'.$item->id}
{control $controlName}
{/foreach}
- Patrik Votoček
- Člen | 2221
pavouk napsal(a):
Myslim ze hledas toto:
$this['myForm'.$item->id] = createComponentMyForm($item->id)
Ale no fuj!
- Vojtěch Dobeš
- Gold Partner | 1316
ad pavouk) To je možná dynamická tvorba komponent, ale
továrnička != komponenta
. Továrnička je metoda začínající
na createComponent
a důvod její existence je, aby si hotovou
komponentu mohla aplikace vyžádat v libovolný moment (a dostala ji). Je to
kód, který instanci komponenty vytváří.
Editoval vojtech.dobes (17. 3. 2011 11:45)
- Jan Tvrdík
- Nette guru | 2595
Přetížení metody createComponent
mi přijde jako naprosto
čisté (pokud je správně použito) a běžně používané řešení. Často
je ale lepší využit něco takového: https://gist.github.com/537838
- joseff
- Člen | 233
Patrik Votoček napsal(a):
pavouk napsal(a):
Myslim ze hledas toto:
$this['myForm'.$item->id] = createComponentMyForm($item->id)
Ale no fuj!
Ale no fuj umí napsat každý, nechceš raději napsat jak je to správně něž psát že je něco špatně? Upřímě řečeno je to jediné řešení v tomto vláknu které spolehlivě funguje. Takže děkuji moc za tento příspěvek. Perfektně to vyřešilo můj problém!
- Jan Tvrdík
- Nette guru | 2595
Princip čistějšího řešení jsem popsal ve svém předchozím příspěvku. V závislosti na zvoleném řešení se to pak používá buď
{* Přetížení metody createComponent *}
{foreach $items as $id => $item}
{control "foo$id"}
{/foreach}
nebo
{* Použití ReplicationContaineru - imho nejčistší *}
{foreach $items as $id => $item}
{control "foo-$id"}
{/foreach}
- Patrik Votoček
- Člen | 2221
joseff napsal(a):
Ale no fuj umí napsat každý, nechceš raději napsat jak je to správně něž psát že je něco špatně? Upřímě řečeno je to jediné řešení v tomto vláknu které spolehlivě funguje. Takže děkuji moc za tento příspěvek. Perfektně to vyřešilo můj problém!
Za prvé nemusím hned psát řešení. Napsal jsem schválně jenom to co jsem napsal aby se člověk kterého se to týkalo zamyslel nejdříve sám (třeba na to příjde sám) a pak se případně zeptal proč je to fuj.
Za další sám sem se tě o několik postů předtím ptal co to znamená „dinamicky v presenteru“ (odpovědi jsem se nedočkal). Nehledě na to že 2 posty pod mým příspěvkem máš ono řešení.
PS: pláčeš na špatném hrobě.
- murdej
- Člen | 26
Tragac.php:
class Tragac extends Control {
public function render($value)
{
$template = $this->template;
$template->setFile(dirname(__FILE__) . '/Tragac.latte');
$template->value = $value;
$template->render();
}
}
Tragac.latte:
Hodnota je {$value}.
Presenter:
public function createComponentTragac() {
return new Tragac();
}
Sablona.latte:
{control tragac 123}
{control tragac "Velorex"}