[Решено при помощи jQuery костылей ;) ] Кастомизация только первого ul в меню через phptemplate_menu_tree

Главные вкладки

Аватар пользователя tolik109 tolik109 25 октября 2012 в 10:00

В вселенские знатоки drupal молю о помощи )
То ли плохо искал на форуме, толи не знаю php так как нужно, но тем не менее не могу разобраться вот в чем.
Нужно переопределить ul в меню таким образом.

<div class="mainmenu">
<ul class="sf-menu">
<li><a href=".">раздел1</a>
    <ul>
        <li><a href=".">суб_раздел</a></li>
        <li><a href=".">суб_раздел</a></li>
        <li><a href=".">суб_раздел</a></li>
    </ul>
</li>
<li><a href=".">раздел2</a>
    <ul>
        <li><a href=".">суб_раздел</a></li>
        <li><a href=".">суб_раздел</a></li>
        <li><a href=".">суб_раздел</a></li>
    </ul>
</li>
<li><a href=".">раздел3</a>
    <ul>
        <li><a href=".">суб_раздел</a></li>
        <li><a href=".">суб_раздел</a></li>
        <li><a href=".">суб_раздел</a></li>
    </ul>
</li>
</ul>
</div>

Видите толь первый ul имеет класс "sf-menu" а остальные остаются без классов.
Что сделано... в template.php

<?php
function phptemplate_menu_tree($tree) {
$ulclass .= '';
 return 
'<ul class="'$ulclass .'">'.$tree."</ul>\n";
}

function 

phptemplate_menu_item($link$has_children$menu ''$in_active_trail FALSE$extra_class NULL) {
  
$class .= 'unique';
  return 
'<li class="'$class .'">'$link $menu ."</li>\n";
  
}
?>

в page.tpl

<?php
$menu_name 
'primary-links';
print 
menu_tree($menu_name ) ;
?>

так вот имеем возможность заменить у LI классы на одинаковые и у UL тоже на одинаковые. Ну или там через цикл например поставить уникальные классы типа "my-class-1, my-class-2",да.
но вот именно как только у первой ul поменять класс на "sf-menu" а остальных оставить без классов? Вот незнаю.. Подскажите плиз!

Комментарии

Аватар пользователя tolik109 tolik109 25 октября 2012 в 15:41

Победил, но очень странным способом

$(document).ready(function() {
  $(".mainmenu ul").addClass("sf-menu");
  $(".mainmenu ul li ul").removeClass("sf-menu");
});

Ну как бы за неимением альтернативы ) и не очень богатым знанием php.
Ведь наверняка можно просто как-то взять ) и посчитать UL элементы и переопределить первый.. )
Ну ладно цель достигнута хотя и оч странным способом.

Аватар пользователя nikkv13 nikkv13 17 марта 2016 в 14:54

Внесу и я свой вклад. Решение нашёл здесь
в файле своей темы template.php заворачиваю все ul без классов

<?php function pkeu_menu_tree__main_menu($variables) {
  return 
'<ul>' $variables['tree'] . '</ul>';
}
?>

Затем в page.tpl.php при выводе меню заменяю первый встречающийся текст "ul" на "ul class="myclass""

<?php $menu menu_tree('main-menu');
            
$str render($menu);
            function 
str_replace_once($search$replace$text
            { 
            
$pos strpos($text$search); 
            return 
$pos!==false substr_replace($text$replace$posstrlen($search)) : $text
            }
            
$str str_replace_once('ul''ul class="my-class-menu" '$str);
            print 
$str;?>

Функция str_replace_once заменяет только первое встречающееся совпадение строки. Если дочерним ul нужны классы, определяйте их при "заворачивании" в template.php, а после изменяйте класс первому ul.