Existe-t-il un moyen d'ajouter un lien haché dans le menu sous drupal pour simplement créer un élément de menu qui saute à une ancre ou un identifiant sur la page?
Malheureusement pour autant que je sache, Drupal ne peut pas le faire hors de la boîte. Cependant, vous pouvez utiliser le module Éléments de menu spéciaux pour créer un nouvel élément de menu, et placez "nolink" dans les paramètres du chemin.
Suivez ce qui est rapporté dans n commentaire pour la documentation de l()
.
Pour créer un lien vers une ancre nommée (par exemple, "#namedanchor"), vous devrez utiliser une petite solution de contournement.
l('linktext', '', array('fragment' => 'namedanchor', 'external' => TRUE));
Pour créer un lien de hachage uniquement (vers "#"), vous devrez l'adapter à:
l('linktext', '', array('fragment' => ' ', 'external' => TRUE));
(Notez que le fragment contient un espace.)
Dans Drupal 7, définissez "HTML" sur TRUE
, puis ajoutez le caractère de hachage.
http://drupal.org/node/123103#comment-4955236
nœud/16 # gohere
l'URL automatique le changera comme
qui sommes-nous # gohere
Essayez d'utiliser le module Void Men :
Le menu Vide vous permet de configurer des valeurs spéciales pour les balises à utiliser dans le système de menus Drupal 7. Vous pouvez personnaliser jusqu'à 10 balises void différentes avec la valeur que vous souhaitez et les utiliser librement dans le système de menu Drupal.
...
En prime, et en raison de la fonctionnalité de ce module, vous pouvez également utiliser des ancres réelles comme éléments de menu qui ne servent à rien d'autre que des espaces réservés. Ceci est accompli avec une balise void qui est définie sur javascript: void (0); ou même une simple balise de hachage #. L'avantage d'utiliser ce module par rapport à special_menu_items pour cela est que vos menus ne nécessiteront aucun style supplémentaire pour tenir compte des balises span ajoutées utilisées par special_menu_items et seront valides W3C car chaque ancre doit avoir un attribut href.
C'est une très belle solution!
Je viens de rencontrer le même problème. J'avais besoin d'ajouter par programme des éléments de menu avec des liens de hachage. Mon code:
// 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);
Définir simplement external
sur TRUE
le fait pour moi. Testé dans Druapl 7.32.
l('Some Name', '#', array('external' => TRUE));
L'utilisation des fonctions de traduction de Drupals fonctionne également.
/**
* 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';
}
}
installez les éléments de menu spéciaux et le menu DHTML pour les menus hiérarchiques puis:
<void>
dans la ciblemaintenant de retour à votre page d'accueil et vous verrez que l'élément de menu que nous avons modifié dans le clic ceux-ci ne vont nulle part
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;
}
Vous pouvez ajouter un lien de hachage au menu en utilisant le code ci-dessus.
/**
* 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;
}
}