Drupal-ban az elsődleges linkek (primary links) helyére képek a themes_links() fgv. kifejtésével
April 1st, 2009 No CommentsNekem már többször előfordult olyan problémám, hogy a Drupal elsődleges menüjének (primary links) egyedi kinézete miatt, kizárólag képekből álló menüt kellett készítenem. Ezalatt azt értem, hogy nincs a háttérkép felett semmilyen szöveg, a menü címe is a képen szerepel.
A háttérképeket egyszerűen megadhatjuk, a menüpontok egyedi azonosítója miatt (pl. menu-130 stb.), viszont a rajta lévő szöveget el kell tüntetni valahogy.
CSS-ben ha levesszük a betűméretet 0px-re sajnos nem a megfelelő megoldás, mert IE-ben, Chrome-ban és Operában kicsiben, de látszik.
Egy megoldás, ha a hyperlinkek szövegét span elemek közé tesszük, és a span elemeket tüntetjük el CSS-ben a display: none; definícióval, tehát a cél az lenne, hogy így nézzen ki egy menüelem:
-
<li class="menu-129"><a class="menu-129" href="/"><span class="primary-title">Nyitólap</span></a></li>
Ekkor minden további nélkül megadhatjuk CSS-ben a következőt:
-
ul.primary-links span.primary-title {
-
display: none;
-
}
Igenám, de hogy érjük el, hogy a Drupal span elemek közé tegye a linkek címét?
A megoldás az, hogy a sminkünk template.php fájljába kifejtjük a theme_links() fgv-t.
Íme a kód:
-
/**
-
* Csak kepekbol allo menu elkeszitesenek alapjai
-
*
-
* @param unknown_type $links
-
* @param unknown_type $attributes
-
* @return HTML
-
*/
-
function phptemplate_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)) .'>';
-
-
$link['attributes'] = array('class' => $class);
-
-
if (isset($link['href'])) {
-
// Pass in $link as $options, they share the same keys.
-
$link['html'] = true;
-
$output .= l('<span class="primary-title">' . $link['title'] . '</span>', $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;
-
-
}
Ez a kód, majdnem megegyezik az API oldalon található fgv. kóddal. Nézzük az eltéréseket:
-
$link['attributes'] = array('class' => $class);
Ezzel annyit érünk el, hogy ne csak a listaelemnek (li) legyen egyedi azonosítója, hanem a hyperlink-nek (a) is. Ez azért fontos, hogy a :hover eseményre is tudjunk képet rakni, ha esetleg különbözik.
-
$link['html'] = true;
-
$output .= l('<span class="primary-title">' . $link['title'] . '</span>', $link['href'], $link);
A link tömb lesz az l() fgv. harmadik paramétere, ebbe kell szerepelnie a beállításoknak, és mivel HTML-t adunk meg, ezért a $link tömb html kulcsát igaz értékre kell állítanunk. Az l() fgv. első paraméterének pedig beírjuk a span elemek közé a link címét.
Ha ezt elvégeztük, feltöltjük a template.php-t a smink könyvtárába, majd hogy a rendszer érzékelje az új fgv. létrejöttét, menjünk be a sminkek beállítási oldalába (admin/build/themes) és nyomjunk egy mentést.
Ezután minden menüelem egyedi azonosítoval fog rendelkezni, és a menü címe span elemek között lesz, amit könnyedén eltüntetetünk. Innenstől kezdve csak CSS kérédése az egész.
