Як створити відносні посилання на меню?


10

Я зайнятий роботою на сайті в своєму локальному хості, на якому потрібно посилатися на певний вміст, який є окремим від Drupal.

У мене є поточні шляху меню , встановлені вгору , як це: http://mylocalsite/the_folder_for_the_other_content. Якщо я намагаюся <front>/the_folder_for_the_other_contentабо /the_folder_for_the_other_contentабо the_folder_for_the_other_content, я отримую помилку «Шлях" whatever_I_use "втратив чинність або не має доступу до нього.»

Коли я йду в прямому ефірі, я, очевидно, потребую всіх пунктів меню, на які слід вказати http://myrealsite/the_folder_for_the_other_content.

Як я можу налаштувати його так, що мені не доведеться редагувати всі шляхи до меню, коли я йду в прямому ефірі?


@irishbuzz має вирішення для Drupal 6 нижче, але я сподівався, що мені вдасться уникнути цього в Drupal 7. Це бажання замислитись з мого боку?
Мартін Дуйс

Чи встановлено Drupal у кореневому каталозі веб-сервера?
kiamlaluno

Не в моїй версії localhost, але коли вона нарешті з’явиться, вона буде в корені папки public_html. Чи вважається це "коренем веб-сервера"?
Мартін Дуйс

Під «кореневим каталогом веб-сервера» я маю на увазі каталог, який в Apache встановлюється директивою «DocumentRoot» і який за замовчуванням є каталогом public_html. Це каталог доступу Apache, коли ви використовуєте подібну URL-адресу http://example.com/.
kiamlaluno

Тоді: так, зрештою, сайт буде в кореневому каталозі
Martin Duys

Відповіді:


4

відповідь kiamlaluno не дуже спрацювала для мене. Використання% menu_tail створило бурю помилок, що у функції menu_tail_load виникли проблеми з відсутніми аргументами:

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

Що для мене працювало

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

Тоді я міг обслуговувати файли в папці сайти / d8 / файли (і підпапки), використовуючи пункти меню з такими шляхами, як sites/d8/files/Documents/MyFile.pdf

Потім система меню генерує подібне посилання href="https://drupal.stackexchange.com/sites/d8/files/Documents/MyFile.pdf"

Якщо ви не використовуєте спеціальний модуль меню, система меню відхилить шлях, починаючи, як зазначено вище.

Якщо ви спробуєте скористатись таким шляхом http:sites/d8/files/Documents/MyFile.pdf, він створить посилання на зразок href="http:sites/d8/files/Documents/MyFile.pdf", яке буде працювати, коли ви знаходитесь у корені сайту, але коли ви перебуваєте на сторінці вмісту, браузер буде інтерпретувати URL-адресу щодо сторінки вмісту, і не вийде.

Якщо ви використовуєте такий шлях http:/sites/d8/files/Documents/MyFile.pdf, система меню прийме його, але система меню створить посилання на зразок href="http:/sites/d8/files/Documents/MyFile.pdf", яке браузер (принаймні Safari) інтерпретуватиме як href="http://sites/d8/files/Documents/MyFile.pdf"і не спробує знайти сервер під назвою "сайти".

(При подальшому дослідженні причиною невдачі коду за допомогою menu_tail є те, що вам потрібно додати "аргументи завантаження", як зазначено тут: http://api.drupal.org/api/drupal/includes--menu.inc/function / menu_tail_load / 7. Якщо ви додасте 'load arguments' => array('%map', '%index'),до визначення елементів $ у коді kiamlaluno, воно буде працювати. Питання про те, чи повинен меню_tail_load вимагати явних аргументів завантаження, також обговорюється тут: http://drupal.org/node/298561 )

(Не забудьте включити ваш новий модуль, інакше система меню не прийме нові посилання)


5

Коли ви додаєте нове посилання, посилання перевіряється з меню_edit_item_validate () , який викликає drupal_valid_path (), щоб перевірити, чи дійсний шлях, чи доступ до нього можна отримати від користувача.
drupal_valid_path()повертається, TRUEякщо

  • Шлях є <front>( <front>/directoryабо схожі шляхи виключені)
  • Шлях - це зовнішній шлях (функція url_is_external () повертається TRUE)
  • Шлях пов'язаний із зворотним викликом меню

Окрім використання абсолютних URL-адрес, єдиним рішенням є спеціальний модуль, який визначає зворотний виклик меню, пов'язаний із шляху, який ви хочете використовувати.
Коли ви використовуєте URL-адресу, яка вказує на файл або каталог, веб-сервер повинен показувати цей файл або каталог, не посилаючись на Drupal. Це відбувається з Apache, оскільки файл .htaccess, який постачається з Drupal, містить такі директиви:

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

У вашому випадку користувацький модуль повинен містити код, аналогічний наступному:

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

Ви можете використовувати будь-які значення для зворотного виклику заголовка та сторінки , оскільки зворотний виклик цього меню ніколи не повинен викликатись. Значення зворотного дзвінка доступу говорить про Drupal, що кожен користувач має доступ до цього зворотного дзвінка в меню.

В якості альтернативи ви можете визначити зворотний виклик меню, пов'язаний з "alias_for_directory /% menu_tail", який перенаправляє користувача до потрібного вам каталогу (використовуючи drupal_goto () ). Я б використав це рішення, коли сервер не використовує вміст .htaccess, і він би викликав Drupal навіть тоді, коли URL вказує на існуючий файл або каталог.


3

Для мене наступне зробив трюк (на drupal 6).

Я хочу направити на іншу URL-адресу цього ж домену, скажімо, Drupal працює, http://www.example.comі я хочу мати посилання наhttp://www.example.com/frontend

У пункті меню введіть як шлях:

http:/frontend

Меню drupal посилається на: http://www.example.com/frontend

Під час використання https ви повинні ввести https: / frontend у полі шляху для пункту меню.


Будь-яка ідея, якщо це спрацює у 7 /
Мартін Дуйс

Не знаєте, просто спробуйте.
Пол

Я вважаю, що цей метод не працює з версії 7.22.
Рік

1
Це працює на Drupal 7.23. Я деякий час намагався це зробити, якби міг, я б запросив вас до +10
DrCord

1

Я вирішив проблеми зі зв’язком із наступним:

http://groups.drupal.org/node/210308 та http://drupal.org/node/372252

Виявляється, моя тема друкувала меню неправильно, щоб усі елементи були відносно мого поточного місцезнаходження (тобто адміністратора / виходу, а не / виходу).

Сподіваюсь, це допомагає.


1

Я використовував sql для заміни посилання в структурі меню:

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

Не впевнений, чи потрібно мені це робити, але я потім очистив кеші меню.


чому ви хочете змінити запит? Це не рекомендується.
Герл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.