Wie erstelle ich relative Menü-Links?

10

Ich arbeite gerade an einer Site auf meinem lokalen Host, die auf Inhalte verlinken muss, die von Drupal getrennt sind.

Ich habe die aktuellen Menüpfade wie folgt eingerichtet : http://mylocalsite/the_folder_for_the_other_content. Wenn ich es versuche <front>/the_folder_for_the_other_contentoder /the_folder_for_the_other_contentoder the_folder_for_the_other_content, erhalte ich die Fehlermeldung "Der Pfad 'Whatever_I_use' ist entweder ungültig oder Sie haben keinen Zugriff darauf."

Wenn ich live gehe, brauche ich natürlich alle Menüpunkte, auf die ich zeigen kann http://myrealsite/the_folder_for_the_other_content.

Wie kann ich es so einrichten, dass ich nicht alle Menüpfade bearbeiten muss, wenn ich live gehe?

Martin Duys
quelle
@irishbuzz hat unten eine Problemumgehung für Drupal 6, aber ich hatte gehofft, dass ich dies in Drupal 7 vermeiden könnte. Ist das Wunschdenken meinerseits?
Martin Duys
Ist Drupal im Stammverzeichnis des Webservers installiert?
Kiamlaluno
Nicht auf meiner localhost-Version, aber wenn es endlich live geht, befindet es sich im Stammverzeichnis des Ordners public_html. Zählt das als "Root des Webservers"?
Martin Duys
Mit "Stammverzeichnis des Webservers" meine ich das Verzeichnis, das in Apache mit der Direktive "DocumentRoot" festgelegt wurde und das standardmäßig das Verzeichnis public_html ist. Dies ist das Verzeichnis, auf das Apache zugreift, wenn Sie eine URL wie verwenden http://example.com/.
Kiamlaluno
Dann: Ja, letztendlich befindet sich die Site im Stammverzeichnis
Martin Duys

Antworten:

4

kiamlalunos antwort hat bei mir nicht ganz funktioniert. Die Verwendung von% menu_tail führte zu einem Sturm von Fehlern, bei denen die Funktion menu_tail_load Probleme mit fehlenden Argumenten hatte:

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).

Was für mich funktioniert hat war

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;
}

Dann könnte ich Dateien im Ordner sites / d8 / files (und in Unterordnern) mithilfe von Menüelementen mit Pfaden wie bereitstellen sites/d8/files/Documents/MyFile.pdf

Das Menüsystem generiert dann einen Link wie href="/drupal//sites/d8/files/Documents/MyFile.pdf"

Wenn Sie das benutzerdefinierte Menümodul nicht verwenden, lehnt das Menüsystem einen Pfad ab, der wie oben beginnt.

Wenn Sie versuchen, einen Pfad wie zu verwenden http:sites/d8/files/Documents/MyFile.pdf, wird ein Link wie erzeugt href="http:sites/d8/files/Documents/MyFile.pdf", der funktioniert, wenn Sie sich im Stammverzeichnis der Website befinden. Wenn Sie sich jedoch auf einer Inhaltsseite befinden, interpretiert der Browser die URL relativ zur Inhaltsseite. und es wird nicht funktionieren.

Wenn Sie einen Pfad wie verwenden http:/sites/d8/files/Documents/MyFile.pdf, akzeptiert das Menüsystem diesen, aber das Menüsystem erzeugt einen Link wie href="http:/sites/d8/files/Documents/MyFile.pdf", den der Browser (zumindest Safari) interpretiert href="http://sites/d8/files/Documents/MyFile.pdf", und versucht nicht, den Server mit dem Namen "sites" zu finden.

