Pulldownmenü

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Pulldownmenü

    Hi,
    bin gerade über eine kleine Unschönheit gestolpert. Und zwar möchte ich ein Pulldownmenü erstellen, ala

    Quellcode

    1. <ul>
    2. <li><a href="">Link</a>
    3. <ul class="sub">
    4. <li><a href="">SubLink</a></li>
    5. </ul>
    6. <li><a href="">Link2</a></li>
    7. </ul>


    Die einzelnen Links kommen alle aus einer DB menu:
    id | name (anzeigename) | link (zielurl) | parent (id des zugehörigen links, 0 bedeutet hauptlink)

    Die Unschönheit, die ich jetzt nicht lösen kann ist die, dass ich zwei Abfragen, sowie zwei while-Schleifen benötige, um das Menü zu generieren. Das muss aber doch auch mit einer Abfrage möglich sein?! Gebt mir mal bitte nen Stoß in die richtige Richtung^^ Ich versuche gerade die Arrays neu zu sortieren, aber da komm ich heut wohl auch auf keinen grünen Zweig mehr :/

    Nuja, Danke schonmal
  • Update: ich poste jetzt einfach mal den ganzen Code

    Quellcode

    1. public function createMenu2() {
    2. echo '<pre>';
    3. $pdoparams = array();
    4. $sql = "SELECT * FROM menu"; //
    5. $stmt = DB::getInstance()->prepare($sql);
    6. $stmt->execute($pdoparams);
    7. $fetch = $stmt->fetchAll(PDO::FETCH_ASSOC);
    8. $parent = array();
    9. $child = array();
    10. foreach ($fetch as $key) {
    11. if ($key['parent'] == 0) {
    12. $parent[] = $key;
    13. } else {
    14. $child[$key['parent']] = $key;
    15. }
    16. }
    17. // und los gehts
    18. echo '<ul class="main">';
    19. foreach ($parent as $p) {
    20. echo '<li><a href="'.$p['link'].'">'.$p['name'];
    21. // hier scheiters. Ich brauch eine Möglichkeit zu prüfen ob $child-elemente vorhanden sind, damit ich dann die zweite <ul> Liste anfangen kann
    22. foreach ($child as $c) {
    23. if ($c['parent'] == $p['id']) echo '<li><a href="'.$c['link'].'">'.$c['name'].'</a></li>';
    24. }
    25. echo '</a></li>';
    26. }
    27. echo '</ul>';
    28. }
    Alles anzeigen
  • Ich hab mich schlecht ausgedrückt fällt mir auf^^ Aber ich habs jetzt hinbekommen, sodass es mir gefällt. Wens interessiert bzw. wer noch eine Idee dazu hat, immer raus damit

    Quellcode

    1. public function createMenu() {
    2. $pdoparams = array();
    3. $sql = "SELECT * FROM menu WHERE";
    4. $stmt = DB::getInstance()->prepare($sql);
    5. $stmt->execute($pdoparams);
    6. $fetch = $stmt->fetchAll();
    7. $parent = array();
    8. foreach ($fetch as $key) {
    9. if ($key['parent'] == 0) {
    10. $parent[$key['id']] = $key;
    11. } else {
    12. $parent[$key['parent']]['child'][] = $key;
    13. }
    14. }
    15. echo '<ul>';
    16. foreach ($parent as $p) {
    17. echo '<li>';
    18. echo '<a href="'.$p['link'].'">'.$p['name'];
    19. if (isset($p['child'][0]['id'])) {
    20. echo '<ul class="sub">';
    21. foreach ($p['child'] as $c) {
    22. echo '<li>';
    23. echo '<a href="'.$c['link'].'">'.$c['name'].'</a>';
    24. echo '</li>';
    25. }
    26. echo '</ul>';
    27. }
    28. echo '</a></li>';
    29. }
    30. echo '</ul>';
    31. }
    Alles anzeigen
  • Ich bin kein PHP-Crack, aber ich hab mir (für mich einleuchtend) erklären lassen, dass PHP eine Templatesprache ist. Warum brauch ich also nochmals eine Templateengine drumherum? Ohne die Arbeit von Smarty & Co. beleidigen zu wollen, aber cachen die Daten wahrscheinlich ein bisschen besser und haben noch zwei, drei Vereinfachungen, die sie aber durch ihre Metasprache aber wieder zunichte machen. In meinen Augen gibts keinen Grund für eine Templateengine.
    Ich hab mich wohl schlecht ausgedrückt. Ich weiß natürlich, dass MVC ein Muss ist und versuche es auch (meistens) so gut es mir gelingt umzusetzen, aber gerade bei einem solchen Beispiel wüsste ich nicht wie man das noch besser trennen könnte, wenn man rein die Ausgabe betrachtet. Dazu sollte ich sagen, auch wenns wahrscheinlich schon allen klar ist, dass ich im Bereich MVC noch eher Neuling bin.
  • Ähh, nein du implementierst das MVC Pattern schon mal nicht ... du machst eher das gegenteil. An sich kann man natürlich ohne Templateengine leben. Doch was wenn du nicht alles alleine machst sondern der Designer, wie üblich, den html Code erstellt? Willst du dich dann mit ihn hinsetzen und alles bei dir einpflegen? Das wird kein Auftraggeber bezahlen.

    Außerdem glaubst du, dass du in ein paar jahren noch verstehst was du heute geschrieben hast?
  • Eher nicht, denn bei Smarty muss der Designer nur Grundlegende Sachen können ... theoretisch reicht auch html. Bei php muss er zumindestens Grundlegend den gesamten Code verstehen, denn sonst weiß er ja nich wo er was einpflegen muss.

    Außerdem können mit smarty und co. Designer und Entwickler unabhängig voneinander entwickeln.

    Ansonsten ist deine Methode, selbst wenn man unbedingt php verweden will, schlecht. Denn auch ohne Smarty kann man zumindest Moder und Controll vom View trennen. Auch würde man nicht für jede Zeile ein echo benutzen ... einfach HTML schreiben und dann, wo es benötigt wird, einen kleinen php Block.
  • Zum Thema PHP und Templateengine.
    Ja, PHP ist so entworfen worden, dass man den Programmcode einfach mit der Ausgabe vermischen kann. Deshalb gibt es auch die verkürzten Schreibweisen.

    Das Zend Framework nutzt beispielsweise keine externe Templateengine, sondern baut auf ganz normalen Programmcode auf. Beispiel:

    Quellcode

    1. <?= if ($this->books): ?>
    2. <!-- Eine Tabelle mit einigen Büchern. -->
    3. <table>
    4. <tr>
    5. <th>Autor</th>
    6. <th>Titel</th>
    7. </tr>
    8. <?php foreach ($this->books as $key => $val): ?>
    9. <tr>
    10. <td><?=echo $this->escape($val['author']) ?></td>
    11. <td><?=echo $this->escape($val['title']) ?></td>
    12. </tr>
    13. <?php endforeach; ?>
    14. </table>
    15. <?= else: ?>
    16. <p>Es gibt keine Bücher zum Anzeigen.</p>
    17. <?= endif; ?>
    Alles anzeigen


    Trotzdem wird nach dem MVC Pattern die View klar von dem Programmcode getrennt! Somit kann PHP für die Formatierung genutzt werden, sollte aber von der Logik getrennt werden.
    Eine Ausgabe innerhalb einer Funktion zu schreiben ist sehr unschön und hat auch nur was mit auslagern und nichts mit OOP zu tun.

    Ich bin aber der Meinung, dass ein Designer, der wenig mit Programmierung am Hut hat, mit Smarty besser zurecht kommt, als mit PHP. Sehr gute Doku, eine klare Syntax und ein übersichtliches Debugfenster, was die Designvariablen von dem restlichen Code sehr gut kapselt.
  • Es ist doch einfach ein Unterschied wenn ich das mit PHP generiere

    Quellcode

    1. echo '<table>';
    2. foreach($array as $key => $value) {
    3. echo '<tr>';
    4. echo '<td>' . $value['name'] . '</td>';
    5. echo '</tr>';
    6. }
    7. echo '</table>';


    oder mit Smarty

    Quellcode

    1. <table>
    2. {foreach from=$array item=value}
    3. <tr>
    4. <td>{$value.name}</td>
    5. </tr>
    6. {/foreach}
    7. </table>


    Was übersichtlicher ist sollte man klar erkennen können :)

    Und glaub mir aus beruflicher Erfahrung weiß ich das "Designer" mit Smarty besser klar kommen.

    Achja ein wichtiger Punkt ist auch noch das man seinen Programmcode nicht hergeben muss :)

    €dit: Smarty ist jetzt natürlich nur ein Beispiel es gibt ja unzählige Varianten auch wie eben von vince beschrieben.