Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

Den Link eines Menüpunktes durch JavaScript-Link ersetzen

Eingetragen von DrupalFan (1646)
am 20.05.2010 - 22:24 Uhr in
  • Allgemeines zu Drupal
  • Drupal 6.x

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?

‹ [Gelöst] PHP-Code TRUE für bestimmte Nodes aus einem Array? Externe CSS Datei einbinden ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Da du nur einen einzigen Link

Eingetragen von Fleshgrinder (31)
am 21.05.2010 - 09: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 die template.php zu verschieben. Dabei musst du aber trotzdem die selbe Funktion ausführen, also str_replace(). Meine Empfehlung, lass es wie es ist.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Vielleicht geht's doch besser

Eingetragen von DrupalFan (1646)
am 21.05.2010 - 11: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 ...

  • Anmelden oder Registrieren um Kommentare zu schreiben

page.tpl.php

Eingetragen von Fleshgrinder (31)
am 21.05.2010 - 18: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 ist str_replace völlig okay.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Menü-Variable wie ansprechen?

Eingetragen von DrupalFan (1646)
am 21.05.2010 - 18: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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Genau so ist es, entscheidend

Eingetragen von Fleshgrinder (31)
am 21.05.2010 - 19: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 deiner template.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 die template.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 mit str_replace() durchforsten.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Variable für Menü

Eingetragen von DrupalFan (1646)
am 21.05.2010 - 19:52 Uhr

Heisst das, dass man in der page.tpl.php das zusätzliche Custom-Menü gar nicht ansprechen kann? Nur über $left?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ja, die Variable $left ist

Eingetragen von Fleshgrinder (31)
am 21.05.2010 - 20: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 entsprechende block-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 mit theme('links', $custom_menu);. Beim Erstellen von einem neuen Menü muss zuerst ja der maschinenlesbare Name angegeben werden. Dieser sollte dann als Variable in der page.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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Du wirst doch in der Lage

Eingetragen von Tobias Bähr (4019)
am 22.05.2010 - 00: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/');

  • Anmelden oder Registrieren um Kommentare zu schreiben

In dem Fall kein JQuery

Eingetragen von DrupalFan (1646)
am 22.05.2010 - 00:16 Uhr

Ja klar, aber genau das soll es in dem Fall nicht sein, weil es darum geht, dass Google diesen Link niemals verfolgt.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Du willst etwas mit

Eingetragen von Tobias Bähr (4019)
am 22.05.2010 - 00:28 Uhr

Du willst etwas mit JavaScript ersetzen, richtig?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Serverseitig

Eingetragen von DrupalFan (1646)
am 22.05.2010 - 00: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).

  • Anmelden oder Registrieren um Kommentare zu schreiben

Dann ist es aber kein

Eingetragen von Tobias Bähr (4019)
am 22.05.2010 - 00: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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Doch, Javascript-Code

Eingetragen von DrupalFan (1646)
am 22.05.2010 - 00: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>
so verlinkt wird:
<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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Der Titel des Threads ist

Eingetragen von Fleshgrinder (31)
am 22.05.2010 - 01:49 Uhr

Der Titel des Threads ist denke ich unmissverständlich.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Du weißt google wird diesen

Eingetragen von Tobias Bähr (4019)
am 23.05.2010 - 10: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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Google SOLL den Link nicht verfolgen können

Eingetragen von DrupalFan (1646)
am 25.05.2010 - 12: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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

hook_menu_link_alter

Eingetragen von Tobias Bähr (4019)
am 25.05.2010 - 18: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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Das hatten wir schon: Kein

Eingetragen von DrupalFan (1646)
am 25.05.2010 - 19:08 Uhr

Das hatten wir schon: Kein JQuery. Serverseitig!

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich würde das machen. Du

Eingetragen von Tobias Bähr (4019)
am 25.05.2010 - 20:27 Uhr

Ich würde das machen. Du kannst das ja via hook machen, siehe Link.

  • Anmelden oder Registrieren um Kommentare zu schreiben

robots.txt

Eingetragen von Thomas Zahreddin (262)
am 25.05.2010 - 20:50 Uhr

siehe http://de.wikipedia.org/wiki/Robots_Exclusion_Standard

Disallow: Pfad

fertig.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ja, danke. Gute Idee.

Eingetragen von DrupalFan (1646)
am 25.05.2010 - 21: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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Dynamische Ansicht von Seiteninhalt (als Tabelle?)
  • Vergabe von Berechtigungen für bestimmte Rollen; mir fehlt der Haken bzw. das „Veröffentlicht“
  • Ich brauche dringen Hilfe zu Updates oder ggf. wwie geht Composer?
  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • Rolle erstellen nicht zu finden
  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
Weiter

Neue Kommentare

  • Arrrrg. Nix Tabelle :-D /*
    vor 3 Wochen 3 Tagen
  • Textboxen mit Tabelle
    vor 3 Wochen 3 Tagen
  • Du sollst ja auch keine
    vor 3 Wochen 3 Tagen
  • Theme
    vor 3 Wochen 3 Tagen
  • Welches Theme benutzt du
    vor 3 Wochen 3 Tagen
  • Mit Responsive Raster hatte
    vor 3 Wochen 4 Tagen
  • Hallo Alex,um das Häkchen
    vor 3 Wochen 4 Tagen
  • Modul view_unpublished
    vor 3 Wochen 5 Tagen
  • Modul "override node options"
    vor 3 Wochen 6 Tagen
  • Im Grunde ist dass ein
    vor 4 Wochen 1 Tag

Statistik

Beiträge im Forum: 250270
Registrierte User: 20483

Neue User:

  • Aathivithyah
  • Aoirhic
  • Stevebok

» Alle User anzeigen

User nach Punkten sortiert:
wla9463
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 49 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association