Как добавить хеш-ссылку в меню?

21

Есть ли способ добавить хешированную ссылку в меню в меню drupal, чтобы просто создать пункт меню, который переключается на якорь или идентификатор на странице?

Мохамад Салама
источник
Если вы используете абсолютный URL в начале, он будет работать. Как yourdomain.com/somepath#someother
hzak

Ответы:

15

К сожалению, насколько мне известно, Drupal не может сделать это из коробки. Однако вы можете использовать модуль « Специальные пункты меню », чтобы создать новый пункт меню, и поместить «nolink» в настройках пути.

киамалуно
источник
к сожалению, этот модуль для версии 6 и никто для 7, но может быть изменен. Спасибо, в любом случае .
Мохамад Салама
1
Скорее используйте l('linktext', '', array('fragment' => ' ', 'external' => TRUE));согласно ответу @ Себастьяна.
Дунканмоо
«Специальные пункты меню» добавляет <span title="" class="nolink">...</span>. Проблема не что иное, как отсутствие CSS. Просто скопируйте ul.menu a{}CSS и вставьте их ul.menu li span.nolink{}. Это работает нормально для меня. Но он отключил стрелку раскрывающегося списка, активированную li.expanded. :(
Mayeenul Islam
Извините, что опубликовал так поздно, но я просто наткнулся на эту тему. Вместо того, чтобы изменять css, вы можете использовать маленькие js, чтобы обернуть nolink в тег привязки с помощью хеша. С jQuery это было быjQuery("span.nolink").wrap("<a href='#'></a>");
Goldentoa11
15

Следуйте тому, что сообщается в комментарии к l()документации .

Чтобы создать ссылку на именованный якорь (например, «#namedanchor»), вам нужно будет использовать небольшой обходной путь.

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

Чтобы создать ссылку только на хеш ("#"), вам нужно адаптировать ее к:

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

(Обратите внимание, что фрагмент содержит пробел.)

 

В Drupal 7 установите HTML TRUE, затем добавьте символ хеша.

Себастьян
источник
13

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

Узел / 16 # gohere

автоматический URL изменит его, чтобы быть как

о-мы # gohere

squarecandy
источник
1
Как насчет того, чтобы оставаться на странице, на которой вы находитесь? Например, пытаясь получить ссылку Skip to Navigation, чтобы перейти к разделу навигации независимо от того, на какой странице вы находитесь? @shanabus
kine456
2
Лучший способ сделать это, не требуется модуль или плагин!
Андреас Даутис
Даже работает с <front>#gohere. Ницца! :)
Huelfe
6

Попробуйте использовать модуль Void Menu :

Пустое меню позволяет вам настраивать специальные значения для тегов для использования в системе меню Drupal 7. Вы можете настроить до 10 различных пустых тегов с любым желаемым значением и свободно использовать их в системе меню Drupal.
...
В качестве дополнительного бонуса и благодаря функциональности этого модуля вы также можете использовать фактические привязки в качестве пунктов меню, которые не служат никакой другой цели, кроме заполнителей. Это достигается с помощью тега void, для которого установлено значение javascript: void (0); или даже простой хэш-тег #. Преимущество использования этого модуля перед special_menu_items для этого заключается в том, что ваши меню не требуют каких-либо дополнительных стилей для учета добавленных тегов span, используемых special_menu_items, и будут действительными в W3C, поскольку каждый якорь должен иметь атрибут href.

Это очень хорошее решение!

Andriyun
источник
2

Просто столкнулся с той же проблемой. Мне нужно было программно добавлять пункты меню с хэш-ссылками. Мой код:

// 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);
EDWH
источник
1

Просто установка , externalчтобы TRUEэто делает для меня. Проверено в Druapl 7.32.

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

timofey.com
источник
0

Использование функций перевода 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
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
/**
 * 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;
  }
}
ccx105
источник
Пожалуйста, не публикуйте ответы только для кода. Хотя это может решить проблему, это не объясняет читателю, почему она решает проблему или что она предоставляет по сравнению с альтернативами здесь .
Шон Конн
0

установите специальные пункты меню и DHTML-меню для иерархических меню, затем:

  • добавьте свой словарный запас для примера x и добавьте к нему свои термины
  • нажмите изменить х-пример, чем в разделе меню таксономии установить расположение меню
  • перейти к блокам установить меню в блок
  • в меню админ модификации вы видите автоматически добавленные термины
  • нажмите на изменить пункт меню, а затем <void>в целевой

Теперь вернитесь на свою домашнюю страницу, и вы увидите, что те пункты меню, которые мы изменили при нажатии, никуда не уходят

ЕлАЗ
источник
Добро пожаловать в Drupal Q & A. Было бы более полезно объяснить, как использовать специальные пункты меню, а не просто вставлять картинку. Вы можете рассмотреть возможность усиления вашего ответа. Спасибо.
Коджо
1
я думаю, что теперь все в порядке
elaz