Как создать относительные ссылки меню?

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, я получаю сообщение об ошибке «Путь« what_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

Ответ Киамлалуно не совсем сработал для меня. Использование% 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;
}

Затем я мог бы обслуживать файлы в папке sites / d8 / files (и подпапках), используя пункты меню с такими путями, как 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", и не сможет найти сервер с именем «sites».

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

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

Nachbar
источник
5

Когда вы добавляете новую ссылку, ссылка проверяется из menu_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

Оказывается, моя тема печатала меню неправильно, так что все элементы были относительно моего текущего местоположения (то есть admin / logout, а не / logout).

Надеюсь это поможет.

the_dillio
источник
1

Я использовал sql, чтобы заменить ссылку в структуре меню:

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

Не уверен, что мне нужно было сделать это, но затем я сбросил кеши меню.

streamfan
источник
почему вы хотите изменить запрос? Это не рекомендуется
герл