Comment créer des liens de menu relatifs?

10

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

Je les chemins de menu actuels mis en place comme ceci: http://mylocalsite/the_folder_for_the_other_content. Si j'essaye <front>/the_folder_for_the_other_contentou /the_folder_for_the_other_contentou 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 vers lesquels pointer 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?

Martin Duys
la source
@irishbuzz a une solution de contournement pour Drupal 6 ci-dessous, mais j'espérais pouvoir éviter de le faire dans Drupal 7. Est-ce un vœu pieux de ma part?
Martin Duys
Drupal est-il installé dans le répertoire racine du serveur Web?
kiamlaluno
Pas sur ma version localhost, mais quand il sera enfin mis en ligne, il sera à la racine du dossier public_html. Est-ce que cela compte comme «racine du serveur Web»?
Martin Duys
Par «répertoire racine du serveur Web», je veux dire le répertoire qui dans Apache est défini avec la directive «DocumentRoot» et qui, par défaut, est le répertoire public_html. C'est l'accès au répertoire Apache lorsque vous utilisez une URL comme http://example.com/.
kiamlaluno
Ensuite: oui finalement le site sera dans le répertoire racine
Martin Duys

Réponses:

4

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 pourrais 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="https://drupal.stackexchange.com/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 similaire http:sites/d8/files/Documents/MyFile.pdf, il produira un lien similaire 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 relative à la page de contenu, et ça ne marchera pas.

Si vous utilisez un chemin d'accès similaire http:/sites/d8/files/Documents/MyFile.pdf, le système de menus l'acceptera, mais le système de menus produira un lien similaire href="http:/sites/d8/files/Documents/MyFile.pdf", que le navigateur (au moins Safari) interprètera href="http://sites/d8/files/Documents/MyFile.pdf"et échouera à trouver le serveur nommé "sites".

(Après enquête, 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 exiger 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)

nachbar
la source
5

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 l'utilisateur.
drupal_valid_path()renvoie TRUEsi

  • Le chemin est <front>( <front>/directoryou des chemins similaires sont exclus)
  • Le chemin est un chemin externe (la fonction url_is_external () retourne 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 le rappel de titre et de page , car ce rappel de menu ne doit jamais être appelé. La valeur du 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.

kiamlaluno
la source
3

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 que Drupal fonctionne http://www.example.comet que je veux avoir un lien vershttp://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.

Paul
la source
Une idée si cela fonctionnerait dans 7 /
Martin Duys
Je ne sais pas, essayez-le.
Paul
Je trouve que cette méthode ne fonctionne pas à partir de la version 7.22.
Rick
1
Cela fonctionne sur Drupal 7.23. J'essaie de le faire depuis un moment, si je pouvais, je vous voterais positivement +10
DrCord
1

J'ai résolu mes problèmes de liaison 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.

the_dillio
la source
1

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.

streamfan
la source
pourquoi voudriez-vous changer la requête? Ce n'est pas recommandé.
gerl