web-dev-qa-db-ja.com

メニューにハッシュリンクを追加するにはどうすればよいですか?

drupalメニューの下のメニューにハッシュリンクを追加して、ページ上のアンカーまたはIDにジャンプするメニュー項目を作成する方法はありますか?

21
mohamad salama

残念ながら、私が知る限り、Drupalは、箱から出してこれを行うことはできません。ただし、 特別メニュー項目 モジュールを使用して、新しいメニュー項目を作成できます。パス設定に「nolink」を配置します。

15
user842

l()ドキュメントへのコメント で報告された内容に従います。

名前付きアンカー(「#namedanchor」など)へのリンクを作成するには、小さな回避策を使用する必要があります。

l('linktext', '', array('fragment' => 'namedanchor', 'external' => TRUE));

( "#"への)ハッシュのみのリンクを作成するには、次のように変更する必要があります。

l('linktext', '', array('fragment' => ' ', 'external' => TRUE));

(フラグメントにはスペースが含まれていることに注意してください。)

Drupal 7で、 "HTML"をTRUEに設定してから、ハッシュ文字を追加します。

15
Sebastian

http://drupal.org/node/123103#comment-4955236

node/16#gohere

自動URLは次のように変更します

about-us#gohere

13
squarecandy

モジュールを使用してみてください Void Men

Voidメニューを使用すると、Drupal 7メニューシステムで使用するタグに特別な値を設定できます。最大10個の異なるvoidタグを任意の値でカスタマイズし、Drupalメニューシステム内で自由に使用できます。
...
おまけとして、このモジュールの機能により、実際のアンカーを、プレースホルダー以外の目的に役立つメニュー項目として使用することもできます。これは、javascriptに設定されたvoidタグで実現されます。または単純なハッシュタグ#です。このためにspecial_menu_itemsよりもこのモジュールを使用する利点は、メニューがspecial_menu_itemsによって使用される追加のスパンタグを考慮に入れるための追加のスタイル設定を必要とせず、すべてのアンカーがhref属性を持っている必要があるため、W3Cで有効になることです。

それは非常に素晴らしい解決策です!

6
Andriyun

ちょうど同じ問題が発生しました。プログラムでハッシュリンクを含むメニュー項目を追加する必要がありました。私のコード:

// the URL with hash in it is in the form  'normal_part_of_url'#'hash_part_of_url'
$item = array( 
  'link_path' => %normal_part_of_url%,
  'link_title' => %your_link_title%,
  'menu_name' => %menu_where_to_add_links%,
  'options' => array('fragment'=>%hash_part_of_url%)
);
menu_link_save($item);
2
EDWH

externalTRUEに設定するだけでうまくいきます。 Druapl 7.32でテスト済み。

l('Some Name', '#', array('external' => TRUE));

1
timofey.com

Drupalsの翻訳機能を使用することもできます。

/**
 * Implements hook_menu().
 *
 * Defines a valid link to use when creating menu items.
 */
function greenacorn_menu() {
  $items['<main-content>'] = array(
    'page callback' => 'drupal_not_found',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );

  return $items;
}

/**
 * Implements hook_menu_link_alter().
 *
 * Flags the link to be altered at runtime.
 *
 * Note: Changes here would be saved back to the database.
 */
function greenacorn_menu_link_alter(&$item, $menu) {
  if ($item['link_path'] == '<main-content>') {
    $item['options']['alter'] = TRUE;
  }
}

/**
 * Implements hook_translated_menu_link_alter().
 *
 * Refactors the link to go to the fragment #main-content.
 */
function greenacorn_translated_menu_link_alter(&$item, $map) {
  if ($item['link_path'] == '<main-content>') {
    $item['href'] = '';
    $item['localized_options']['fragment'] = 'main-content';
  }
}
0
Alan D.

特別なメニュー項目と階層メニューのDHTMLメニューをインストールしてから:

  • x-example語彙を追加し、それに用語を追加します
  • 分類メニューセクションセットメニューの場所よりもx-exampleの変更をクリックします
  • ブロックに移動し、メニューをブロックに設定します
  • メニューの管理者の変更では、自動的に追加された用語が表示されます
  • メニュー項目の変更をクリックしてから、この<void>ターゲット内

ホームページに戻ると、クリックで変更したメニュー項目がどこにも移動していないことがわかります。

0
elaz
function test_menu() {
  $items = array();
  $items['sample'] = array(
   'title' => t('Sample page'),
   'type' => MENU_NORMAL_ITEM,
    'menu_name' => 'main-menu',
    'page callback' => 'samplepage',
    'access callback' => TRUE,
    'options' => array('fragment' => 'sampleHash'),
  );
  return $items;
}

上記のコードを使用して、メニューにハッシュリンクを追加できます。

0
Guru
/**
 * Implements hook_module_implements_alter().
 */
function MODULE_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'url_outbound_alter') {
    $stored = $implementations['MODULE'];
    unset($implementations['MODULE']);
    $implementations['MODULE'] = $stored;
  }
}

/**
 * Implements hook_url_outbound_alter().
 */
function MODULE_url_outbound_alter(&$path, &$options, $original_path) {
  if (strpos($path, '#') !== FALSE) {
    $fragment = substr($path, strpos($path, "#") + 1);
    $path = str_replace('#' . $fragment, '', $path);
    $options['fragment'] = $fragment;
  }
}
0
ccx105