drupalメニューの下のメニューにハッシュリンクを追加して、ページ上のアンカーまたはIDにジャンプするメニュー項目を作成する方法はありますか?
残念ながら、私が知る限り、Drupalは、箱から出してこれを行うことはできません。ただし、 特別メニュー項目 モジュールを使用して、新しいメニュー項目を作成できます。パス設定に「nolink」を配置します。
l()
ドキュメントへのコメント で報告された内容に従います。
名前付きアンカー(「#namedanchor」など)へのリンクを作成するには、小さな回避策を使用する必要があります。
l('linktext', '', array('fragment' => 'namedanchor', 'external' => TRUE));
( "#"への)ハッシュのみのリンクを作成するには、次のように変更する必要があります。
l('linktext', '', array('fragment' => ' ', 'external' => TRUE));
(フラグメントにはスペースが含まれていることに注意してください。)
Drupal 7で、 "HTML"をTRUE
に設定してから、ハッシュ文字を追加します。
http://drupal.org/node/123103#comment-4955236
node/16#gohere
自動URLは次のように変更します
about-us#gohere
モジュールを使用してみてください Void Men :
Voidメニューを使用すると、Drupal 7メニューシステムで使用するタグに特別な値を設定できます。最大10個の異なるvoidタグを任意の値でカスタマイズし、Drupalメニューシステム内で自由に使用できます。
...
おまけとして、このモジュールの機能により、実際のアンカーを、プレースホルダー以外の目的に役立つメニュー項目として使用することもできます。これは、javascriptに設定されたvoidタグで実現されます。または単純なハッシュタグ#です。このためにspecial_menu_itemsよりもこのモジュールを使用する利点は、メニューがspecial_menu_itemsによって使用される追加のスパンタグを考慮に入れるための追加のスタイル設定を必要とせず、すべてのアンカーがhref属性を持っている必要があるため、W3Cで有効になることです。
それは非常に素晴らしい解決策です!
ちょうど同じ問題が発生しました。プログラムでハッシュリンクを含むメニュー項目を追加する必要がありました。私のコード:
// 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);
external
をTRUE
に設定するだけでうまくいきます。 Druapl 7.32でテスト済み。
l('Some Name', '#', array('external' => TRUE));
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';
}
}
特別なメニュー項目と階層メニューのDHTMLメニューをインストールしてから:
<void>
ターゲット内ホームページに戻ると、クリックで変更したメニュー項目がどこにも移動していないことがわかります。
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;
}
上記のコードを使用して、メニューにハッシュリンクを追加できます。
/**
* 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;
}
}