Cum se introduce un în interiorul etichetei în meniul meu principal (Drupal, Rute, Tematizare)

Martin Duys a intrebat.
a intrebat.

Am pus exact această întrebare pe Stack Overflow, dar are mai mult sens să o pun aici.

Încerc să fac ca textul dintre tag-ul meu să nu se afișeze prin înfășurarea lui în a și apoi stilizarea acestuia.

Am adăugat următoarea funcție în fișierul meu template.php, dar nu pot vedea nicio diferență pe front-end; pur și simplu, span-ul nu apare. (Mi-am curățat memoria cache.)

Folosesc funcția corectă? Ce fac greșit?

function my_theme_link($variables) {
  return '<a href="' . check_plain(url($variables['path'], $variables['options'])) . '"' . drupal_attributes($variables['options']['attributes']) . '><span>' . ($variables['options']['html'] ? $variables['text'] : check_plain($variables['text'])) . '</span></a>';
} 

6 răspunsuri
kiamlaluno

În loc să construiți eticheta de ancorare și să treceți rezultatul din url() la check_plain(), , ar trebui să apelați l(), , care construiește eticheta pentru dvs.
Nu uitați să setați $options['html'] la TRUE (unde $options este ultimul parametru transmis către l()), atunci când șirul de caractere pe care îl treceți ca prim argument la l() conține etichete HTML; în mod implicit, funcția presupune că $options['html'] este FALSE.

WestieUK

Aruncați o privire la http://drupal.org/node/457740 / http://drupal.org/node/988842 și modulul devel / theme developer ar putea fi de asemenea util.

Cred că funcția pe care o folosiți este pentru link-uri în general și nu este specifică niciunui meniu…

function THEMENAME_links__system_MENUNAME_menu($variables) {
  $output = '';
  foreach ($variables['links'] as $link) {
    $output .= l('<span>'. check_plain($link['title']) .'</span>', $link['href'], $link);
  }
  return $output;
}

EDIT: inclus span.

Comentarii

  • Mulțumesc, înțeleg într-un fel ceea ce spui, dar cred că problema mea este că trebuie să adaug tag-urile <span>… în interiorul tag-ul <a>, astfel încât să pot face ca textul din tag-ul <a> să nu apară, dar să am totuși hyperlink-ul. Așadar, trebuie să suprascriu funcția care produce de fapt fragmentul html final. –  > Por Martin Duys.
  • Încercați să faceți textul să dispară pur și simplu din motive estetice, cum ar fi utilizarea unui buton cu imagine? –  > Por WestieUK.
  • Da, exact asta încerc să fac. –  > Por Martin Duys.
  • Am încercat css text-indent:-999999em; ? –  > Por WestieUK.
  • De asemenea, trebuie să raportați la l() că primul parametru conține etichete HTML; acest lucru se face adăugând 'html' => TRUE în matricea transmisă ca ultim parametru. –  > Por kiamlaluno.
Taesto

Am găsit soluția la această problemă după o mulțime de căutări. Apropo, aceasta funcționează pentru a personaliza ieșirea link-urilor din orice meniu specific.

Dați-mi voie să spun mai întâi că personalizarea link-urilor din meniul principal sau primar este ceva esențial pentru orice tematizare și singurul motiv pentru care mă gândesc că programatorii Drupal au făcut-o atât de greu de făcut este pentru ca tematizanții profesioniști Drupal să își poată păstra locurile de muncă!

Am văzut soluții care folosesc funcția theme_link : idee proastă, deoarece aceasta va modifica ieșirea TUTUROR linkurilor, ceea ce va strica aspectul site-ului dumneavoastră.

Așa că abordarea mea este ca tu să suprascrii funcția theme_menu_link. Adaug o condiție pentru a folosi suprascrierea doar pe meniul specific pe care îl doresc. În acest exemplu am ales linkurile primare. Pentru a ști numele meniului pe care doriți să-l tematizați trebuie să puneți dsm($variables) și să folosiți modulul Devel.

function yourtheme_menu_link(array $variables) {

  $element = $variables['element'];
  $sub_menu = '';

// Replace 'menu_link__menu_block__1' with the name of the menu you want to theme.
if ($element['#theme']['0'] == 'menu_link__menu_block__1') {
  if ($element['#below']) {
    $sub_menu = drupal_render($element['#below']);
  }

  $title = $element['#title'];

// I put the span tags in the title.
  $element['#title'] = '<span class="yourclass1"></span><span class="yourclass2">' . $title . '</span><span class="yourclass3"></span>';
// I tell the l() function to keep the HTML tags.
  $element['#localized_options'] += array(
    'attributes' => array(), 
    'html' => TRUE,
  );
  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>
";
}
// The function renders the links from all the other menus without modification.
if ($element['#below']) {
  $sub_menu = drupal_render($element['#below']);
}
$output = l($element['#title'], $element['#href'], $element['#localized_options']);

return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>
";
}

Original Scott

Acest lucru produce același rezultat ca și codul arătat de Taerno și funcționează bine în Drupal 7.12.

function yourtheme_menu_link(array $variables) {
  $element = $variables['element'];
  $sub_menu = '';

  if ($element['#below']) {
    $sub_menu = drupal_render($element['#below']);
  }

  $element['#localized_options']['html'] = TRUE;
  $linktext = '<span class="your_class">' . $element['#title'] . '</span>';

  $output = l($linktext, $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>
";
}

Ați putea adăuga următorul cod, unde „menu_link__menu_block__1” este numele meniului dumneavoastră.

if ($element['#theme']['0'] == 'menu_link__menu_block__1') {

}

Eu am găsit numele meniului prin tipărirea $element['#theme']['0'] pentru meniul meu.

Încerc să adaug span-ul doar la link-ul părinte, așa că voi posta când voi reuși acest lucru.

Comentarii

  • Cred că aceasta este cea mai clară soluție de până acum, dar mai sunt două lucruri: 1. Din motive de securitate ar trebui să folosiți check_plain($element[‘title’]) pentru a igieniza titlul înainte de a-l transmite prin ecou 2. Ați putea folosi cârligul yourtheme_menu_link__menu_block__1 pentru a evita condiția if –  > Por Nebel54.
thsutton

S-ar putea să vă intereseze Dezvoltator de teme modul. Acesta îți permite să dai click pe elementele unei pagini Drupal pentru a descoperi ce funcție/model al temei le-a generat, ce argumente au fost trecute, ce alternative sunt disponibile etc.

Comentarii

  • Mulțumesc, îl am deja instalat. Când dau click pe un element de meniu, primesc următoarele: parent links__system_main_menu și Function called: Them_link() – De aici și încercarea mea de a suprascrie funcția link. –  > Por Martin Duys.
Hans Rossel

Cele mai multe dintre cazurile în care înainte ați fi avut nevoie de un span suplimentar pot fi rezolvate acum doar cu ajutorul css:

li {
  position: relative;
  padding-left: 25px;
}

li:before {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  width: 20px;
  height: 20px;
  background: url('../images/icons.png') no-repeat;
  background-position: 0 0;
}