(Bei weiteren Untersuchungen schlägt der Code mit menu_tail fehl, weil Sie die 'Ladeargumente' hinzufügen müssen, wie hier angegeben: http://api.drupal.org/api/drupal/includes--menu.inc/function / menu_tail_load / 7. Wenn Sie 'load arguments' => array('%map', '%index'),die Definition von $ items im Code von kiamlaluno ergänzen, funktioniert dies. Die Frage, ob menu_tail_load die expliziten Ladeargumente erfordern sollte, wird auch hier erläutert: http://drupal.org/node/298561 )

(Vergessen Sie nicht, Ihr neues Modul zu aktivieren, da das Menüsystem die neuen Links sonst nicht akzeptiert.)

Nachbar
quelle
5

Wenn Sie einen neuen Link hinzufügen, wird die Verknüpfung von validierten menu_edit_item_validate () , die Anrufe drupal_valid_path () zu überprüfen , ob der Pfad gültig ist, oder es kann vom Benutzer zugegriffen werden.
drupal_valid_path()gibt TRUEif zurück

  • Der Pfad ist <front>( <front>/directoryoder ähnliche Pfade sind ausgeschlossen)
  • Der Pfad ist ein externer Pfad (die Funktion url_is_external () gibt zurück TRUE)
  • Der Pfad ist einem Menürückruf zugeordnet

Abgesehen von der Verwendung absoluter URLs besteht die einzige Lösung darin, ein benutzerdefiniertes Modul zu haben, das einen Menürückruf definiert, der dem Pfad zugeordnet ist, den Sie verwenden möchten.
Wenn Sie die URL verwenden, die auf eine Datei oder ein Verzeichnis verweist, sollte der Webserver diese Datei oder dieses Verzeichnis anzeigen, ohne Drupal aufzurufen. Dies geschieht mit Apache, da die mit Drupal gelieferte .htaccess-Datei die folgenden Anweisungen enthält:

# 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]

In Ihrem Fall sollte das benutzerdefinierte Modul Code enthalten, der dem folgenden ähnelt:

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;
}

Sie können beliebige Werte für den Titel- und Seitenrückruf verwenden , da dieser Menürückruf niemals aufgerufen werden sollte. Der Wert des Zugriffsrückrufs sagt Drupal, dass jeder Benutzer Zugriff auf diesen Menürückruf hat.

Alternativ können Sie einen Menü-Rückruf definieren, der "alias_for_directory /% menu_tail" zugeordnet ist und den Benutzer in das gewünschte Verzeichnis umleitet (mithilfe von drupal_goto () ). Ich würde diese Lösung verwenden, wenn der Server den Inhalt von .htaccess nicht verwendet, und Drupal auch dann aufrufen, wenn die URL auf eine vorhandene Datei oder ein vorhandenes Verzeichnis verweist.

kiamlaluno
quelle
3

Für mich hat das Folgende den Trick gemacht (auf Drupal 6).

Ich möchte auf eine andere URL in derselben Domain verweisen. Nehmen wir an, Drupal läuft weiter http://www.example.comund ich möchte einen Link zu habenhttp://www.example.com/frontend

Geben Sie im Menüpunkt als Pfad ein:

http:/frontend

Das Drupal-Menü verlinkt auf: http://www.example.com/frontend

Wenn Sie https verwenden, sollten Sie https: / frontend in das Pfadfeld für den Menüpunkt eingeben.

Paul
quelle
Irgendeine Idee, ob dies in 7 /
Martin Duys
Weiß nicht, probier es einfach aus.
Paul
Ich finde, dass diese Methode ab Version 7.22 nicht funktioniert.
Rick
1
Dies funktioniert unter Drupal 7.23. Ich habe versucht, dies für eine Weile zu tun, wenn ich könnte, würde ich Sie +10
DrCord
1

Ich habe meine Linkprobleme wie folgt gelöst:

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

Es stellte sich heraus, dass mein Thema das Menü falsch druckte, sodass alle Elemente relativ zu meinem aktuellen Speicherort waren (dh admin / logout anstelle von / logout).

Hoffe das hilft.

the_dillio
quelle
1

Ich habe SQL verwendet, um den Link in der Menüstruktur zu ersetzen:

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

Ich bin mir nicht sicher, ob ich das tun musste, aber ich habe dann die Menü-Caches geleert.

streamfan
quelle
Warum sollten Sie die Abfrage jedoch ändern? Es wird nicht empfohlen.
Gerl