Vykreslení funkce s html do Latte

aha009
Člen | 50
+
0
-

Ahoj,
mám funkci pro vykreslení menu, ale netuším jak ji dostat do šablony.
Tohle nefunguje $this->template->menu = $this->displayMenu();
Ve funkci je rekurze. Bez ní bych to rovnou vykreslil do šablony, ale takhle jsem v koncích a nevím jak na to.

public function displayMenu($parent = 0)
{
    $query = $this->menuManager->getPublicMenus()->where('parent = ?', $parent);

    if ($this->menuManager->getPublicMenus()->count() > 0) {
        print '<ul>';

        foreach ($query as $row) {
            print '<li>' . $row->title;
            $this->displayMenu($row->id);
            print '</li>';
        }
        print '</ul>';
    }
}
Kamil Valenta
Člen | 758
+
+1
-

Místo print (fíha, print jsem vážně dlouho neviděl) si to skládej do proměnné a na konci funkce dej return.

aha009
Člen | 50
+
0
-

Díky, funguje to.

F.Vesely
Člen | 368
+
+3
-

V latte lze taky docilit rekurze pres vkladani bloku do sebe. Viz dokumentace https://latte.nette.org/cs/tags#…

joe
Člen | 313
+
+2
-

Určitě to přesuň celé do Latte šablony. Takhle skládat menu v PHP a pak ho vypsat v šabloně není hezké řešení a jak už psal F.Vesely, použít include bloku.

aha009
Člen | 50
+
0
-

Děkuji za rady. Tak jsem to pár hodin zkoušel namontovat do Latte a neúspěšně. Jen původní kód se od té doby trochu změnil.
Jak tam dostanu $parent = null ?

public function displayMenu($parent = null)
{
    if ($parent == null) {
        $query = $this->menuManager->getPublicMenus()->where('parent', null)->order('sort_order');
    } else {
        $query = $this->menuManager->getPublicMenus()->where('parent = ?', $parent)->order('sort_order');
    }

        if ($this->menuManager->getPublicMenus()->count() > 0) {
            $menu = '<ul>';
            foreach ($query as $row) {
                $menu .= '<li>' .  $row->title;
                $menu .= $this->displayMenu($row->id);
                $menu .= '</li>';
            }
            $menu .= '</ul>';
            $menu = str_replace("<ul></ul>","",$menu);
            return $menu;
        }
}

Zkoušel jsem to dostat do toho vzoru, ale neúspěšně

{block menu}
<ul>
	{foreach $menu as $item}
	<li>{if is_array($item)}
		{include menu, menu => $item}
	{else}
		{$item}
	{/if}</li>
	{/foreach}
</ul>
{/block}