Smarty :: Dynamische Navigation ..

kaazone

New Member
Hallo,

ich sitze gerade an einem Script wozu ich eine dynamische Navigation genererieren will .. sprich sie soll die Inhalte aus der Datenbnak lesen..

Folgendermassen bin ich bis jetzt vorgegangen:

navigation.php
PHP:
    $smarty = new Smarty;
    
    $smarty->caching = true;
    $smarty->cache_lifetime = 120;
    
    $sql = mysql_query("SELECT * FROM ".PREFIX."navigation
    Right Join eva_navigationkategorie ON (eva_navigation.kategorieID = eva_navigationkategorie.kategorieID) Order by eva_navigationkategorie.kategorieID") or die(mysql_error());
    while($row = mysql_fetch_array($sql))
    {
        $navigation_li[] = array(
        'kategorieID' => $row['kategorieID'],
        'title' => $row['title'],
        'name' => $row['name'],
        'url' => $row['url']);
    }

        $smarty->assign('navigation_li',$navigation_li);

$smarty->display('navigation.tpl');

includet wird die ganze navigation.php in der index.tpl was auch soweit ganz gut klappt.

navigation.tpl
HTML:
{foreach from=$navigation_li item=navi name=navi}
<div class="modulebox">
    <div class="moduletitle">{$navi.title}</div>
    <div class="moduleifunction">
    <ul>
        <li><a href="{$navi.url}">{$navi.name}</a></li>
    </ul>
    </div>
</div>
{/foreach}

Die Ausgabe sieht jedoch folgender massen aus..

- Kategorie
-- Link

- Kategorie
-- Link

- Kategorie
-- Link

- Kategorie
-- Link

das ganze legt er aber für jeden link einmal an er soll aber kategorieID zusammenanzeigen..

Weis jemand Rat?
 
Ich kenne zwar Smarty kaum, aber deine Schleife sollte IMHO nur die Zeile mit dem <li>...</li> umfassen.
 
Hey,

ja ich muss aber den Titel also die den Rubriknamen auch iwie holen .. :D

Jemand ne Idee

Liebe Grüss
 
Hi,

wenn es mehrere Links zu "einer" Kategorie gibt, musst du dein SQL Statement sowie das Verarbeiten dessen Ergebnis anders aufbauen.

Vorschlag:
PHP:
$navigation = array('title' => 'Kategorie1', 'links' => array(0 => array('LinkName','LinkID',....), ....))

HTML:
{foreach from=$navigation item=navi name=navi}
<div class="modulebox">
    <div class="moduletitle">{$navi.title}</div>
    <div class="moduleifunction">
    <ul>
{foreach from=$navi.links item=link}
        <li><a href="{$link.url}">{$link.name}</a></li>
{/foreach}
    </ul>
    </div>
</div>

{/foreach}
 
Danke das war schonmal hilfreich .. denoch möchte ich alle Kategorien ausgeben lassen ..

Liebe Grüsse
 
Stelle Dir das Array nach dem Query selbst zusammen. Spätestens wenn andere Kategorien oder Ähnliches hinzukommen hast Du Code den Du nicht mehr warten möchtest.
 
Also mittlerweile konnte ich das Problem sehr gut lösen. Ich postet hier mal meine Idee und hoffe das damit die anderen User eventuellen Problemen aus dem Weg gehen können.

Als erstes habe ich mir eine Function geschrieben die die entsprechenden Kategorien und Links aus der Datenbank holt und dementsprechend in einem Array verarbeitet:

PHP:
function loadnavigation(){
    //Smarty global registrieren
	$smarty = new Smarty;

    //Menukategorien zuordnen
    $sql_cat = "SELECT * FROM [B]navigationskategorie[/B] ORDER by sort";
    $result_cat = mysql_query($sql_cat) or die("Query failed : " . mysql_error());
    $i=0;
    while ($row_cat = mysql_fetch_assoc($result_cat))
    {
    $navigation[$i] = $row_cat;
    $navigation[$i]['entrys'] = array();

    //Menupunkte zuordnen
    $sql_entry = "SELECT * FROM navigation WHERE `kategorie`='".$row_cat['kategorieID']."' ORDER by sort";
    $result_entry = mysql_query($sql_entry) or die("Query failed : " . mysql_error());

    //Datenbank abfragen und verarbeiten
    while ($row_entry = mysql_fetch_assoc($result_entry))
    {
       $navigation[$i]['entrys'][] = $row_entry;
    }
    $i++;
    }

    //Template und VAR zuordnen
    $smarty->assign('navigation', $navigation);
    $smarty->display('navigation.tpl');
}

danach habe ich das ganze in der navigations.tpl in einer Schleife ausgegeben:

HTML:
{foreach item=categorie from=$navigation}
<div class="modulebox">
    <div class="moduletitle">{$categorie.title}</div>
    <div class="moduleifunction">
        <ul>
        {foreach item=entry from=$categorie.entrys}
        <li><a href="{$entry.url}">{$entry.name}</a></li>
        {/foreach}
        </ul>
    </div>
</div>
{/foreach}

da ich die ganze Function loadnavigation() noch global brauche nutze ich die eingbaute register

PHP:
//Registriere Funktion {loadnavigation} im Template
$smarty->registerPlugin("function","navigation", "loadnavigation");

Da wo Ihr dann die Navigation braucht könnt ihr sie mit {navigation} entsprechend laden lassen..

Sollten Fragen oder Probleme auftreten dann stehe ich gerne bereit.

Schönen Sonntag Mittag noch
 
Last edited by a moderator:
Back
Top