Auf aktuelle Seite prüfen und Link ggfs. mit class="active" versehen

Hallo,

ich habe mich jetzt schon ein wenig durch das Forum und durch die Dokumentation gewühlt, aber nichts dazu gefunden…

Ich habe folgendes Template:

<div class="home"><a href="[{$shop->selflink}]"> </a></div>
<div class="about"><a href="[{ oxgetseourl oxid="02d870ef75a3d2f522684977bf640838" type="oxcontent" }]"> </a></div>
<div class="news"><a href="[{ oxgetseourl ident=$oViewConf->getSelfLink()|cat:"cl=news" }]"> </a></div>
...

Ich möchte nun, dass der <a>-Tag für die aktuelle Seite zusätzlich die CSS-Klasse “active” bekommt.

Ist das irgendwie möglich?

Smarty stellt standardmäßig einige Arrays zur Verfügung.
Mit
[{$smarty.server.SCRIPT_URI}]
solltest Du die Urls vergleichen können.

Darüber habe ich auch schon nachgedacht, ist aber natürlich nicht so elegant. Sobald bei einer Content-Seite der Titel geändert wird, greift der Code nicht mehr.

Warum?
Du fragst doch noch, ob die aktuelle Adresse identisch mit den aktuellen SEO-Link ist.
Ändert sich der SEO-Link, und Du klickst dadrauf ändert sich auch die aktuelle Adresse.

Natürlich währe es eleganter, wenn man eine Methode wie zB. istAktiv() hätte… vielleicht gibt es so etwas sogar.

Hallo,

du kannst übers config Object->getParameter(‘cl’) machen dann hast die aktuelle view Klasse. Denke das hilft dir weiter?

Gruß

hi,

ich versuche auch schon recht verzweifelt, den/die Links im menu zur aktuelle Seite mit ner Klasse zu versehen… nachdem was MBa geschrieben hat, sollte es doch eig so klappen, oder?

[{assign var="oCont" value=$oView->getContentByIdent("oxagb") }]
    <li [{if $smarty.server.SCRIPT_URI == $oCont->getLink() }]class="active"[{/if}]><a href="[{ $oCont->getLink() }]"><span>[{ $oCont->oxcontents__oxtitle->value }]</span></a></li>

Es passiert aber nix … die Klasse wird nicht gesetzt und auch keine Fehlermeldung angezeigt… ich hab einfach mal [{$smarty.server.SCRIPT_URI}] in den tpl file eingefügt… da wird auch nicht angezeigt … denke das die Variable leer ist…

benutze xampplite 1.6.7 auf windows.

@MaGro kannst du mal ein Beispiel für config Object->getParameter(‘cl’) machen? wäre dir sehr dankbar ^^

Wie das funktioniert würde mich auch sehr interessieren.

[B]Nachtrag:[/B] Ich hab mal ein wenig rumgefummelt und dabei ist folgende Lösung zustande gekommen.

CMS-Seiten mit einer class=“active” versehen:


<ul>
	...
	[{assign var="oCont" value=$oView->getContentByIdent("oxagb") }]
	<li><a [{ if $oCont->getLink() == $oxcmp_lang[0]->link }]class="active"[{/if}] href="[{ $oCont->getLink() }]">[{ $oCont->oxcontents__oxtitle->value }]</a></li>
	[{ assign var="oCont" value=$oView->getContentByIdent("oxsecurityinfo") }]
	<li><a [{ if $oCont->getLink() == $oxcmp_lang[0]->link }]class="active"[{/if}] href="[{ $oCont->getLink() }]">[{ $oCont->oxcontents__oxtitle->value }]</a></li>
	...
</ul>

Systemseiten mit einer class=“active” versehen:


<ul>
	...
	<li><a [{ if $additionalparams == "cl=news&searchparam=" }]class="active"[{/if}] href="[{ oxgetseourl ident=$oViewConf->getSelfLink()|cat:"cl=news" }]">[{ oxmultilang ident="PAGE_NEWS_TITLE" }]</a></li>
	<li><a [{ if $additionalparams == "cl=contact&searchparam=" }]class="active"[{/if}] href="[{ oxgetseourl ident=$oViewConf->getSelfLink()|cat:"cl=contact" }]">[{ oxmultilang ident="INC_HEADER_CONTACT" }]</a></li>
	...
