it-swarm.com.de

Wie erstelle ich relative Menü-Links?

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 <front>/the_folder_for_the_other_content Oder /the_folder_for_the_other_content Oder the_folder_for_the_other_content Versuche, wird 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, um auf http://myrealsite/the_folder_for_the_other_content Zu verweisen.

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

10
Martin Duys

kiamlalunos Antwort hat bei mir nicht ganz funktioniert. Die Verwendung von% menu_tail verursachte einen 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 sites/d8/files/Documents/MyFile.pdf Bereitstellen.

Das Menüsystem generiert dann einen Link wie href="/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 http:sites/d8/files/Documents/MyFile.pdf Zu verwenden, wird ein Link wie href="http:sites/d8/files/Documents/MyFile.pdf" Erzeugt, der funktioniert, wenn Sie sich im Stammverzeichnis der Site befinden, sich jedoch auf einer Inhaltsseite befinden. Der Browser interpretiert die URL relativ zur Inhaltsseite und funktioniert nicht.

Wenn Sie einen Pfad wie http:/sites/d8/files/Documents/MyFile.pdf Verwenden, 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) als href="http://sites/d8/files/Documents/MyFile.pdf" Und versuchen 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'), zur Definition von $ items im Code von kiamlaluno hinzufügen, funktioniert dies. Die Frage, ob menu_tail_load die expliziten Ladeargumente erfordern sollte, wird ebenfalls erörtert hier: http://drupal.org/node/298561 )

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

4
nachbar

Wenn Sie einen neuen Link hinzufügen, wird der Link von menu_edit_item_validate () überprüft, wodurch drupal_valid_path () aufgerufen wird, um zu überprüfen, ob der Pfad gültig ist, oder über den Zugriff auf Benutzer.
drupal_valid_path() gibt TRUE if zurück

  • Der Pfad ist <front> (<front>/directory oder ähnliche Pfade sind ausgeschlossen)
  • Der Pfad ist ein externer Pfad (die Funktion rl_is_external () gibt TRUE zurück)
  • 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 Titel und Seitenrückruf als dieses Menü verwenden Rückruf sollte niemals aufgerufen werden. Der Wert von Zugriffsrückruf besagt 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 (mit drupal_goto () ). Ich würde diese Lösung verwenden, wenn der Server den Inhalt von .htaccess nicht verwendet und Drupal aufruft, selbst wenn die URL auf eine vorhandene Datei oder ein vorhandenes Verzeichnis verweist.

5
kiamlaluno

Für mich hat das Folgende den Trick gemacht (on drupal 6).

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

Geben Sie im Menüpunkt als Pfad ein:

http:/frontend

Das Menü drupal) verlinkt auf: http://www.example.com/frontend

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

3
Paul

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 Standort waren (dh admin/logout anstelle von/logout).

Hoffe das hilft.

1
the_dillio

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 muss, aber ich habe dann die Menü-Caches geleert.

1
streamfan