Rekurzivní výpis položek v šabloně
- tatyalien
- Člen | 239
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)
- tatyalien
- Člen | 239
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)