Пункты меню с HTML кодом [РЕШЕНО]

Аватар пользователя Hypercube Hypercube 27 марта 2012 в 13:51

Всем доброго времени суток. Теперь я обращусь немного с другой проблемой. В моей теме есть файл template.php, в котором переопределена функция создания primary links. Моя задача сделать так, чтобы пункты меню можно было бы обрабатывать HTML-кодом, т.е. если я при создании меню пишу в качестве названия пункта <i>Пункт меню</i> - то выводилось бы именно Пункт меню (курсивом).
В функции есть строчка l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment'], FALSE, $html);. Я знаю, что там есть атрибут 'html' (по-умолчанию FALSE) который отвечает за то, обрабатывается ли HTML код. Однако я не знаю, где поменять в этой строчке значение.... Я пробовал l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment'],TRUE, $html); и l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment'], TRUE, TRUE);, но это не помогало. Сама функция стандартная, но я немного издевался над ней. Если нужно, то вот вся функция :

function phptemplate_links($links, $attributes = array('class' => 'links')) {
  $output = '';

  if (count($links) > 0) {
    $output = '<ul'. drupal_attributes($attributes) .'>';

    $num_links = count($links);
    $i = 1;

    foreach ($links as $key => $link) {
      $class = $key;

      // Automatically add a class to each link and also to each LI
      if (isset($link['attributes']) && isset($link['attributes']['class'])) {
        $link['attributes']['class'] .= ' ' . $key;
      }
      else {
        $link['attributes']['class'] = $key;
      }

      // Add first and last classes to the list of links to help out themers.
      $extra_class = '';
      if ($i == 1) {
        $extra_class .= 'first ';
      }
      if ($i == $num_links) {
        $extra_class .= 'last ';
      }
      $output .= '<li '. drupal_attributes(array('class' => $extra_class . $class)) .'>';

      // Is the title HTML?
      $html = isset($link['html']) && $link['html'];

      // Initialize fragment and query variables.
      $link['query'] = isset($link['query']) ? $link['query'] : NULL;
      $link['fragment'] = isset($link['fragment']) ? $link['fragment'] : NULL;

      if (isset($link['href'])) {
   

     
if(stripos($link['title'],'&br!')!= 0){
   
$link['mystring']= l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment'], FALSE, $html);

$output .= '<div CLASS="primary-menu-span primary-menu-span-br" STYLE="align:center;display:inline-block;line-height:0.8em;vertical-align:top;position:relative;top:-0.35em;padding-top:0.15em;padding-bottom:0em;">';
$output .= '<SPAN STYLE="font-size:0.9em;">';
$output .= substr($link['mystring'],0,stripos($link['title'],'&br!')+stripos($link['mystring'],'>')+1);
$output .= '</SPAN><div CLASS="second_string_menu" STYLE="font-size:0.65em;">';
$output .= substr($link['mystring'],stripos($link['title'],'&br!')+stripos($link['mystring'],'>')+9, stripos($link['mystring'],'</a>')-(stripos($link['title'],'&br!')+stripos($link['mystring'],'>')+9));  
$output .= '</div></A></div>';

}else{
$output .= '<SPAN CLASS="primary-menu-span" STYLE="vertical-align: top">';
$output .= l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment'], TRUE, $html -> TRUE);
$output .=  $link['text'];
$output .= '</SPAN>';

}      

}
      else if ($link['title']) {
        //Some links are actually not links, but we wrap these in <span> for adding title and class attributes
        if (!$html) {
          $link['title'] = check_plain($link['title']);
        }
        $output .= '<span'. drupal_attributes($link['attributes']) .'>'. $link['title'] .'</span>';
      }

      $i++;
      $output .= "</li>\n";
    }

    $output .= '</ul>';
  }

Буду признателен тем, кто сумеет помочь...

Комментарии

Аватар пользователя Shok211 Shok211 27 марта 2012 в 16:21

Drupal 6 l($text, $path, $options = array())

  1. $options Ассоциативный массив дополнительных опций со следующими ключами:
  2. 'attributes' Ассоциативный массив HTML атрибутов тега ссылки.
  3. 'query' GET параметры ссылки строкой (без '?'), либо массивом вида ключ/значение.
  4. 'fragment' Якорный фрагмент ссылки (то, что идет после '#').
  5. 'absolute' (по-умолчанию FALSE) Принудительное создание внешней ссылки (начинается с 'http://') (полезно, если вы создаете ссылку, которая будет показываться вне сайта (например, в RSS ленте)).
  6. 'html' (по-умолчанию FALSE) Присутствует ли HTML в тексте ссылки. Например, если вы хотите вставить в ссылку рисунок, эту опцию следует установить в TRUE, иначе HTML в тексте отфильтруется (см. check_plain()).
  7. 'alias' (по-умолчанию FALSE) Определяет является ли подаваемый путь синонимом (полезно, если подаваемый синоним эквивалентен внутреннему пути Друпала, что убережет от загрузки синонима к этому внутреннуму пути).
Аватар пользователя drupby drupby 27 марта 2012 в 16:42

"Hypercube" wrote:
Буду признателен тем, кто сумеет помочь...

я могу лишь помочь тем что скажу , что у вас функция для drupal 5 Smile
Вам сюда

Аватар пользователя Hypercube Hypercube 29 марта 2012 в 22:57

Спасибо. Нашёл функцию подходящей версии, но всё равно не совсем разобрался как заставить l НЕ фильтровать хтмл-код... Куда именно вписать параметр? ( Никак не дойду до этого... Может конечно попробую её там переопределить...

Аватар пользователя Hypercube Hypercube 30 марта 2012 в 4:08

Итак, я всё-таки нашёл решение, пусть и не идеальное - и поделюсь им со всеми, кто захочет использовать хтмл в пунктах меню. В файле темы template.php определить функцию new_l, и в качестве содержания функции взять функцию l, но заменить кусок  ($options['html'] ? $text : check_plain($text)) на ($options['html'] ? $text : $text) и вписать в функции генерации меню вместо l new_l.