it-swarm-fr.com

Comment créer des liens de menu relatifs?

Je suis occupé à travailler sur un site de mon hôte local qui doit créer un lien vers du contenu distinct de Drupal.

J'ai les chemins de menu actuels configurés comme ceci: http://mylocalsite/the_folder_for_the_other_content. Si j'essaie <front>/the_folder_for_the_other_content ou /the_folder_for_the_other_content ou the_folder_for_the_other_content, J'obtiens l'erreur "Le chemin" quel que soit_l'utilisation "est invalide ou vous n'y avez pas accès."

Quand je vais en direct, j'ai évidemment besoin de tous les éléments du menu pour pointer vers http://myrealsite/the_folder_for_the_other_content.

Comment puis-je le configurer pour ne pas avoir à modifier tous les chemins de menu lorsque je suis en ligne?

10
Martin Duys

la réponse de kiamlaluno n'a pas vraiment fonctionné pour moi. L'utilisation de% menu_tail a produit une tempête d'erreurs indiquant que la fonction menu_tail_load avait des problèmes avec des arguments manquants:

Warning: Missing argument 2 for menu_tail_load(), called in  ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).
Warning: Missing argument 3 for menu_tail_load(), called in ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).

Ce qui a fonctionné pour moi était

function allow_menu_links_menu() {
  $items = array();
  $items['sites/d8/files/%'] = array(
    'title' => 'Folder Content',
    'page callback' => 'allow_menu_links_cb', /* never called */
    'access callback' => TRUE,
  );
  return $items;
}

Ensuite, je pouvais servir des fichiers dans le dossier sites/d8/files (et sous-dossiers) en utilisant des éléments de menu avec des chemins comme sites/d8/files/Documents/MyFile.pdf

Le système de menus générera alors un lien comme href="/sites/d8/files/Documents/MyFile.pdf"

Si vous n'utilisez pas le module de menu personnalisé, le système de menus rejettera un chemin commençant comme ci-dessus.

Si vous essayez d'utiliser un chemin d'accès comme http:sites/d8/files/Documents/MyFile.pdf, Cela produira un lien comme href="http:sites/d8/files/Documents/MyFile.pdf", Qui fonctionnera lorsque vous serez à la racine du site, mais lorsque vous serez sur une page de contenu, le navigateur interprétera l'url par rapport à la page de contenu et cela ne fonctionnera pas.

Si vous utilisez un chemin comme http:/sites/d8/files/Documents/MyFile.pdf, Le système de menus l'acceptera, mais le système de menus produira un lien comme href="http:/sites/d8/files/Documents/MyFile.pdf", Que le navigateur (au moins Safari) interprétera comme href="http://sites/d8/files/Documents/MyFile.pdf", Et échoue en essayant de trouver le serveur nommé "sites".

(Après une enquête plus approfondie, la raison pour laquelle le code utilisant menu_tail échoue est que vous devez ajouter les `` arguments de chargement '', comme indiqué ici: http://api.drupal.org/api/drupal/includes--menu .inc/function/menu_tail_load/7 . Si vous ajoutez 'load arguments' => array('%map', '%index'), à la définition de $ items dans le code de kiamlaluno, cela fonctionnera. La question de savoir si menu_tail_load devrait nécessiter les arguments de chargement explicites est également discutée ici: http://drupal.org/node/298561 )

(N'oubliez pas d'activer votre nouveau module, sinon le système de menus n'acceptera pas les nouveaux liens)

4
nachbar

Lorsque vous ajoutez un nouveau lien, le lien est validé à partir de menu_edit_item_validate () , qui appelle drupal_valid_path () pour vérifier si le chemin est valide, ou il est accessible depuis le utilisateur.
drupal_valid_path() renvoie TRUE si

  • Le chemin est <front> (<front>/directory, ou des chemins similaires sont exclus)
  • Le chemin est un chemin externe (la fonction rl_is_external () renvoie TRUE)
  • Le chemin est associé à un rappel de menu

Outre l'utilisation d'URL absolues, la seule solution est d'avoir un module personnalisé qui définit un rappel de menu associé au chemin que vous souhaitez utiliser.
Lorsque vous utilisez l'URL qui pointe vers un fichier ou un répertoire, le serveur Web doit afficher ce fichier ou répertoire, sans appeler Drupal. C'est ce qui se passe avec Apache, car le fichier .htaccess fourni avec Drupal contient les directives suivantes:

# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

Dans votre cas, le module personnalisé doit contenir un code similaire au suivant:

function mymodule_menu() {
  $items = array();

  $items['the_folder_for_the_other_content/%menu_tail'] = array(
    'title' => 'Folder content', 
    'page callback' => 'mymodule_view', 
    'access callback' => TRUE,
    'load arguments' => array('%map', '%index'), 
  );

  return $items;
}

Vous pouvez utiliser n'importe quelle valeur pour titre et rappel de page , comme ce menu le rappel ne doit jamais être appelé. La valeur de rappel d'accès indique à Drupal que chaque utilisateur a accès à ce rappel de menu.

Comme alternative, vous pouvez définir un rappel de menu associé à "alias_for_directory /% menu_tail" qui redirige l'utilisateur vers le répertoire que vous souhaitez voir (en utilisant drupal_goto () ). J'utiliserais cette solution lorsque le serveur n'utilise pas le contenu de .htaccess, et elle invoquerait Drupal même lorsque l'URL pointe vers un fichier ou un répertoire existant.

5
kiamlaluno

Pour moi, ce qui suit a fait l'affaire (sur drupal 6).

Je veux diriger vers une autre URL sur le même domaine, disons Drupal fonctionne sur http://www.example.com et je veux avoir un lien vers http://www.example.com/frontend

Dans l'élément de menu, veuillez saisir comme chemin:

http:/frontend

Le menu drupal sera lié à: http://www.example.com/frontend

Lorsque vous utilisez https, vous devez entrer https:/frontend dans le champ de chemin d'accès pour l'élément de menu.

3
Paul

J'ai résolu mes problèmes de lien avec les éléments suivants:

http://groups.drupal.org/node/210308 et http://drupal.org/node/372252

Il s'avère que mon thème imprimait le menu de manière incorrecte afin que tous les éléments soient relatifs à mon emplacement actuel (c'est-à-dire admin/logout, au lieu de/logout).

J'espère que cela t'aides.

1
the_dillio

J'ai utilisé sql pour remplacer le lien dans la structure du menu:

UPDATE menu_links SET link_path = replace(link_path, "livesite.com", "localhost.com");

Je ne sais pas si je devais le faire, mais j'ai ensuite vidé les caches du menu.

1
streamfan