jak předat parametr do componenty vytvořené v presenteru

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

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

22
Člen | 1478
+
0
-

že komponenta nexistuje:

Component with name 'editForm(1)' does not exist.

takto se proměnná do komponenty nedá předat, když se podívaš do API, musíš mít na to nějaký setter.

joseff
Člen | 233
+
0
-

Jo to je jasný, ale jak ten setter z šablony vytvořit?

22
Člen | 1478
+
0
-

nechápu otázku

joseff
Člen | 233
+
0
-

Ptám se zda jde z šablony nějak předat do componenty proměná a pokud ano, tak jak.

froggy
Člen | 17
+
0
-

Mělo by fungovat toto:

{control miniform, 17, 'formular.latte'}

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');
joseff
Člen | 233
+
0
-

Tak to jsem zase moc nepochopil já. Jak máš vytvořenou tu komponentu? To co píšeš je obsah metody, ale jak se ta metoda jmenuje?

Patrik Votoček
Člen | 2221
+
0
-

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'formular.latte

joseff
Člen | 233
+
0
-

Já bych moc rád používal továrničky, ale jak mohu vytvořit továrničky dinamicky v presenteru?

Patrik Votoček
Člen | 2221
+
0
-

Co to znamená dinamicky v presenteru ?

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

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

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

pavouk napsal(a):

Myslim ze hledas toto:

$this['myForm'.$item->id] = createComponentMyForm($item->id)

Ale no fuj!

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

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

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

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

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

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

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"}