Zum Inhalt springen

Feste Links in HTML-Vorlage ohne Path Prefix?

Erstellt am 17. Juli 2008 · 3 Antworten · letzte Antwort am 23. Juli 2008

Tags: Frage

Der Dude ·

Hallo zusammen! In meiner HTML-Vorlage sind Direktsprungmarken zum Inhalt und zur Navigation sowie andere Links fest integriert.

<a href="#contentMain">..</a>

In der gerenderten Seite wird leider auch bei diesen Links der Path-Prefix durch Templavoila davor gesetzt und macht somit diese Links unbenutzbar.

<a href="fileadmin/templates/#contentMain">..</a>

Die automatische Anpassung für den Großteil der Links, wie CSS-Einbindungen, Layoutbilder etc. ist's ja erwünscht aber wie kann ich die automatische Anpassung dieser festen Links durch Templavoila verhindern? Habe bisher nirgends eine Lösung finden können. Bin für jeden Tipp dankbar!

Der Dude ·

Für Diejenigen, die es interessiert, hier ein paar Details und ein Lösungsansatz dazu. Das Problem scheint schon eine Weile zu existieren und ist bei TYPO3 bugtracker gemeldet, leider bisher ohne Lösung.

http://bugs.typo3.org/view.php?id=5418
http://bugs.typo3.org/view.php?id=4703

Das Problem liegt darin, dass generell bei bestimmten Tags (auch Links mit Sprungmarken) die Funktion prefixResourcePath() aus dem Typo3 Core für das "Prefixen" von hrefs/src/action vom TemplaVoila benutzt wird. Die vom Entwickler empfohlene Behebung des Problems durch config.prefixLocalAnchors = 0 hat leider keine Auswirkung.

Bei der Entwicklung eines Workarounds hat sich bei mir nachfolgende Anpassung im entsprechenden Script durchgesetzt. Die Benutzung ist selbstverständlich auf eigenes Risiko und keine Ahnung, ob eventuell andere Funktionalitäten davon betroffen sind.

Die Idee war nicht nur Sprungmarken von der PrefixPath - Behandlung auszuschließen sondern alle Tags, die gleich in der HTML-Vorlage gesondert gekennzeichnet werden. Ich hab mich dazu entschieden, dies im allgemeinen Universalattribut "class" zu regeln, da dies erstens valide ist, zweitens in allen Tags verfügbar und drittens trotzdem die eigentlichen CSS - Klassen weiterhin benutzt werden können. Alle Tags innerhalb der Vorlage, die von der PrefixPath - Behandlung ausgeschlossen werden sollen, bekommen nun class = "fixedPath" zugewiesen. Weitere oder bestehende Klassen könnten über class = "fixedPath cssKlasse" benutzt werden.

Nun muss noch die entsprechende Klasse vom Typo3 Core angepasst werden. Dazu die Datei "t3lib\class.t3lib_parsehtml.php" öffnen und in der Funktion prefixResourcePath() nachfolgende Anpassung durchführen.
Nach der Zeile
$params = $this->get_tag_attributes($v,1);
diese Zeile einfügen:
if (isset($params[0]['class']) && strstr($params[0]['class'], 'fixedPath') ) continue;

Die ersten Zeilen der Funktion sollten dann so beginnen:

function prefixResourcePath($main_prefix,$content,$alternatives=array(),$suffix=''){
$parts = $this->splitTags('embed,td,table,body,img,input,form,link,script,a',$content);
foreach ($parts as $k => $v){
  if ($k%2){
    $params = $this->get_tag_attributes($v,1);
    if (isset($params[0]['class']) && strstr($params[0]['class'], 'fixedPath') ) continue;
    $tagEnd = substr($v,-2)=='/>' ? ' />' : '>';
    .....
}

Damit wird der aktuelle Schleifendurchlauf bei den mit class = "fixedPath" gekennzeichneten Tags übersprungen und so die PrefixPath - Behandlung für diese Tags ausgehebelt.

Nach den Anpassungen zur Sicherheit das aktuelle Mapping noch mal Speichern, die Cache's leeren und das Ganze sollte funzen. Viel Spaß damit und schönes Wochenende!

PeterAllfonds ·

Ich habe das selbe Problem gehabt, als ich auf jeder Seite im Footer einen Link nach oben brauchte. Also href="#top".
Da ich das nur hier brauchte, wollte ich nichts am core ändern und habe den folgenden Workaround verwendet:

1. Den Link ins HTML-Seitentemplate eingefügt.
2. Ein neues Attribut-Feld im Seitentemplate angelegt und als Input Type [None] definiert.
3. Das neue Feld auf das href Attribut gemappt.
4. Die DS des Seitentemplates editiert und für das neue Feld das folgende TS eingetragen:
<TypoScript><![CDATA[
10 = TEXT
10.typolink.parameter.data = page:uid
10.typolink.section = top
10.typolink.returnLast = url
]]></TypoScript>

Jetzt wird das href Attribut halt mit Typoscript befüllt und enthält den Pfad zur aktuellen Seite plus #top.
Etwas Aufwand für einen einfachen Link, aber in diesem Fall konnte ich damit besser leben, als mit einem Core Hack.