Seite 1 von 1

<br> nach der Navsecond - wo muss das hin?

Verfasst: Fr 22. Jul 2005, 01:00
von SSH
Hallo zusammen!

Kaum ist das eine Problem behoben, schon ist das nächste Problem da.

Ich habe vier Hauptmenüpunkte übereinander. Pro Hauptpunkt soll jetzt eine Zeile mit vielen Unterpunkten nebeneinander(!) aufgehen. Die Navfirst und -second sind soweit angepasst.
Mir fehlt nur noch, dass nach dem letzten Untermenüpunkt (nach dem letzten mal Navsecond aufrufen) noch ein <br> ausgegeben wird.

Hab mir das Modul (Hauptnavigation) schon angesehen, kriegs aber nicht vernünftig auf die Reihe (finde nicht die richtige Stelle).
Also:
Wo (an welcher Stelle) soll ich das <br> unterbringen?

Schon mal Danke

Grüße

SSH

Verfasst: Fr 22. Jul 2005, 09:25
von Beleuchtfix
Alternativ wäre ein class="hauptpunkt" und class="unterpunkt" und im style bei hauptpunkt ein display block. (4.5.x kenne/ habe ich nicht).

Viel Erfolg
Florian

Verfasst: Fr 22. Jul 2005, 10:18
von SSH
Hallo!

Hätte ich da nicht das selbe Problem - sprich "Wo baue ich das ein"?

Wenn ich das in die Navsecond kloppe, dann habe ich ja auch nach jedem Punkt eine neue Zeile.

Ich muss dazu sagen, dass die Menüpunkte kein Text, sondern Grafiken sind. Damit alles "in Position" bleibt, brauche ich eben nach jeweils dem letzten Untermenüpunkt (am Ende der Zeile) ein <br>.

Gruß

SSH

Verfasst: Fr 22. Jul 2005, 13:18
von Beleuchtfix
Ich weiß nicht, ob das die richtige Navigation ist, aber eigentlich enden alle ziemlich ähnlich.

Das sind die letzten Zeilen aus der Hauptnavigation:

Code: Alles auswählen

               } // end foreach

            } // end if

        } // end foreach

    } // end if

} // end foreach

echo '</table>';

/* Read out buffer */
$html = ob_get_contents();

/* Clean buffer */
ob_end_clean();

/* Output buffer-contents */
echo $html;

?>
Nach meinem "Gefühl" müsste hinter der Zeile mit dem vorletzten end foreach ein echo '<BR>'; eingefügt werden also:

Code: Alles auswählen

               } // end foreach

            } // end if

        } // end foreach
     echo '<BR>';   // fügt Zeilenumbruch nach 2 Ebene ein  ???
    } // end if

} // end foreach

echo '</table>';

/* Read out buffer */
$html = ob_get_contents();

/* Clean buffer */
ob_end_clean();

/* Output buffer-contents */
echo $html;

?>
Viel Erfolg
Florian

Verfasst: Fr 22. Jul 2005, 14:28
von SSH
Leider Nein!
Die Stelle hatte ich auch schon.

Da haut er mir ein <br> nach der navfirst_on rein.

Gruß

SSH

Verfasst: Fr 22. Jul 2005, 14:29
von Beleuchtfix
Dann versuch es einen block höher
Viel Erfolg
Florian

Verfasst: Fr 22. Jul 2005, 17:46
von SSH
...leider auch nicht :?

Ich bin in PHP ein absoluter Rooki, komme aber mit Perl ganz gut klar. Schleifen und so verstehe ich schon . In dem Fall ist aber irgendetwas komisch (das <br> erscheint nicht (nur) da, wo man es eigentlich erwarten würde).

Was kommt sonst noch in Frage, außer dem Hauptnavi-Modul?

Was macht die Zeile - speziell das "generate"? Ist das eine Prozedur?:

Code: Alles auswählen

$tpl->generate('templates/navfirst_on.html');
Gruß

SSH

Verfasst: Mo 25. Jul 2005, 09:55
von Oldperl
Was macht die Zeile - speziell das "generate"? Ist das eine Prozedur?:
In diesen Zeilen werden die im Frontend liegenden Templates für die Navigation ausgelesen, die vorhanden Container in den Templates gefüllt und dann angezeigt. Dies geschieht in einer Schleife, so das jedes Template einen Menüpunkt darstellt.

Zum besseren Verständnis hier der Ausgabeteil der Hauptnavi

Code: Alles auswählen

