Dynamischer Aufbau einer Navigation

Hallo,

ich habe gleich noch eine Frage. Und zwar will ich ein CMS erzeugen, welches eine dynamische Navigation erhält, eben die Seiten aufruft, die der Nutzer angelegt. In der Datenbank gibt es dafür eine Tabelle, mit einer ID und einer REF_ID. Die REF_ID referenziert eine ID der gleichen Tabelle. Somit baue ich einen Baum auf.

Löst man sowasüber Widgets? Oder wie implementiere ich sowas am besten? Mir gehts dabei vorrangig um die Ideen, da ich Yii erst seit ein paar Tagen kenne.

Ebenso stellt sich mir die Frage, wie ich die URLs entsprechend abfange? Da ich ja für die unterschiedlichen URLs je eine andere Seite anzeigen muss. Gedacht habe ich mir, dass ich immer auf die selbe PHP-Datei umleite und dann eben den Inhalt entsprechend abändere. Wie erreiche ich sowas? oO

Danke für jede Idee!

mfg

armin

Für das Menü bietet sich ein Widget an - wie prinzipiell für alle Ausgabeelemente, die auf mehreren Seiten (oder auf der selben Seite) wiederholt werden sollen.

Ein Widget ist schnell gebastelt:

[code=components/MeinMenue.php]<?php

class MeinMenue extends CWidget {

    public $aktuelleSeite;

    public function run() {

        // Hole hier den navigationsbaum aus der DB

        // und bereite ihn für vernünftige Ausgabe auf.

        // Daten liegen dann z.B. in $menue

      $this->render('meinmenue',array('menue'=>$menue));

    }

}[/code]

[code=components/views/meinmenue.php]<h1>Hauptmenue</h1>

<?php foreach($menue as $option): ?>

    <?php /* Hier muss das HTML hin, das eine Menüoption zur Anzeige bringt */ ?>

<?php endforeach; ?>[/code]

Wenn du die fehlenden Teile ergänzt hast, ist das Widget einsatzbereit. In einem View kannst du es dann so einbauen:

<?php $this->widget('application.components.MeinMenue',array(


    'aktuelleSeite' => 'namedieserseite'


)); ?>

Zu deinem Problem mit den URLs: Du wirst die jeweiligen Seiteninhalte ja irgendwo in einer Datenbank haben. D.h. du brauchst eine einzige Controlleraction, der du als Parameter übergibst, welche Seite angezeigt werden soll. In dieser Action holst du dann den Content, übergibst ihn an eine Viewdatei und bringst ihn dort zur Anzeige.

Quote

Zu deinem Problem mit den URLs: Du wirst die jeweiligen Seiteninhalte ja irgendwo in einer Datenbank haben. D.h. du brauchst eine einzige Controlleraction, der du als Parameter übergibst, welche Seite angezeigt werden soll. In dieser Action holst du dann den Content, übergibst ihn an eine Viewdatei und bringst ihn dort zur Anzeige.

Oh je… davon verstehe ich nur Bahnhof =(

Zur Datenbank: die primäre Tabelle ist ja weiter oben beschrieben. daneben gibt es eine zweite. Diese besteht mindestens aus einer REF_ID und einer TEXT-Spalte. Die REF_ID referenziert die ID der ersten Tabelle. Somit habe ich eine Zuordnung von Beiträgen zu einem Gliederungspunkt. Ich hoffe das ist verständlich erklärt.

Nun weiß ich nicht genau, wie du das mit der URL gebacken bekommen soll. Ich verstehe das bisher wie folgt:

Ich erzeuge einen Controller (z.B.: /controllers/TestController.php), der aufgerufen wird, wenn ich die folgende URL aufrufe: index.php?r=test/xxx.

Das xxx steht für eine Unterseite, die ich dann im controller abfragen kann, oder? Im SiteController ist dies ja durch die actionXXX-Methoden implementiert. Wie schaffe ich es aber, diese Unterseiten immer auf eine Methode zeigt?

Du hast an dieser Stelle, aber irgendwie einen anderen Ansatz genannt: wie übergebe ich einen Parameter? per URL? oO bin gerade echt überfragt… :(

Du brauchst nur eine einzige Action für alle deine Seiten. Dieser Action übergibst du als Parameter, welche CMS-Seite angezeigt werden soll. Wenn du z.B. einen Controller namens CmsController und darin actionPage definierst, sähe deine URL erst mal so aus:

index.php?r=cms/page&content=irgendwas


In der Funktion actionPage machst du dann in etwa folgendes:

<?php


if (isset($_GET['content']))


    $refId=$_GET['content'];


else 


    $refId='startseite';





$content=Content::model()->findByPk($refId);


if ($content===null)


  throw new CHttpException(404, 'Die gewünschte Seite existiert nicht!');





$this->render('page', array('content'=>$content'));


Content must du als ActiveRecord-Klasse definieren. Sie liefert dir den zugehörigen Textinhalt zurückliefert. Als Primärschlüssel sollte dort ‘refId’ definiert sein.

ui, ui, ui… das hört sich klasse an =) danke dir vielmals! das hilft verdammt viel weiter!!!