Добавление пунктов меню в длинные меню
Прислано: edhel
чт, 12/07/2007 - 04:22
Если меню разрослось, то при добавлении нового пункта в меню искать нужный подраздел не очень-то удобно.
Хотел было сначало хакнуть menu.module, но потом нашел более цивиальное решение с помощью тем:
<?php
function mytheme_select($element) {
$select = '';
$size = $element['#size'] ? ' size="' . $element['#size'] . '"' : '';
_form_set_class($element, array('form-select'));
$multiple = isset($element['#multiple']) && $element['#multiple'];
if ($element['#name'] == 'menu[pid]') {
$options = _mytheme_form_select_options($element, NULL, '--');
} else {
$options = form_select_options($element);
}
return theme('form_element', $element, '<select name="'. $element['#name'] .''. ($multiple ? '[]' : '') .'"'. ($multiple ? ' multiple="multiple" ' : '') . drupal_attributes($element['#attributes']) .' id="'. $element['#id'] .'" '. $size .'>'. $options .'</select>');
}
function _mytheme_form_select_options($element, $choices = NULL, $divider = '--') {
if (!isset($choices)) {
$choices = $element['#options'];
}
// array_key_exists() accommodates the rare event where $element['#value'] is NULL.
// isset() fails in this situation.
$value_valid = isset($element['#value']) || array_key_exists('#value', $element);
$value_is_array = is_array($element['#value']);
$options = '';
foreach ($choices as $key => $choice) {
if (is_array($choice)) {
$options .= '<optgroup label="'. $key .'">';
$options .= _mytheme_form_select_options($element, $choice, $divider);
$options .= '</optgroup>';
}
elseif (is_object($choice)) {
$options .= _mytheme_form_select_options($element, $choice->option, $divider);
}
else {
$key = (string)$key;
if ($value_valid && ((string)$element['#value'] === $key || ($value_is_array && in_array($key, $element['#value'])))) {
$selected = ' selected="selected"';
}
else {
$selected = '';
}
if (substr($choice, 0, strlen($divider) * 3) == $divider . $divider . $divider) $insert = ' class="L4"';
elseif (substr($choice, 0, strlen($divider) * 2) == $divider . $divider) $insert = ' class="L3"';
elseif (substr($choice, 0, strlen($divider)) == $divider) $insert = ' class="L2"';
else $insert = ' class="L1"';
$options .= "<option$insert value=\"". $key .'"'. $selected .'>'. check_plain($choice) .'</option>';
}
}
return $options;
}
?>Мой вариант CSS раскрашивает разные уровни меню разным фоном:
option.L1 {
background-color: black;
color: white;
}
option.L2 {
background-color: #C0C0C0;
}
option.L3 {
background-color: #EEEEEE;
}
- edhel's blog
- Для комментирования войдите или зарегистрируйтесь
Насколько я понимаю, это именно то, что мне нужно :) Только не понятно, откуда этот код? Или куда? В page.tpl.php? И еще - а можно ограничить глубину отображаемой вложенности? Скажем, если меню выросло до вида
пункт-
--подпункт
---подпункт2
----подпункт3а
----подпункт3б
----подпункт3в
то чтобы при добавлении подпункты3 уже не отображались?
Спасибо заранее!
- Для комментирования войдите или зарегистрируйтесь
Код пихать в template.php. Убрать вывод подпукнтов3 при желании можно, но мне это писать лень)
- Для комментирования войдите или зарегистрируйтесь
Спасибо! Попробовал - работает отлично! Как убрать ненужный уровень допер сам в итоге. Оказалось элементарно. Просто в стиле прописать
.yourclass {display: none;}
- Для комментирования войдите или зарегистрируйтесь



Комментарии