/* Start Output buffer */
ob_start();

?>
<table align="center" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr><td height="21" width="22" class="boxsign"><img src="images/wuerfel.gif" width="22" height="21" border="0"></td>
<td width="130" class="boxtitle">Navigation</td></tr>
<tr><td align="center" colspan="2" class="boxcontent">
<?PHP
echo '<table border="0" cellspacing="0" cellpadding="0">';
foreach ($navitems as $key => $data) {

    /* 1. Navigations Ebene */
    $tpl->reset();
    $tpl->set('d', 'NAME',  $data['name']);
    $tpl->set('d', 'TARGET', $data['target']);
    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
    $tpl->next();

    if ($idcat == $data['idcat'] || is_array($data['sub'])) {
        $tpl->generate('templates/navfirst_on.html');
    } else {
        $tpl->generate('templates/navfirst_off.html');
    }

    if (is_array($data['sub'])) {

        foreach ($data['sub'] as $key => $data) {

            /* 2. Navigations Ebene */
            $tpl->reset();
            $tpl->set('d', 'NAME',  $data['name']);
            $tpl->set('d', 'TARGET', $data['target']);
            $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
            $tpl->next();

            if ($idcat == $data['idcat'] || is_array($data['sub'])) {
                $tpl->generate('templates/navsecond_on.html');
            } else {
                $tpl->generate('templates/navsecond_off.html');
            }

            if (is_array($data['sub'])) {

                foreach ($data['sub'] as $key => $data) {

                    /* 3. Navigations Ebene */
                    $tpl->reset();
                    $tpl->set('d', 'NAME',  $data['name']);
                    $tpl->set('d', 'TARGET', $data['target']);
                    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
                    $tpl->next();

                    if ($idcat == $data['idcat']) {
                        $tpl->generate('templates/navthird_on.html');
                    } else {
                        $tpl->generate('templates/navthird_off.html');
                    }

                } // end foreach

            } // end if

        } // end foreach

    } // end if

} // end foreach

echo '</table>';
echo '</td></tr></table>';
/* Read out buffer */
$html = ob_get_contents();

/* Clean buffer */
ob_end_clean();

/* Output buffer-contents */
echo $html;
Und jetzt im Detail

Code: Alles auswählen

/* Start Output buffer */
ob_start();
?>
Ein Ausgabepuffer wird initialisiert, in den nun alle weiteren Daten erst mal geschrieben werden.

Code: Alles auswählen

<table align="center" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr><td height="21" width="22" class="boxsign"><img src="images/wuerfel.gif" width="22" height="21" border="0"></td>
<td width="130" class="boxtitle">Navigation</td></tr>
<tr><td align="center" colspan="2" class="boxcontent">
Die Tabelle für die Navigationsbox wird geöffnet und der Boxheader wird mit dem Standardpfeilgif und Titel der Box erstellt.

Code: Alles auswählen

<?PHP
echo '<table border="0" cellspacing="0" cellpadding="0">';
Die innere Tabelle für die Navpunkte wird geöffnet.

Code: Alles auswählen

foreach ($navitems as $key => $data) {

    /* 1. Navigations Ebene */
    $tpl->reset();
    $tpl->set('d', 'NAME',  $data['name']);
    $tpl->set('d', 'TARGET', $data['target']);
    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
    $tpl->next();
Es wird eine Schleife gestarte, die das erstellte array $navitems ausliest.
Mit der Klasse $tpl werden nun für diesen Menüpunkt die Variablen (NAME, TARGET, HREF), die so auch als Container im Template stehen, mit den entsprechenden Werten gefüllt.

Code: Alles auswählen

    if ($idcat == $data['idcat'] || is_array($data['sub'])) {
        $tpl->generate('templates/navfirst_on.html');
    } else {
        $tpl->generate('templates/navfirst_off.html');
    }
Abhängig davon ob der Menüpunkt aktiv ist oder nicht ($idcat == $data['idcat']), oder es eine weitere Navebene gibt (is_array($data['sub'])), werden entweder in dem Template navfirst_on.html oder navfirst_off.html die entsprechenden Container mit den vorher erstellten Klassenvariablen gefüllt.

Code: Alles auswählen

    if (is_array($data['sub'])) {

        foreach ($data['sub'] as $key => $data) {

            /* 2. Navigations Ebene */
            $tpl->reset();
            $tpl->set('d', 'NAME',  $data['name']);
            $tpl->set('d', 'TARGET', $data['target']);
            $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
            $tpl->next();

            if ($idcat == $data['idcat'] || is_array($data['sub'])) {
                $tpl->generate('templates/navsecond_on.html');
            } else {
                $tpl->generate('templates/navsecond_off.html');
            }

            if (is_array($data['sub'])) {

                foreach ($data['sub'] as $key => $data) {

                    /* 3. Navigations Ebene */
                    $tpl->reset();
                    $tpl->set('d', 'NAME',  $data['name']);
                    $tpl->set('d', 'TARGET', $data['target']);
                    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
                    $tpl->next();

                    if ($idcat == $data['idcat']) {
                        $tpl->generate('templates/navthird_on.html');
                    } else {
                        $tpl->generate('templates/navthird_off.html');
                    }
Hier wird genau dasselbe für 2 weiter Navigationsebenen gemacht, wobei die Information darüber aus dem array $data['sub'] genommen werden.

Code: Alles auswählen

                } // end foreach

            } // end if

        } // end foreach

    } // end if

} // end foreach

