Den Link eines Menüpunktes durch JavaScript-Link ersetzen
![](http://www.drupalcenter.de/files/noavatar_mini.gif)
am 20.05.2010 - 21:24 Uhr in
Ich möchte den Link eines Menüpunkte durch einen JavaScript Link ersetzen.
Derzeit mache ich das, in dem ich in der page.tpl.php in der Variable $left den String des href-Links durch einen JavaScript Link ersetzt mit str_replace.
Gibt es da nicht bessere Methoden um auf die einzelnen Menüpunkte zuzugreifen und Ersetzungen zu machen oder einen Linkcode speziell zu gestalten?
- Anmelden oder Registrieren um Kommentare zu schreiben
Da du nur einen einzigen Link
am 21.05.2010 - 08:04 Uhr
Da du nur einen einzigen Link abändern willst, ist das Einzige was du machen kannst, die Funktion von der
page.tpl.php
in dietemplate.php
zu verschieben. Dabei musst du aber trotzdem die selbe Funktion ausführen, alsostr_replace()
. Meine Empfehlung, lass es wie es ist.Vielleicht geht's doch besser
am 21.05.2010 - 10:40 Uhr
Ja, aber auf welche Variable würde dann genau das str_replace angewendet werden? Ebenfalls auf $left? Und wie müsste da die Funktion in der template.php lauten, um auf die Variable Zugriff zu haben?
Was mir nicht so gefällt, ist das ganze $left zu verändern, ich würde lieber nur auf das Menü oder nur auf den einzigen Menüpunkt zugreifen und dort dann Veränderungen machen, z. Bsp. auch durch String-Ersetzungen oder anders.
Und die Frage ist bei mir immer, wann man nun denn ein mb_str_replace braucht und wann nicht? Dann eigentlich ist hier ja alles in UTF-8 ...
page.tpl.php
am 21.05.2010 - 17:24 Uhr
page.tpl.php
Implementierungsmöglichkeiten:<?php
/**
* Eine weitere Möglichkeit ist es die Primary Links in der page.tpl.php durch den
* entsprechenden Aufruf von theme() in eine Zeichenkette umzuwandeln und diese
* dann durch zu gehen.
*/
echo str_replace('foo', 'bar', theme('links', $primary_links));
/**
* Natürlich können wir den Array $primary_links auch aufschlüsseln lassen von PHP
* und nur den href-Offset im Array durchsuchen.
*/
foreach ($primary_links as $menu_item) {
str_replace('foo', 'bar', $menu_item['href']);
}
echo theme('links', $primary_links);
?>
template.php
-Implementierung:<?php
function mytheme_links($links, $attributes = array('class' => 'links')) {
global $language;
$output = '';
if (count($links) > 0) {
$output = '<ul'. drupal_attributes($attributes) .'>';
$num_links = count($links);
$i = 1;
foreach ($links as $key => $link) {
$class = $key;
// Add first, last and active classes to the list of links to help out themers.
if ($i == 1) {
$class .= ' first';
}
if ($i == $num_links) {
$class .= ' last';
}
if (isset($link['href']) && ($link['href'] == $_GET['q'] || ($link['href'] == '<front>' && drupal_is_front_page()))
&& (empty($link['language']) || $link['language']->language == $language->language)) {
$class .= ' active';
}
$output .= '<li'. drupal_attributes(array('class' => $class)) .'>';
if (isset($link['href'])) {
if ($link['href'] == 'foo') {
$link['href'] = 'bar';
}
// Pass in $link as $options, they share the same keys.
$output .= l($link['title'], $link['href'], $link);
}
else if (!empty($link['title'])) {
// Some links are actually not links, but we wrap these in <span> for adding title and class attributes
if (empty($link['html'])) {
$link['title'] = check_plain($link['title']);
}
$span_attributes = '';
if (isset($link['attributes'])) {
$span_attributes = drupal_attributes($link['attributes']);
}
$output .= '<span'. $span_attributes .'>'. $link['title'] .'</span>';
}
$i++;
$output .= "</li>\n";
}
$output .= '</ul>';
}
return $output;
}
?>
Wie du siehst sind die obigen um einiges einfacher, wenn auch die Implementierung in der
template.php
-Datei unter'm Strich am wenigsten Leistung verbraucht und UTF-8 auch kein Thema mehr ist.Was deine Frage zu UTF-8 betrifft, so musst du dich erstmal selbst fragen, suche ich nach einem UTF-8-Zeichen? die ersten 128 Zeichen von UTF-8 sind zum ASCII-Code kompatibel und setzen sich alle aus genau einem Byte zusammen. Entsprechenden ist es unnötig mit
mb_
-Funktionen zu arbeiten (wie der Name „Multi-Byte“ schon sagt, sind die Funktionen nur notwendigen wenn mit Zeichen gearbeitet wird die sich aus mehr als einem Byte zusammensetzen). Solltest du also nicht nach Zeichen außerhalb vom ASCII-Code suchen iststr_replace
völlig okay.Menü-Variable wie ansprechen?
am 21.05.2010 - 17:35 Uhr
Oh, danke, die Funktionen werde ich mir genauer anschauen.
Zu multibye replace: Dann ist es egal, ob in dem gesamten String, bei dem nur ein kleiner Teil ersetzt werdenn soll, sehr wohl MB-Zeichen enthalten sind (Umlaute?. Entscheidend ist nur der zu ersetzende String und nicht der gesamte String, in dem etwas ersetzt wird?
Bei dem Menü handelt es sich NICHT um ein primary und nicht um ein secondary Menü. Es ist ein zusätzliches Menü. Wie spricht man das denn an?
Genau so ist es, entscheidend
am 21.05.2010 - 18:09 Uhr
Genau so ist es, entscheidend ist immer die zu suchende Zeichenkette. Wenn andere Zeichen als die zu Suchenden sich aus Multibyte-Zeichen zusammensetzen ist es völlig egal, da du diese Multibyte-Zeichen sowieso nicht suchst.
Um irgendein Menü zu durchsuchen, musst du alle Links die Drupal erstellt durchsuchen. Hierzu müsstest du die
theme_links()
Funktion in deinertemplate.php
überschreiben (also komplette Funktion rüberkopieren,theme
mit dem Engine-Namen oder deinem Theme-Namen ersetzten und die gewünschten Änderungen an der Funktion durchführen). Der obige Code für dietemplate.php
macht genau das.Die andere Möglichkeit, ist die, die du jetzt bereits anwendest. Die Variable in
page.tpl.php
die das Menü enthält mitstr_replace()
durchforsten.Variable für Menü
am 21.05.2010 - 18:52 Uhr
Heisst das, dass man in der page.tpl.php das zusätzliche Custom-Menü gar nicht ansprechen kann? Nur über $left?
Ja, die Variable $left ist
am 21.05.2010 - 19:12 Uhr
Ja, die Variable
$left
ist ein String und enthält alle Inhalte ausschließlich als eine lange Zeichenkette. Würde es sich um einen Block handeln und nicht um ein Menü könntest du über eine entsprechendeblock-XXX.tpl.php
-Datei noch darauf zugreifen, doch bei einem Menü sind mir persönlich keine anderen Zugriffsmöglichkeiten bekannt (was nicht bedeutet, dass es keine gibt, nur ich kenne keine).Edit: Eigentlich müsste das Menü auch über die
theme()
-Funktion aufrufbar sein. Also mittheme('links', $custom_menu);
. Beim Erstellen von einem neuen Menü muss zuerst ja der maschinenlesbare Name angegeben werden. Dieser sollte dann als Variable in derpage.tpl.php
zur Verfügung stehen, sodass du wieder die obigen Funktionen von mir anwenden kannst, nur eben$primary_links
durch$custom_menu
(Name entsprechend angepasst) ersetzen musst.Probiere das doch mal und sag Bescheid ob es geht, würde mich jetzt auch interessieren.
Du wirst doch in der Lage
am 21.05.2010 - 23:12 Uhr
Du wirst doch in der Lage sein mit ein bisschen JQuery html zu ersetzen.
Zum Beispiel:
$("a:contains('DrupalFan')").attr('href', 'http://jquery.com/');
In dem Fall kein JQuery
am 21.05.2010 - 23:16 Uhr
Ja klar, aber genau das soll es in dem Fall nicht sein, weil es darum geht, dass Google diesen Link niemals verfolgt.
Du willst etwas mit
am 21.05.2010 - 23:28 Uhr
Du willst etwas mit JavaScript ersetzen, richtig?
Serverseitig
am 21.05.2010 - 23:34 Uhr
Ja.
Es ist eh schon realisiert. Ich will es auf keinen Fall mit JQuery machen. Es soll serverseitig gemacht werden, also in PHP.
Allerdings kannst Du mir gerne ein paar JQuery-Tricks oder Anwendungen verraten, die man sonst noch einsetzen kann auf Drupalseiten (wenn es nicht serverseitig sein muss).
Dann ist es aber kein
am 21.05.2010 - 23:48 Uhr
Dann ist es aber kein Javascript, dann solltest du dein Titel ändern auf das was du wolltest und dann
[gelöst]
nicht vergessen, wenn das schon getan ist.Doch, Javascript-Code
am 21.05.2010 - 23:59 Uhr
Oh doch, es ist dann JavaScript. Du meinst ja was anderes, aber ich meine, dass der Link statt mit
<a href="http://www.domain.de/link1">Link1</a>
<a href="#" onclick="window.location='/link1';">Link1</a>
Und daher die Frage nach dem Zugriff auf die Menüvariable um es dort mit PHP zu ersetzen.
Der Titel des Threads ist
am 22.05.2010 - 00:49 Uhr
Der Titel des Threads ist denke ich unmissverständlich.
Du weißt google wird diesen
am 23.05.2010 - 09:38 Uhr
Du weißt google wird diesen Pfad auch nicht folgen können. Und wenn ich das so sehe, machen solche Links auch 0 Sinn. Aber egal ich muss die Sinnlosigkeit niemand andrehen.
Menüpunkte kann du hiermit http://api.drupal.org/api/function/hook_menu_link_alter/6 ändern via PHP.
Google SOLL den Link nicht verfolgen können
am 25.05.2010 - 11:09 Uhr
Genau darum geht es. Google soll diesen Link auf keinen Fall mehr verfolgen können. Genau das ist der einzige Grund, warum ich den JavaScript Link brauche. Es gibt Fälle, wo genau das nötig ist und so ist es hier!
Kannst Du ein Bsp. machen, wie man hook_menu_link_alter in der template.php anwendet?
hook_menu_link_alter
am 25.05.2010 - 17:51 Uhr
hook_menu_link_alter Beispiele findest du hier http://drupalcontrib.org/api/search/6/_menu_link_alter , aber das geht via Theme glaube ich nicht. Ich würde in diesem Fall den Link mit Jquery hinzufügen, wenn dieser sowie nur mit Javascript klickbar ist.
Das hatten wir schon: Kein
am 25.05.2010 - 18:08 Uhr
Das hatten wir schon: Kein JQuery. Serverseitig!
Ich würde das machen. Du
am 25.05.2010 - 19:27 Uhr
Ich würde das machen. Du kannst das ja via hook machen, siehe Link.
robots.txt
am 25.05.2010 - 19:50 Uhr
siehe http://de.wikipedia.org/wiki/Robots_Exclusion_Standard
Disallow: Pfad
fertig.
Ja, danke. Gute Idee.
am 25.05.2010 - 20:36 Uhr
Ja, danke. Gute Idee. Vielleicht brauche ich das später noch.
Ich habe den JavaScript-Link wie oben beschrieben schon vor ein paar Tagen eingebaut und man glaubt es kaum, aber bei den Google Webmaster Tools sehe ich schon jetzt das Ergebnis: Dieser Menüpunkt hatte zuvor die meisten Verlinkungen bei den internen Links, jetzt nicht mehr, ist gefallen, Problem damit entschärft. Jetzt bleibt nur noch die Frage, wie man bei der internen Verlinkung die Startseite selbst an 1. Stelle bekommt, sprich die meisten internen Links auf die Startseite zeigen laut Webmaster Tools. Wahrscheinlich durch Setzen weitere Links zur Startseite, obwohl die sowieso existieren. Aber das ganze ist ein ganz anderes Thema.