'a class="active"' zu 'span class="active" - blicke nicht durch :(
am 02.02.2011 - 13:31 Uhr in
Hallo zusammen,
ich begreife einfach nicht, was ich anstellen muss, damit ich alle
<a class="active" >Menütitel</a>
ersetzen kann durch
<span class="active" >Menütitel</span>
Es geht also um die primary *und* secondary Links.
Vielen Dank für jeden Tipp in die richtige Richtung!
Herzliche Grüße,
Matilda
- Anmelden oder Registrieren um Kommentare zu schreiben

Hier gibts ne Menge Snippets
am 02.02.2011 - 14:44 Uhr
Hier gibts ne Menge Snippets um die Links anzupassen: -> http://drupal.org/node/224825
Edit -
nach ein wenig Googlen dürfte das wohl die gewünschte Lösung beinhalten: -> http://drupal.org/node/221382#comment-2271738
Gibt übrigens unzählige Treffer wenn Du nach"drupal add span to primary links" suchst!
Die Snippet-Liste kannte ich
am 02.02.2011 - 16:23 Uhr
Die Snippet-Liste kannte ich noch nicht - und ich suche jetzt seit 3 Tagen nach einer Lösung!
"drupal add span to primary links"
ich habe ja meine Suchanfrage sogar noch spezieller auf meine Frage formuliert, weil ich ja nicht einfach nur ein span-Element hinzufügen möchte, sondern gezielt die a-Elemente, die mit einer class="active" durch Drupal ausgezeichnet sind, rausgreifen möchte und dann durch ein span-Element der gleichen Klasse ersetzen will (und das ganz bewusst.).
Ich möchte dazu nicht unbedingt ein zusätzliches Modul installieren müssen. Ich denke, dass http://drupal.org/node/221382#comment-1464472 oder http://drupal.org/node/221382#comment-2271738 meinem Problem nahe kommen, allein begreife ich nicht, wie ich die Syntax formulieren muss, um dezidiert auf Link class="active" zugreifen zu können.
Mir ist auch nicht klar, was damit gemeint ist, wenn es in dem letzt genannten Post heißt "and use the preprocess_page function in D6." - was soll ich denn mit dem Code von http://api.drupal.org/api/drupal/includes--theme.inc/function/template_p... machen?
Was ich bei den zig Treffern über Google unter anderem auch sehr verwirrend finde ist, dass man oft erst auf den zweiten oder noch weiteren Blick herausfindet, dass da Snippets für ältere Versionen vorgestellt werden. Da probiere ich ja auch per Trial-and-Error, wenn ich nicht zeitnah nachvollziehen kann, ob der jeweilige Code aufwärtskompatibel ist.
Hm, wenn du oder jemand weiteres noch Stubser in die Richtige Richtung für mich hat, bedanke ich mich schon jetzt!
Viele Grüße, Matilda
Matilda schrieb Mir ist auch
am 02.02.2011 - 19:34 Uhr
Mir ist auch nicht klar, was damit gemeint ist, wenn es in dem letzt genannten Post heißt "and use the preprocess_page function in D6." - was soll ich denn mit dem Code von http://api.drupal.org/api/drupal/includes--theme.inc/function/template_p... machen?
Ja das mit den Versionen it ärgerlichin der Dokumentation. Bzgl. Deiner obigen Frage ... du musst die Funktion in die template.php Deines verwendeten Themes schreiben!
function mytheme_menu_item_link($link) {if (empty($link['localized_options'])) {
$link['localized_options'] = array();
}
$link['title'] = $link['title'] = '<span class="link">' . check_plain($link['title']) . '</span>';
$link['localized_options'] += array('html'=> TRUE);
return l($link['title'], $link['href'], $link['localized_options']);
}
Das fügst Du einfach in die template.php ein und ersetzt mytheme in function mytheme_menu_item_link($link) mit deinem Theme-Namen, dann aktualisierst Du Dein Theme nochmal und dadurch wird dann die eigentliche Core Funktion für dieses Theme "überschrieben"
Falls Du keine template.php im Theme hast, musst du erst eine anlegen. Kann beispielsweise eine Kopie aus dem GARLAND Theme sein ...
Viel Erfolg!
Da passiert leider rein gar
am 02.02.2011 - 18:41 Uhr
Da passiert leider rein gar nichts - ich habe umbenannt zu:
function secondary_menu_item_link($link)Ich verwende das genesis-Theme, bzw. habe mir aus genesis-lite mein eigenes subtheme gebaut. In der template.php stehen preprocess-Anweisungen, die man auskommentieren kann, und zwar wie folgt:
/**
* USAGE
* 1. Rename each function to match your subthemes name,
* e.g. if you name your theme genesis_foo then the function
* name will be "genesis_foo_preprocess".
* 2. Uncomment the required fucntion to use. You can delete the
* "sample_variable".
*/
/**
* Override or insert variables into all templates.
*
* @param $vars
* An array of variables to pass to the theme template.
* @param $hook
* The name of the template being rendered.
*/
/*
function genesis_ULTRALITE_preprocess(&$vars, $hook) {
$vars['sample_variable'] = t('Lorem ipsum.');
}
*/
Muss ich damit was machen, um an mein Ziel zu kommen? Wenn ja, was?
Und immer noch mein Problem, wie ich gezielt nur die links rauspicken kann, die das Attribut class="active" haben?
Viele Grüße, Matilda
Matilda schrieb function
am 02.02.2011 - 19:12 Uhr
function secondary_menu_item_link($link)Muss ich damit was machen, um an mein Ziel zu kommen? Wenn ja, was?
Erstmal müsstest Du genauer lesen :-) Dein Theme heisst ja nicht secondary, sondern genesis! Oder?
habe ich gemacht - gelesen
am 02.02.2011 - 19:32 Uhr
habe ich gemacht - gelesen meine ich ... du hast geschrieben:
mit deinem menu-Namen
und das menu, das ich zunächst ausprobieren wollte, ist das secondary-menu ...
Matilda schrieb habe ich
am 02.02.2011 - 19:34 Uhr
habe ich gemacht - gelesen meine ich ... du hast geschrieben:
mit deinem menu-Namen
OK - Ich nehms zurück, war ein Vertipper- habe ihn oben ausgebessert. ... wenn da steht "mytheme" ... dann ist natürlich der Theme-Name gemeint :-) Geht aber trotzdem auf meine Kappe .-)
ich bin einfach mittlerweile
am 02.02.2011 - 19:44 Uhr
ich bin einfach mittlerweile mal wieder etwas verwirrt, so dass ich mich an das Wort hänge ...
leider passiert immer noch so rein überhaupt gar nix :( kein span kein nix :(
Hast Du nach dem Einfügen der
am 02.02.2011 - 22:12 Uhr
Hast Du nach dem Einfügen der Funktion Deine Theme Registry nochmal aufgebaut, gibts die Funktion vielleicht schon in der template.php und sie ist dann doppelt drin? Hast Du alle Caches geleert?
Und noch ganz anders gefragt ... was versprichst Du Dir denn eigentlich von der gewünschten Änderung? Gehts um CSS Zuweisungen? Verrat dochmal kurz, warum Du das Menu ändern willst.
also wie gesagt: ich habe den
am 02.02.2011 - 22:43 Uhr
also wie gesagt: ich habe den Namen meines Themes eingesetzt, aber das hat auch keine Auswirkung. Ich habe schon gestern einen Ansatz gefunden, der meinem Problem nahe kommt, aber er bezieht sich auf D4.7, und ich blicke nicht durch, wie ich a) den Code in D6 übersetzen kann und b) an meine Bedürfnisse anpassen kann:
http://drupal.org/node/62149#comment-162122
Die für mich interessante Stelle lautet:
if (stristr($index, "active")) {$img = '<a href="$1" title="$2"><img src="'.base_path() . path_to_theme().'/images/menu/menu_'. $i .'_active.gif" alt="$3"></a>';
und intuitiv müsste nach dem alten Code in folgende Richtung gehen:
if (stristr($index, "active")) {$activeSpan = '<span class="active">$title</span>';
ich habe eben noch versucht, eine Konstruktion mit active-trail zu bauen - da das einzige Ergebnis jedoch eine stetig wachsende Anzahl von ""warning: Invalid argument supplied usw. irgendewas in theme.inc" war, die ich nur durch eine truncate-cache-Aktion in der Datenbank losgeworden bin, stehe ich nach wie vor auf dem Schlauch :(
Hat vielleicht noch jemand eine Idee?
oh, jetzt habe ich so lange
am 03.02.2011 - 08:14 Uhr
oh, jetzt habe ich so lange gepröddelt, dass ich deine Antwort nicht mitbekommen habe :)
Nein, eben um CSS geht es nicht!! Es geht darum, dass aus Gründen der Nutzerfreundlichkeit eine Seite nicht auf sich selber zeigen soll - wenn ich auf index.html bin, dann muss der Menüeintrag von "oben", auf der grafischen Oberfläche, für sehende Nutzer als aktive Adresse erkennbar sein. Man darf aber nicht mehr klicken können. Die CSS-Pseudklasse :active ist für Tastaturnutzer wichtig, um sich über die Position der Tabtaste auf dem jeweiligen Link orientieren zu können. Im Quellcode muss dann noch zusätzlich das jetzt-span-vorher-a-Element für Screenreadernutzer als aktive Seite gekennzeichnet werden. Z.b.
<li><h6 class="screenreader">Aktuelle Seite: </h6><span class="active">Inhaltsverzeichnis</span></li>. Die screenreader-Klasse wird per CSS aus dem sichtbaren Fensterbereich geschubst. Die active-Klasse ist für das visuelle Layout.Grüße, Matilda
Der Weg über die theme-baren
am 03.02.2011 - 08:45 Uhr
Der Weg über die theme-baren Funktione ist schon richtig, wenn man es JavaScript unabhängig machen will. D.h. du musst lernen, wie der Menü Link gebaut wird und die eine eigene Themefunktion überschreiben. Das schrieb Thoor schon in http://www.drupalcenter.de/node/33330#comment-118556. Allerdings ist es hier wichtig, nicht den Code per copy und paste auszuprobieren sondern zu verstehen,was die Zeilen machen. Oder du beauftragst einen Dienstleister deiner Wahl ;)
Alternativ kannst du auch nur über jQuery die Elemente ändern, was vermutlich allerdings nicht unbedingt dein Ziel sein wird.
Zitat: D.h. du musst lernen,
am 03.02.2011 - 08:58 Uhr
D.h. du musst lernen, wie der Menü Link gebaut
das ist der Plan.
nicht den Code per copy und paste auszuprobieren sondern zu verstehen,was die Zeilen machen
das geht bei mir ineinander über - ich schleiche mich sozusagen von zwei Seiten an ... ich lese mich durch den Code und muss gleichzeitg Aktionen "spüren", den Mechanismus begreifen, wenn etwas *nicht* funktioniert.
Oder du beauftragst einen Dienstleister deiner Wahl ;)
nix da ;-)
Du hast Recht, jQuery ist hier keine diskutable Alternative für mich.
Trotzdem Dank und morgendliche Grüße,
Matilda
Wie auf pro-retina.de
am 03.02.2011 - 16:32 Uhr
Ok, weil du mich konkret gefragt hast, wie ich das auf pro-retina.de gelöst habe:
(Habe übrigens die bisherige Diskussion nur überflogen)
Es geht darum, den aktiven Menüpunkt für Screenreader hervorzuheben:
Im template.php eine eigene Funktion hinzufügen. [theme] durch den Namen des eigenes Themes ersetzen. Das ist der Ausgangspunkt.
function [theme]_menu_item_link($link) {
if (empty($link['localized_options'])) {
$link['localized_options'] = array();
}
return l($link['title'], $link['href'], $link['localized_options']);
}
Nun geben wir einfach was anderes aus:
function [theme]_menu_item_link($link) {
if (empty($link['localized_options'])) {
$link['localized_options'] = array();
}
$link_neu = l($link['title'], $link['href'], $link['localized_options']);
// title-Attribut ausfiltern, weil es im Screenreader stoert
preg_match('/title=".*?"/', $link_neu, $filter_title);
$link_neu = str_replace($filter_title[0], "", $link_neu);
// Aktuellen Link hervorheben
if (strpos($link_neu, 'class="active"') !== false) {
return 'Aktuelle Seite'.$link_neu.'';
} else {
return $link_neu;
};
}
Ich habe das nun nicht ausprobiert, meine Funktion macht noch ein paar andere Dinge, die ich hier herausgelassen habe. Probier es mal aus.
(Da ich nicht der PHP-Crack bin, lassen sich meine Änderungen evtl. auch cleverer schreiben.)
NACHTRAG:
Da ich diese Angabe in den lokalen Reitern nicht haben möchte, muss ich sie dort wieder löschen:
function [theme]_menu_local_task($link, $active = FALSE) {// Aktuelle Seite an dieser Stelle heraus filtern.
$link = str_replace('<h6 class="unsichtbar">Aktuelle Seite</h6>', '', $link);
return '<li '. ($active ? 'class="active" ' : '') .'>'. $link ."</li>\n";
}
Hallo Nicolai, vielen, vielen
am 04.02.2011 - 03:40 Uhr
Hallo Nicolai,
vielen, vielen Dank! Damit komme ich der Sache auf die Spur - akueller Status: deine Funktion klinkt sich bei mir an der korrekten Stelle eines li-Elementes ein (class = active) ... allerdings nur beschränkt auf die Navigations-Links und nicht auf die primary und secondary Navigation ... aber da komme ich jetzt auch noch hin. Na gut, jetzt nicht mehr, ist schon spät/früh, aber morgen :) oder Samstag ... mein Ergebnis werde ich dann jedenfalls auch hier posten!
Beste Grüße, Matilda
Teillösung - klappt noch nicht für secondary menu
am 20.03.2011 - 06:23 Uhr
Hallo zusammen,
da dachte ich, ich hätte es jetzt begriffen ... ich habe Thors und Nicolais Tipps (und ein wenig Hirnschmalz ;-) ) zusammengefügt und eigentlich kommt jetzt genau das raus, was ich haben möchte ... aber uneigentlich nicht überall - die secondary-links zeigen sich von nachfolgendem Code absolut unbeeindruckt ... die Forenposts, die ich so finde, sind leider wieder sehr wiedersprüchlich - die einen sagen, menu_item_link berührt die secondary links überhaupt nicht, die anderen sagen doch ... was ist da richtig? in welche Richtung müsste ich jetzt weitersuchen?
/* aktive Links sollen keine Links mehr sein ...*/function genesis_menu_item_link($link)
{
if (empty($link['localized_options']))
{
$link['localized_options'] = array();
}
$link_neu = l($link['title'], $link['href'], $link['localized_options']);
// title-Attribut ausfiltern, weil es im Screenreader stoert
preg_match('/title=".*?"/', $link_neu, $filter_title);
$link_neu = str_replace($filter_title[0], "", $link_neu);
// Aktuellen Link hervorheben
if (strpos($link_neu, 'class="active"') !== false)
{
$link_neu = '<span class="active">' . check_plain($link['title']) . '</span>';
return '<h6 class="screenreader">Aktuelle Seite</h6>'.$link_neu.'';
} else
{
return $link_neu;
};
}
Viele Grüße, Matilda