echo '</table>';
echo '</td></tr></table>';
/* Read out buffer */
$html = ob_get_contents();
Jetzt werden alle geöffneten Schleifen, dann zuerst die innere Tabelle, dann die äußere, geschlossen und die so erstellten Daten ( am Anfang mit ob_start() ) in die Variable $html geschrieben.

Code: Alles auswählen

/* Clean buffer */
ob_end_clean();

/* Output buffer-contents */
echo $html;

?>
Zum Abschluß wird der Puffer gelöscht und das Menü in $html ausgegeben.

Gruß aus Franken

Ortwin

Verfasst: Mo 25. Jul 2005, 17:16
von SSH
Jo, danke!

Ich habs jetzt soweit (war mit ein Bißchen Code lesen ja völlig simpel :oops:) aber:

Eine Frage an die Entwickler oder andere Pros:
Wenn ich an der entsprechenden Stelle das Wort "test" ausgeben lasse, dann ist alles OK (wird wie erwartet angezeigt).

Wenn ich aber hier mein <br> ausgeben lasse, dann ist im Frontend zu dem <br> noch ein zusätzlicher(!) Zeilenumbruch zu sehen; im Quelltext steht aber nur das <br>.

Lasse ich ein "test<br>" ausgeben, dann schreibt Contenido "test" und macht dann einen wunderschönen Zeilenumbruch. Allerdings schließen die Elemte (Grafiken) der nächsten Zeile nicht direkt an, sondern es wird ein Freiraum von 2 oder 3 pix ausgegeben :cry:

Versuche ich an dieser Stelle statt dem <br> ein \n auszugeben, wird das mal gleich ganz ignoriert.

Woran liegt das???

Danke und Grüße

SSH

Verfasst: Mo 25. Jul 2005, 18:48
von timo
ähm das liegt nicht an Contenido, sondern am IE...

Verfasst: Mo 25. Jul 2005, 22:08
von Oldperl
SSH hat geschrieben:Wenn ich aber hier mein <br> ausgeben lasse, dann ist im Frontend zu dem <br> noch ein zusätzlicher(!) Zeilenumbruch zu sehen; im Quelltext steht aber nur das <br>.
hmm, das kann verschiedene Gründe haben. Schon mal geschaut ob da ein Stylesheet evtl irgendwo ein 'margin' oder 'padding' definiert?
Vielleicht einfach mal den Quelltext aus der Browseransicht in ne neue HTML-Datei kopieren und daran mal versuchen.
Lasse ich ein "test<br>" ausgeben, dann schreibt Contenido "test" und macht dann einen wunderschönen Zeilenumbruch. Allerdings schließen die Elemte (Grafiken) der nächsten Zeile nicht direkt an, sondern es wird ein Freiraum von 2 oder 3 pix ausgegeben :cry:
Wenn du mir das Layout mal schickst, oder ist es schon Online, könnt ich ja mal schaun 8)
Versuche ich an dieser Stelle statt dem <br> ein \n auszugeben, wird das mal gleich ganz ignoriert.

Woran liegt das???
Nun da \n kein HTML-Tag ist sollte das auch so sein. Wird doch eher in Scriptsprachen benutzt, z. B. in Javascript, wenn man eine Meldung ausgibt zum Umbrechen des Meldungstextes.

@timo
Ich geb dir recht das viele Sachen mit dem IE nicht gleich funktionieren, aber oft gibts grad beim HTML-Layout Kniffe und Tricks um den Microdoof-Browser auszuspielen :wink: