Načtení controlů ze seznamu

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

Zdravím,

rád bych se zeptal, jak lze dynamicky vypisovat controly do šablony. Zkoušel jsem:

<?php
        // vytvoreni controlu
	$this->addComponent(new Komponenta("prvni komponenta"), 'komponentaA');
        $this->addComponent(new Komponenta("druha komponenta"), 'komponentaB');

	// jejich nazvy do pole
	$this->template->controls = array("komponentaA, komponentaB");

?>

a v šabloně mám:

{foreach $controls as $control}
    {control $control}
{/foreach}

No a celé mi to vyhodí Fatal Error – Call to a member function getWidget() on a non-object

K té konstrukci výše mě přivedl tenhle můj experiment:

<?php

	$this->addComponent(new Komponenta("prvni komponenta"), 'komponentaA');

	$this->template->name = "komponentaA");

?>

a v šabloně:

{control $name}

což funguje bez problémů.

Nenapadá někoho, jak případně obejít tento problém nebo kde dělám chybu?
Jinak používám Nette 2.0-dev.

Předem děkuji za komenty.

Foowie
Člen | 269
+
0
-

$control je vyhrazená proměnná v šabloně (která odkazuje na aktuální komponentu) a ty ji přepisuješ stringem. Makro {control xyz} se vpodstatě přeloží jako $control->getWidget('xyz')

Jirda
Člen | 103
+
0
-

Aha, díky. Ale i přesto, když teda přepíšu tu šablonu:

{foreach $controls as $name}
    {control $name}
{/foreach}

Tak teď řve. že ty komponenty pro změnu neexistují.

RadH
Člen | 23
+
0
-

špatně zapsaný array, má tam být:

<?php
array("komponentaA", "komponentaB")
?>

Teď ti to chce vytvořit komponentu s názvem „komponentaA, komponentaB“.

Jirda
Člen | 103
+
0
-

Díky. ¨

Jeětě bych tu rád otevřel jednu otázku, šla by podobná konstrukce aplikovat na blocky?

Řekněme, že bych měl pole polí, kde by klíčem byl označen název bloku a value jako pole by obsahovalo názvy komponent. No a pak by se v šabloně vygenerovaly blocky s názvy podle key a do blocku by se pak nagenerovaly controly.

Snad je to pochopitelné. Kdyžtak bych to více rozepsal.

Filip Procházka
Moderator | 4668
+
0
-

Imho je lepší vrátit přímo ty komponenty šabloně, přece jenom, jsou to jen ukazatele.

// druhy parametr je nazev třídy
// tato metoda vyfiltruje komponenty a vrátí pouze instanci dané třídy/interface
$this->template->components = $this->getComponents(FALSE, 'Komponenta');

a pak je jednoduše vypsat

{foreach $components as $component}
	{control $component}
{/foreach}