Темизация меню в столбики

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

Аватар пользователя Shi3A Shi3A 1 апреля 2011 в 16:24

И снова темизация в несколько столбцов, решил через template.php в теме таким образом:
Создал глобальную переменную

global $menunameitem;

Затем переопределил 2 функции в этом же template.php таким образом:

function phptemplate_menu_item_link($link) {
global $menunameitem;
  if (empty($link['localized_options'])) {
    $link['localized_options'] = array();
  }
  ($link['menu_name']=='primary-links') ? $menunameitem = 'primary-links' : $menunameitem ='';
  return l($link['title'], $link['href'], $link['localized_options']);
}

Здесь я выбираю нужное мне меню и забиваю в эту глобальную переменную ключевое слово, так сказать, по которому потом и буду судить.

Затем собственно само формирование списка по 4 в столбик:

function phptemplate_menu_item($link, $has_children, $menu, $in_active_trail = FALSE, $extra_class = NULL) {
  $class = ($menu ? 'expanded' : ($has_children ? 'collapsed' : 'leaf'));
  global $menunameitem;
  static $counter='1';
  static $endul;
  ($counter % 4 == 0 && $menunameitem == 'primary-links') ? $endul = '</ul><ul class="menu">' : $endul = '';
  $counter++;
  if (!empty($extra_class)) {
    $class .= ' '. $extra_class;
  }
  if ($in_active_trail) {
    $class .= ' active-trail';
  }
  return '<li class="'. $class .'">'. $link . $menu ."</li>\n" . $endul;
}

Ну а дальше поработать напильничком под названием CSS. Один косяк - всегда последним формируется лишний пустой список ul.

Но вообщем-то код мне не нравится вцелом, слишком уж он быдлокод напоминает, а сам я в php (да и в программировании вцелом) неочень, и после нескольких часов чтения API начинает пухнуть голова >.<
Кто какие решения подскажет поэлегантней? Ну или просто у кого какие мысли есть?

P.S. Долго мучился, что выбрать "Вопрос" или "Решение"? Но сославшись на то, что вцелом задача, хоть и криво, но решена.

Комментарии

Аватар пользователя Shi3A Shi3A 12 апреля 2011 в 0:28

Решил сделать вместо функции phptemplate_menu_item через функцию phptemplate_menu_tree($tree)
Вот окончательный код:

/**
 * Переопределяем функцию вывода меню в столбики
 */

function phptemplate_menu_item_link($link) {
global $menunameitem;
  if (empty($link['localized_options'])) {
    $link['localized_options'] = array();
  }
  ($link['menu_name']=='primary-links') ? $menunameitem = 'true' : $menunameitem ='false';
  return l($link['title'], $link['href'], $link['localized_options']);
}

function phptemplate_menu_tree($tree) {
        global $menunameitem;
        if ($menunameitem) {
                $tree = explode('</li>', $tree);
                for ($i=1;$i<(count($tree));$i++) {
                        $output .= $tree[$i-1] . '</li>';
                        if ($i % 4 == 0 && $i != (count($tree)-1)) $output .= '</ul><ul class="primenu">';
                }
                return '<ul class="primenu">'. $output . '</ul>';
        }
  return '<ul class="menu">'. $tree .'</ul>';
}

Пояснения:
В первой функции определяем переменную-маячок, говорящую о том, что друпал начинает выводить нужное нам меню.
Во второй функции разрезаем вывод всего меню на массив, так как последним символом оказывается символ перевода каретки, который нам фактически не нужен мы досчитываем до предпоследнего элемента массива, определяем вывод $output как $i-тый элемент массива + закрывающий тег "</li>', так как он пропал при разрезании вывода меню - он благополучно пошел под нож. Затем делаем проверку когда вставлять разрез закрывающий и открывающий тег очередного меню.
Затем остается через css определить стили в моем случае для primenu:

ul.primenu {
float: left;
}

Ну собственно все, не знаю как на счет легкости кода, но работает на ура Smile

P.S. Все еще буду рад, если кто-то предложит более красивый вариант!