Rekurzivní výpis položek v šabloně

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

Mám dotaz, udělal jsem si natažení menu z presenteru, data si tam sice můžu upravit do podoby pro html, a hodit do šablony až výpis, ale nejde to udělat, nějak v šabloně přímo? Tím, že si v presenteru jen vytáhnu data z db a hodím směr šablona… ale jak v šabloně udělat rekurzivní funkci? Menu má několik zanoření.

<?php
	public function startup()
	{
		parent::startup();

        $DataMenu = BlogModel::returnNavigace();

        $upraveneMenu = Array();

        foreach($DataMenu as $radek) {
            $upraveneMenu[$radek['nadrazene']][] = Array('id' => $radek['id'],
                'nazev' => $radek['nazev'],
                'presenter' => $radek['presenter'],
                'presenter_id' => $radek['presenter_id'],
                'nadrazene' => $radek['nadrazene'],
                'razeni' => $radek['razeni'],
                'aktivni' => $radek['aktivni'],
            );
        }
        $this->template->mojeMenu = $this->VypisMenu($upraveneMenu);
    }

    /**
     * Hlavní funkce na vypsání menu do html
     * @param array $menuArray
     */
    public function VypisMenu($menuArray) {

        if(!isset($menuArray[0])) {
            return 'Data menu nezadána';
        }
        $menuText = "<ul>\r\n";

        foreach($menuArray[0] as $hodnota) {
            if ($hodnota['aktivni']) {
                $menuText .= '<li>';
                // dodáme odkaz pokud existuje
                $menuText .= $this->VypisLinkuMenu($hodnota['nazev'], $hodnota['presenter'], $hodnota['presenter_id']);
                $this->VypisPodskupinu($menuArray, $hodnota['id'], $menuText);
                $menuText .= "</li>\r\n";
            }
        }
        $menuText .= "</ul>\r\n";
        return $menuText;
    }

    /**
     * Rekurzivní funkce na vypsání podmenu (zanořených skupin)
     * @param array $menuArray
     * @param int $id
     * @param string &$text
     */
    public function VypisPodskupinu($menuArray, $id, &$text) {
        if(isset($menuArray[$id])) {
            $text .= "<ul>\r\n";
            foreach($menuArray[$id] as $podmenu) {
                if ($podmenu['aktivni']) {
                    $text .=  "<li>";
                    // dodáme odkaz pokud existuje
                    $text .= $this->VypisLinkuMenu($podmenu['nazev'], $podmenu['presenter'], $podmenu['presenter_id']);
                    $this->VypisPodskupinu($menuArray, $podmenu['id'], $text);
                    $text .=  "</li>\r\n";
                }
            }
            $text .= "</ul>\r\n";
        }
        return $text;
    }

    /**
     * Vytvoří html odkazu
     * @param string $nazev
     * @param string $presenter
     * @param int $id
     */
    public function VypisLinkuMenu($nazev, $presenter, $id='') {
        if ($presenter == '') {
            return $nazev;
        }

        $text =  "<a ";
        if ($presenter == (":" .$this->name . ":" .$this->view)) {
            if($id != '') {
                if($id == ((int) $this->getParam('id'))) {
                    $text .= "class='active' ";
                }
            } else {
                if($id == ((int) $this->getParam('id'))) {
                    $text .= "class='active' ";
                }
            }
        }
        // pokud je zdané id, dodám id, jinak ne
        if ($id != '') {
            $text .=  "href='".$this->link($presenter, $id) ."'>".$nazev."</a>";
        } else {
            $text .=  "href='".$this->link($presenter) ."'>".$nazev."</a>";
        }

        return $text;
    }
?>

kde db mám:
id, nazev, presenter, presenter_id, nadrazene, razeni, zobrazit

Vím, že je to psané hrozně, ale stromečkouvou strukturu jsem zkoušel rozjet dneska prvně nataženou z DB… a rekurzivní funkce to je moje první za život :D tak prosím nekamenovat…

Editoval tatyalien (16. 9. 2011 21:51)

studna
Člen | 181
+
0
-

Popravdě ten kód jsem jenom prolítl, zaznamenal jsem slova rekurze a šablona. Což jde poměrně snadno.

tatyalien
Člen | 239
+
0
-

Na to jsem koukal, ale jaksi to nechápu :(
To co David píše, nějak nechápu jak zakomponovat…

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

Ale už to asi mám… díky za nasměrování.

Editoval tatyalien (16. 9. 2011 22:51)