web-dev-qa-db-ja.com

要素をメインメニューブロック内に追加しますが、ナビゲーションの外側に追加します

メインメニューブロック内、またはメインメニューブロックの直前/直後に要素を追加する必要があります。たとえば、生成されたHTMLは次のようになります。

_<div id="main-navigation">
  <div class="block block-system" id="block-system-main-menu">
    <div class="block-inner clearfix">
      <div class="content clearfix">
        <ul class="menu">
          <li class="first expanded">
            <a href="">About</a>
            <ul class="menu">
              <li class="first leaf">
                <a href="">General Info</a>
              </li>
              <li class="leaf"><a href="">Video</a></li>
                <!-- ... other menu items -->
            </ul>
          </li>
        </ul> <!-- this ends the top level main ul.menu -->
        <!-- a div added here would be ok -->
      </div>
    </div>
  </div>
</div>
<!-- or a div added here would be ok -->
_

私は現在 hook_block_view_alter() を試していて、次のようなものの複数のバリエーションを試しました:

_function theme_block_view_alter(&$data, $block) {
  if ($block->delta == 'main-menu'
    && $block->region == 'menu') {
    $data['content'][] = array(
      '#markup' => '<div class="."><a href="#top">Close Mobile Menu</a></div>'
    );
  }
}
_

私が来た中で最も近いです。これにより、最後のli要素の後の_ul.menu_(トップレベル)内にdivが追加されます。それは動作しません。

メニュー全体のテーマ機能がtheme_menu_links()だけでは見つからないようです。 hook_block_view_alter()の_menu_tree__main_menu_内のテーマラッパー_$data_は表示されますが、それに似たファイルまたは関数は表示されません。

私が考えていないもっと良い解決策があるかもしれないことを知っているので、最終的な目標を述べます:

  1. 絶対配置メニュー。 (私は_#main-navigation_が絶対であり、その後ろに来る要素またはを使用して_ul.menu_が配置され、要素が来るようにできますその後。)
  2. マークアップでメニューに続くリンクですが、絶対配置されたメニューの外にあるため、ulではなく、ウィンドウに対して相対的に配置できます。

ありがとう!

3
Chris Rockwell

すべての目標を達成するには、次の3つの関数を実装する必要があります。

メニューを使用して、ブロックのテンプレートファイルを1つ作成します。

template.php

/**
 * Implements hook__preprocess_block().
 */
function YOURTHEME_preprocess_block(&$variables, $hook) {
  // allow to use block templates depend on delta
  // example: delta = main-menu ; template file: block--main-menu.tpl.php
 if ($variables['block']->delta == 'main-menu') {
    $variables['theme_hook_suggestions'][] = 'block__' . str_replace('-', '_', $variables['block']->delta);
 } 
}

/**
 * Main menu
 * Implements theme__menu_tree().
 */
function YOURTHEME_menu_tree__main_menu($variables) {
    global $level;
    $div = ($level == 1) ? '<div> ... some div next to the main ul ... </div>' : '';
    $ul = '<ul class="menu">' . $variables['tree'] . '</ul>' . $div;
    return $ul;
}

/**
 * Main menu
 * Implements theme__menu_link().
 */
function YOURTHEME_menu_link__main_menu($variables) {

  $element = $variables['element'];
  $title = $element['#title'];
  $sub_menu = '';

  // global menu level variable. 
  // within theme_menu_tree() at first level has always value = 1
  // but not here, that's why $depth will have to be defined separately
  global $level;
  $level = $element['#original_link']['depth'];

  // if you will need $depth, it must be defined separately
  // $depth = $element['#original_link']['depth']; 

  // submenu
  if ($element['#below']) {
    $sub_menu = drupal_render($element['#below']);
  }

  // link output
  $output = l($title, $element['#href'], $element['#localized_options']);

  // if link class is active, make li class as active too
  if(strpos($output,"active")>0){
    $element['#attributes']['class'][] = "active";
  }

  $attr = drupal_attributes($element['#attributes']);
  return  '<li' . $attr . '>' . $output .$sub_menu . "</li>\n";
}

ブロック--main-menu.tpl.php

<?php
/**
 * @file
 * theme's implementation to display a block with the main menu.
 */     
?>
<div id="main-navigation">
  <div class="block block-system" id="block-system-main-menu">
    <div class="block-inner clearfix">
      <div class="content clearfix">
        <?php print $content; ?>
      </div>
    </div>
  </div>
</div>

<!-- or a div added here would be ok -->
<div> ... some div next to the main navigation div ... </div>

結果

screenshot

2
Jack-PL

Page.tpl.phpはどうですか?メニューの前/後に追加のマークアップを追加できます。私は、theme_preprocess_pageもその役割を果たすと思います。

1
rreiss