Jak utworzyć względne łącza menu?

10

Jestem zajęty pracą nad witryną na moim hoście lokalnym, która musi zawierać linki do treści innych niż Drupal.

Mam aktualne ścieżki menu ustawiane tak: http://mylocalsite/the_folder_for_the_other_content. Gdy próbuję <front>/the_folder_for_the_other_contentalbo /the_folder_for_the_other_contentalbo the_folder_for_the_other_content, otrzymuję błąd „Ścieżka«whatever_I_use»jest nieprawidłowy lub nie masz dostępu do niego.”

Kiedy wchodzę na żywo, oczywiście potrzebuję wszystkich elementów menu, na które ma wskazywać http://myrealsite/the_folder_for_the_other_content.

Jak mogę to skonfigurować, aby nie musiałem edytować wszystkich ścieżek menu po uruchomieniu?

Martin Duys
źródło
@irishbuzz ma obejście dla Drupala 6 poniżej, ale miałem nadzieję, że uda mi się tego uniknąć w Drupal 7. Czy to pobożne życzenia z mojej strony?
Martin Duys,
Czy Drupal jest zainstalowany w katalogu głównym serwera WWW?
kiamlaluno
Nie w mojej wersji localhost, ale kiedy wreszcie się uruchomi, będzie w katalogu głównym folderu public_html. Czy to się liczy jako „root serwera WWW”?
Martin Duys,
Przez „katalog główny serwera WWW” rozumiem katalog ustawiony w Apache zgodnie z dyrektywą „DocumentRoot”, który domyślnie jest katalogiem public_html. Jest to dostęp do katalogu Apache, gdy używasz takiego adresu URL http://example.com/.
kiamlaluno
Następnie: tak, ostatecznie strona znajdzie się w katalogu głównym
Martin Duys,

Odpowiedzi:

4

Odpowiedź kiamlaluno nie do końca zadziałała. Użycie% menu_tail spowodowało burzę błędów, że funkcja menu_tail_load miała problemy z brakującymi argumentami:

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

To, co zadziałało, było dla mnie

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

Następnie mógłbym wyświetlać pliki w folderze sites / d8 / files (i podfolderach), używając elementów menu ze ścieżkami takimi jak sites/d8/files/Documents/MyFile.pdf

System menu wygeneruje następnie link podobny do href="https://drupal.stackexchange.com/sites/d8/files/Documents/MyFile.pdf"

Jeśli nie użyjesz niestandardowego modułu menu, system menu odrzuci ścieżkę zaczynającą się jak wyżej.

Jeśli spróbujesz użyć ścieżki podobnej http:sites/d8/files/Documents/MyFile.pdf, spowoduje to utworzenie linku podobnego href="http:sites/d8/files/Documents/MyFile.pdf", który zadziała, gdy będziesz w katalogu głównym witryny, ale gdy będziesz na stronie z treścią, przeglądarka zinterpretuje adres URL względem strony z treścią, i to nie zadziała.

Jeśli użyjesz ścieżki podobnej http:/sites/d8/files/Documents/MyFile.pdf, system menu zaakceptuje ją, ale system menu wygeneruje link podobny do tego href="http:/sites/d8/files/Documents/MyFile.pdf", który przeglądarka (przynajmniej Safari) będzie interpretować jako href="http://sites/d8/files/Documents/MyFile.pdf", i nie uda się znaleźć serwera o nazwie „strony”.

(Podczas dalszego dochodzenia przyczyną niepowodzenia kodu przy użyciu menu_tail jest konieczność dodania „argumentów ładowania”, jak zauważono tutaj: http://api.drupal.org/api/drupal/includes--menu.inc/function / menu_tail_load / 7. Jeśli dodasz 'load arguments' => array('%map', '%index'),do definicji $ items w kodzie kiamlaluno, to zadziała. Kwestia, czy menu_tail_load powinien wymagać jawnych argumentów ładowania jest również omawiana tutaj: http://drupal.org/node/298561 )

(Nie zapomnij włączyć nowego modułu, w przeciwnym razie system menu nie zaakceptuje nowych linków)

nachbar
źródło
5

Po dodaniu nowego łącza łącze jest sprawdzane za pomocą menu_edit_item_validate () , które wywołuje funkcję drupal_valid_path () w celu sprawdzenia, czy ścieżka jest poprawna, lub można uzyskać do niej dostęp od użytkownika.
drupal_valid_path()zwraca TRUEjeśli

  • Ścieżka jest <front>( <front>/directorylub wykluczone są podobne ścieżki)
  • Ścieżka jest ścieżką zewnętrzną ( zwraca funkcję url_is_external ()TRUE )
  • Ścieżka jest powiązana z wywołaniem zwrotnym menu

Oprócz korzystania z bezwzględnych adresów URL jedynym rozwiązaniem jest posiadanie niestandardowego modułu, który definiuje wywołanie zwrotne menu powiązane ze ścieżką, której chcesz użyć.
Kiedy używasz adresu URL wskazującego na plik lub katalog, serwer sieciowy powinien pokazywać ten plik lub katalog, bez wywoływania Drupala. Tak dzieje się z Apache, ponieważ plik .htaccess dostarczany z Drupalem zawiera następujące dyrektywy:

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

W twoim przypadku moduł niestandardowy powinien zawierać kod podobny do następującego:

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

Możesz użyć dowolnych wartości dla wywołania zwrotnego tytułu i strony , ponieważ to wywołanie zwrotne menu nigdy nie powinno być wywoływane. Wartość wywołania zwrotnego dostępu mówi Drupalowi, że każdy użytkownik ma dostęp do tego wywołania zwrotnego menu.

Alternatywnie możesz zdefiniować wywołanie zwrotne menu powiązane z „alias_for_directory /% menu_tail”, które przekieruje użytkownika do katalogu, który chcesz zobaczyć (za pomocą drupal_goto () ). Użyłbym tego rozwiązania, gdy serwer nie korzysta z zawartości .htaccess, i wywołałoby Drupala, nawet jeśli adres URL wskazuje na istniejący plik lub katalog.

kiamlaluno
źródło
3

Dla mnie następowała sztuczka (na drupal 6).

Chcę przekierować do innego adresu URL w tej samej domenie, powiedzmy, że Drupal działa http://www.example.comi chcę mieć link dohttp://www.example.com/frontend

W pozycji menu wpisz ścieżkę:

http:/frontend

Menu Drupal będzie zawierać link do: http://www.example.com/frontend

Kiedy używasz https, powinieneś wpisać https: / frontend w polu ścieżki dla elementu menu.

Paweł
źródło
Każdy pomysł, czy to zadziała w 7 /
Martin Duys
Nie wiem, po prostu spróbuj.
Paul,
Uważam, że ta metoda nie działa od wersji 7.22.
Rick
1
Działa to na Drupal 7.23. Próbowałem to zrobić przez jakiś czas, gdybym mógł, głosowałbym za tobą +10
DrCord
1

Rozwiązałem problemy z linkiem w następujący sposób:

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

Okazuje się, że moim motywem było niepoprawne drukowanie menu, więc wszystkie elementy były względne w stosunku do mojej bieżącej lokalizacji (tj. Admin / logout, zamiast / logout).

Mam nadzieję że to pomoże.

the_dillio
źródło
1

Użyłem sql, aby zastąpić link w strukturze menu:

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

Nie jestem pewien, czy muszę to zrobić, ale opróżniłem pamięć podręczną menu.

streamfan
źródło
dlaczego chcesz zmienić zapytanie? To nie jest zalecane.
gerl