Zum Inhalt springen

Extension für die rootline-Navigation

Erstellt am 21. August 2007 · 6 Antworten · letzte Antwort am 4. September 2007

Tags: Frage

irisia3 ·

Hallo zusammen,

Ich versuche seit einiger Zeit auf meine Seite die Rootline zu kürzen, weil Ich will nicht, das die auf zwei Zeilen umgebrochen wird wenn sie zu lang wird. Stattdessen sollte die Länge der Menüeinträge zusammengezählt werden und wenn das größer als eine eingegebene Zahl ist, sollte die verkürtzt werden, also so etwas:
ebene1 > ... > ebene5 > ebene6 > ebene7

Also Ich habe in irgendeinem Forum gelesen, das die crop Methode der stdWrap innerhalb von HTML-Tags abschneidet und deswegen nicht an der Stelle zu gebrauchen ist. Als Vorschlag gab es da eine php-Methode, was aber genau dafür geignet ist - cropHTML:

//parse given html
$doc = domxml_xmltree('<body>' . $content . '</body>');
$body = $doc->get_elements_by_tagname('body');
$length = 0;
$content = cropHTML($body[0], $length, 40);


echo $content;


function cropHTML(&$node, &$length, $maxLength = 200, $replaceString = '...') {
    $st = "";
    if ($length >= $maxLength)
        return $st;
    foreach ($node->child_nodes() as $cnode){
        if ($cnode->node_type() == XML_TEXT_NODE) {
            $text = $cnode->node_value();
            if (strlen($text) + $length < $maxLength) {
                $st .= $text;
                $length += strlen($text);
            } else if ($length < $maxLength) {
                $st .= substr($text, 0, $maxLength - $length) . $replaceString;
                $length = $maxLength+1;
                return $st;
            }
        } else {
            if ($cnode->node_type() == XML_ELEMENT_NODE) {
                $st .= "<" . $cnode->node_name();
                if ($attribnodes = $cnode->attributes()) {
                    $st .= " ";
                    foreach ($attribnodes as $anode) {
                        $st .= $anode->node_name() . "='" .$anode->node_value() . "'";
                    }
                }
                $nodeText = cropHTML($cnode, $length, $maxLength, $replaceString);
                if (empty ($nodeText) && !$attribnodes)
                    $st .= " />"; // unary
                else
                    $st .= ">" . $nodeText . "</" . $cnode->node_name() . ">";
            }
        }
        if($length >= $maxLength) break;
    }
    return $st;
}

Also habe Ich mir das runtergeladen und in dem typo3 folgendes ausprobiert:

page.includeLibs.some_random_id_string = fileadmin/php/cropHTML.inc

lib.rootline.20 = USER 
lib.rootline.20 {
	userFunc = user_functions->cropHTML
	minLength = 20
	replaceString = ....
}

...aber leider ohne Erfolg #paralyzed#

Hat sich jemand vielleicht schon damit auseinandergesetzt? Ich wäre sehr dankbar für jede Hilfe.

Viele Grüße
Irisia

steffenk ·

erstens versteh ich nicht, was man mit einer RootlineExtension soll, die 4 Zeilen kann man auch ins TS schreiben

zweitens kann man crop wie bei jedem Menü machen mit

NO.stdWrap.crop=200|...

Nur der Text wird gecropt, der Link bleibt erhalten.

irisia3 ·

Hi Steffenk,

Danke für deine Antwort, aber das ist leider nicht das was Ich will, denn mit NO.stdWrap.crop=200|... wird jeden einzelnen Menüeintrag gezürzt und das was Ich wollte ist, die komplete rootline auf die Länge zu überprüfen und sie zu kürzen. Also mit diesen Quellecode

lib.rootline = HMENU
lib.rootline.special = rootline
lib.rootline.special.range = 0|-1
lib.rootline.includeNotInMenu = 1         #aktivieren (1), wenn auch versteckte Seite angezeigt werden sollen
lib.rootline.special.targets.8 = page
lib.rootline.1 = TMENU
lib.rootline.1 { 
	NO {
		stdWrap.crop=10|...|1
		doNotLinkIt = 1
		stdWrap.cObject = COA
		stdWrap.cObject {
			10 = TEXT
			10.field = title
			10.typolink {
				parameter.field = uid
			}
		}
		linkWrap = {$root}| &nbsp; > &nbsp; |*| | &nbsp; > &nbsp; |*| |
	}	
}

habe ich das Ergebniss:
lalalalala...>lalalalala...>lalalalala...>lalalalala...

und Ich wollte aber folgendes haben:
lalalalalala > ... > lalalalalala > lalalalalala > lalalalalala

Wenn du wüsstest wie man das mit 4 Zeilen Code machen kann, dann verrate es mir bitte!

Vielen Dank im Voraus und liebe Grüße
Irisia

steffenk ·

spontan nicht, ich würde über TS was konstruieren - sieht nach was zusammengesetztes aus

Root-Page > ...abhängig von treelevel... > rootline mit nur 2-3 Elementen

u.U. eine Anweisung mit Condition für jeden Treelevel.

irisia3 ·

Hallo Leute endlich habe Ich es hinbekommen und das wonach Ich gesucht habe war natürlich ganz einfach #paralyzed#
Hier auch die Lösungsvorschlag dazu:

lib.rootline = HMENU
lib.rootline.special = rootline
lib.rootline.includeNotInMenu = 0         #aktivieren (1), wenn auch versteckte Seite angezeigt werden sollen
lib.rootline.special.targets.8 = page
lib.rootline.1 = TMENU
lib.rootline.1.target = _top

[treeLevel = 0,1,2,3,4,5]		  #Diese Bedingung sort dafür, dass die Rootline ab 6 Ebene verkürzt wird
lib.rootline.special.range = 0|-1
lib.rootline.1.NO {
     allWrap = <div class="bluebox"></div> | &nbsp; > &nbsp; |*| | &nbsp; > &nbsp; |*| | 
}
[ELSE]
lib.rootline.special.range = -5|-1
lib.rootline.1.NO {
     allWrap = {$rootLine} | &nbsp; > &nbsp; |*| | &nbsp; > &nbsp; |*| | 
}
[END]
lib.rootline.special.range = -5|-1

sorgt nähmlich dafür, dass Rootline relativ zu aktueller Ebene neu berechnet wird und zwar z.B mit -5 fängt die Rootline bei der fünftletzte Ebene an.

{$rootLine} in Zeile 16 ist eine Konstante in der Ich dann die 0-te Ebene (root) plus '...' statisch reincodiert habe und es sieht so aus:

rootLine = <a href=index.php?id=1>Home</a> &nbsp;> &nbsp;... &nbsp;>&nbsp;

Und somit sieht meine fertige Rootline-Navigation wenn in tiefer in den Baumstruktur reingehe so aus:

Home > ... > Ebene 4 > Ebene 5 > Ebene 6 > Ebene 7 > Ebene 8

Viele Grüße
Irisia