CMS Drupal

Решил я сделать для очередного сайта на Drupal выпадающую менюшку. Да еще и на двух языках. Итак, с начала сделаем выпадающее меню.

За основу я взял вот эту коллекцию http://www.lwis.net/free-css-drop-down-menu/ и вот этот пост доброго человека http://www.drupal.ru/node/43657. Из всех вариантов меню я выбрал ту менюшку, которая приведена в файле simple.horizontal.html.
Сразу скажу, что у меня меню заработало не сразу, поэтому пришлось разобраться в том, что там написано и немного подкорректировать. Мои корректировки я оставил в том же посте на друпал.ру.

Итак, меню заработало. При чем лично у меня заработало оно только в FireFox-е, а в IE выпадающии менюшки не выпадали. У вас, скорее всего заработает сразу в том и другом браузере, но мне пришлось долго бится с эксплорером. В итоге нашел, что куда-то у меня подевалась строка:

Из-за ее отсутсвия менюшка в IE не работала.

Второй шаг - это сделать наше меню (Primary links) двуязычным. А может и многоязычным. Для этого устанавливаем модуль i18 и все сопутствующие. На этом я останавливаться не буду. Единственное, на что обращу внимание - это на то, что необходимо в файл settings.php добавить небольшой кусок кода. Дело в том, что модуль i18 может переводить переменные Друпала(те, что в базе хранятся) и в файле settings.php мы указываем, какие переменные мы хотим сделать переводимыми на языки. Например, можно добавить вот такие переменные:

$conf['i18n_variables'] = array(  
	'site_name',  
	'site_slogan',  
	'site_mission',  
	'site_footer',  
	'anonymous',  
	// Different front page for each language  
	'site_frontpage',  
	// Primary and secondary links  
	'menu_primary_links_source',  
	'menu_secondary_links_source',  
	// Contact form information  
	'contact_form_information',  
	// For theme variables, read more below  
	'theme_settings',  
);

Т.е., допустим, если зайти в форму настройки контактов, то там можно будет увидеть под полем "Дополнительная информация" приписку "This is a multilingual variable". Тогда заходя и сохраняя форму при том или ином включенном языке, информация будет сохраняться для разных языков.

Но вернемся к меню. В целом, даже стандартными средствами получается работающая менюшка, переключающаяся на разные языки. Меню на том или ином языке создаются при создании материала. Если же надо добавить менюшку типа "Новости" (с отбором материала по таксономми, как я обычно делаю), то можно просто создать меню с опцией "All languages" и потом переводить через Перевод интерфейса. Единственное, что меня не устроило, дак это то, что на некоторых страницах все-таки вылазили сразу две менюшки на двух языках. Это были админские страницы и, допустип, на странице с настройкой меню с этим можно было бы как то еще смириться, но на странице с содержимым сайта (admin/content/node) это уже лишнее. Поэтому в код для построения выпадающего меню я добавил еще один не большой кусочек. Окончательный вариант получился такой:

template.php:

function main_menu($menu_name) {
  $output = '';
  // извлекаем структуру меню
  $structure = menu_tree_all_data($menu_name);
  // и облекаем ее в нужный нам html-код
  $output .= menu_tree_output2($structure);
  // вызванная ранее функция рекурсивная и я не придумал как лучше первый элемент UL снабдить необходимым css классом
  $output = 'temp' . $output;
  $output = str_replace('temp<ul>', '<ul class="dropdown dropdown-horizontal">', $output);
  return $output;
}
 
function menu_tree_output2($tree) {
  global $language;
  $output = '';
  $items = array();
 
  // Друпаловская магия
  // Pull out just the menu items we are going to render so that we
  // get an accurate count for the first/last classes.
  foreach ((array)$tree as $data) {
    if ($data['link']['localized_options']['langcode']) {
      if ($data['link']['localized_options']['langcode'] != $language->language) {
        continue;
      }
    }
    if (!$data['link']['hidden']) {
      $items[] = $data;
    }
  }
 
  $num_items = count($items);
  // эти классы нам нужны для темизации посредством css - ими обозначи мепрвые и последние пункты меню
  foreach ($items as $i => $data) {
    $extra_class = NULL;
    if ($i == 0) {
      $extra_class = ' class="first"';
      $extra_class_dir = ' class="first dir"';
    }
    if ($i == $num_items - 1) {
      $extra_class = ' class="last"';
      $extra_class_dir = ' class="last dir"';
    }
    if ($data['below']) {
      // Если пункт имеет подпункты, кроме его показа мы рекурсивно включим в него подменю
      $link = $data['link']['title'];
      if ($extra_class) {
        $output .= "<li{$extra_class_dir}>" . $link . menu_tree_output2($data['below']) . '</li>';
      }
      else {
        $output .= '<li class="dir">' . $link . menu_tree_output2($data['below']) . '</li>';
      }
 
    }
    else {
      // а если не имеет, ничего не включим, а покажем только сам пункт
      $link = l($data['link']['title'], $data['link']['href']);
      $output .= "<li{$extra_class}>" . $link . '</li>';
    }
  }
  return $output ? '<ul>'. $output .'</ul>' : '';
}

Комментарии

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Добрый день!
А как можно переопределить вывод подпунктов menu_tree_output2($data['below']) ?
Нужно, например, чтобы они выводились таблицей по три столбца, а верхнее меню выводилось в одной строке всё.

admin аватар

По правде сказать, уже плохо помню что я тут вообще делал. Для меня по сути это такая же "чужая" статья как и для вас и надо разбираться с имеющимся кодом. Причем тут просто каким-то советом не обойтись. Нужно додумывать и дописывать код. А это время, которого как всегда не хватает. :(

)) Спасибо, уже разобрался

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <1c7>, <drupal5>, <drupal6>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".