</ul>

Zumindest scheint es zu funktionieren. Ob es allerdings der [I]richtige Weg[/I] ist, kann ich nicht sagen. Evtl. ist ja der ein oder andere Crack hier, der es verbessern kann. Würde mich freuen.

Ansonsten, Bitte an Moderator Thread mit [gelöst] versehen.

Gruss
Eddie

hey eddie,

also deine Lösung sah, für mich als Anfänger, erstmal ganz gut aus :smiley: habs dann mal bei mir reinkopiert … geht leider irgendwie nicht … naja ich hab mir auch mal ne Lösung einfallen lassen, mit Hilfe des Post von MBa… nicht wirklich schön aber funktioniert:

[{assign var=url value='http://'|cat:$smarty.server.HTTP_HOST|cat:$smarty.server.REQUEST_URI}]

damit hat $url die aktuelle Url der Seite…

Mir fällt grad auf, dass es nur ohne ssl geht… wenn der Shop ssl verwendet, stimmt die Url nicht mehr … es müsste dann https:// heißen … verwende kein ssl im Shop, aber evtl kann man überprüfen, ob ssl aktiv is und gegebenenfalls die https-Url zu weisen…

Nun aber weiter mit dem Code :wink:

…und um zu prüfen ob ein Link die aktuelle Seite ist:

...
[{assign var="oCont" value=$oView->getContentByIdent("oxagb") }]
<li [{if $url == $oCont->getLink()}]class="active"[{/if}]><a href="[{ $oCont->getLink() }]">[{ $oCont->oxcontents__oxtitle->value }]</a></li>
...

Das Problem mit den Server-Variablen zu lösen und mit Smarty ne Url “zusammenzustöpseln”, scheint mir eig keine so “schöne” Lösung zu sein … aber da ich keine andere kenne, muss es erstmal so gehen ^^

Über nen Tipp von nem Pro wäre ich auch echt dankbar … das Problem is ja nicht so exotisch.

mfg,
schlompf

Hi schlompf,

vielen Dank auch für deine Lösung. Sieht einen Tick feiner aus als meine. Muss ich mir mal wenn ich heute abend daheim bin genauer ansehen.

[B]// Nachtrag:[/B] Die Lösung oben funktioniert bei mir mit der Version OXID_ESHOP_CE_4.1.5_21618.

Ich hatte so etwas ähnliches vor wie du kam aber nicht zu dem gewünschten Ergebnis. Wusste nicht genau wie ich das mit PHP und den Smarty Tags realisieren konnte. Erst jetzt kommt man so langsam dahinter … debug hat viel geholfen.

HTTPS kann recht gut abgefangen werden, so z.B.:


<?php
function curPageURL() {
 $pageURL = 'http';
 if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
 $pageURL .= "://";
 if ($_SERVER["SERVER_PORT"] != "80") {
  $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
 } else {
  $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
 }
 return $pageURL;
}
?>
<?php
  echo curPageURL();
?>

Quelle: http://www.webcheatsheet.com/PHP/get_current_page_url.php.

Nochmals danke und Gruss.

Ebene bin ich beim selben Problem und wenn eine Blätterfunktion noch im Spiel ist, dann geht das alles nicht wirklich. Die starre Abfrage nach REQUEST_URI ist dann unbrauchbar. Gibt es dafür auch Lösungen?

So ich spiele mal Totengräber.

Ich tüftel seit Stunden rum. Nur irgendwie bekomme ich es nicht gebacken.


[{php}]
	function curPageURL() {
		 $pageURL = 'http';
		 if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
		 $pageURL .= "://";
		 if ($_SERVER["SERVER_PORT"] != "80") {
		  $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
		 } else {
		  $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
		 }
		 return $pageURL;
	}
	$myURL = curPageURL();
	$this->assign($myURL);
[{/php}]

[{$myURL}]


Im smarty-Bereich ist aber die Variable $myURL leer.
Was mache ich den falsch?

Danke und sry für das ausgraben :wink:

Hallo,

weiß zwar, dass der Thread hier schon ein bisschen älter ist, aber wollte noch einen Lösungsvorschlag beisteuern, der für mich funktioniert.

Wie schon vorher festgestellt wurde, kann man Systemseiten mit einer “active”-Klasse versehen, in dem man einfach den Klassennamen abfragt:


[{if $oView->getClassName() eq "start"}]class="active"[{ /if }]
[{if $oView->getClassName() eq "news"}]class="active"[{ /if }]
[{if $oView->getClassName() eq "contact"}]class="active"[{ /if }]
...

Da die Lösungsvorschläge für CMS-Seiten bei mir nicht funktioniert haben, habe ich kurzerhand den Lösungsweg genommen, die Variable “title” mit einem vordefiniertem String abzufragen:


[{if $title eq "Produkte"}]class="active"[{ /if }]
[{if $title eq "Download"}]class="active"[{ /if }]
[{if $title eq "Service"}]class="active"[{ /if }]
...

Den Wert der Variable “title” könnt ihr über den Debug-Mode herausfinden, wobei dieser in der Regel dem tatsächlichem Seitentitel entspricht, bis auf Umlaute und Sonderzeichen:


[{ debug }]

Ist zwar vielleicht nicht die eleganteste Lösung, aber funktioniert für mich im Moment ganz gut.

Hoffe ich konnte helfen. :wink:

Gruß, Andreas

Danke Andreas, dein Lösungsansatz hat mir geholfen.

Kleine Ergänzung:
Es muss $template_title heißen und nicht $title

[{if $template_title eq “Produkte”}]class=“active”[{ /if }]

Freut mich, dass ich helfen konnte. :slight_smile:

Danke für die Ergänzung, $template_title macht wirklich mehr Sinn.

Gruß, Andreas

[QUOTE=seifert.eduard;13569]Wie das funktioniert würde mich auch sehr interessieren.

[B]Nachtrag:[/B] Ich hab mal ein wenig rumgefummelt und dabei ist folgende Lösung zustande gekommen.

CMS-Seiten mit einer class=“active” versehen:


<ul>
	...
	[{assign var="oCont" value=$oView->getContentByIdent("oxagb") }]
	<li><a [{ if $oCont->getLink() == $oxcmp_lang[0]->link }]class="active"[{/if}] href="[{ $oCont->getLink() }]">[{ $oCont->oxcontents__oxtitle->value }]</a></li>
	[{ assign var="oCont" value=$oView->getContentByIdent("oxsecurityinfo") }]
	<li><a [{ if $oCont->getLink() == $oxcmp_lang[0]->link }]class="active"[{/if}] href="[{ $oCont->getLink() }]">[{ $oCont->oxcontents__oxtitle->value }]</a></li>
	...
</ul>

Systemseiten mit einer class=“active” versehen:


<ul>
	...
	<li><a [{ if $additionalparams == "cl=news&searchparam=" }]class="active"[{/if}] href="[{ oxgetseourl ident=$oViewConf->getSelfLink()|cat:"cl=news" }]">[{ oxmultilang ident="PAGE_NEWS_TITLE" }]</a></li>
	<li><a [{ if $additionalparams == "cl=contact&searchparam=" }]class="active"[{/if}] href="[{ oxgetseourl ident=$oViewConf->getSelfLink()|cat:"cl=contact" }]">[{ oxmultilang ident="INC_HEADER_CONTACT" }]</a></li>
	...
</ul>

Zumindest scheint es zu funktionieren. Ob es allerdings der [I]richtige Weg[/I] ist, kann ich nicht sagen. Evtl. ist ja der ein oder andere Crack hier, der es verbessern kann. Würde mich freuen.

Ansonsten, Bitte an Moderator Thread mit [gelöst] versehen.

Gruss
Eddie[/QUOTE]

Hi Eddie,
dein Vorschlag bezüglich der CMS Seite funktioniert bei mir auch soweit. Danke erstmal.
Vielleicht hättest Du noch kurz die Muse und kannst mir kurz erklären wie die if-Abfrage funktioniert.

Du legst ja die Variable mit dem entsprechenden CMS-ident an.
Und dann das if:
[{if $oCont->getLink() == $oxcmp_lang[0]->link }]

Den Kandidaten verstehe ich nicht: == $oxcmp_lang[0]