如何创建相对菜单链接?


10

我正在本地主机上的一个站点上忙碌,该站点需要链接到与Drupal分开的某些内容。

我已将当前菜单路径设置为:http://mylocalsite/the_folder_for_the_other_content。如果尝试使用 <front>/the_folder_for_the_other_contentor或/the_folder_for_the_other_contentor the_folder_for_the_other_content,则会收到错误消息“路径'whatever_I_use'无效或您无权访问。”

当我上线时,我显然需要所有菜单项都指向http://myrealsite/the_folder_for_the_other_content

如何设置它,以便在上线时无需编辑所有菜单路径?


@irishbuzz在下面的Drupal 6中有一种解决方法,但是我希望我可以避免在Drupal 7中这样做。这是否是我的一厢情愿?
Martin Duys 2011年

Drupal是否安装在Web服务器的根目录中?
kiamlaluno

不在我的本地主机版本上,但是当它最终发布时,它将位于public_html文件夹的根目录中。那算作“ Web服务器的根目录”吗?
Martin Duys 2011年

“ Web服务器的根目录”是指在Apache中使用“ DocumentRoot”伪指令设置的目录,默认情况下为public_html目录。当您使用类似的URL时,它是Apache访问的目录http://example.com/
kiamlaluno

然后:是的,最终站点将位于根目录中
Martin Duys 2011年

Answers:


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

然后,我可以使用路径如下的菜单项来提供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",当您位于网站的根目录时,该链接将起作用,但是当您位于内容页面上时,浏览器将解释相对于内容页面的网址,它不会起作用。

如果您使用类似的路径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'),在kiamlaluno的代码中添加$ items的定义,它将起作用。menu_tail_load是否应要求显式的加载参数的问题也在这里讨论:http ://drupal.org/node/298561 )

(不要忘记启用新模块,否则菜单系统将不接受新链接)


5

添加新链接时,将从menu_edit_item_validate()验证链接,该链接会调用drupal_valid_path()来检查路径是否有效,或者可以从用户访问该路径。如果
drupal_valid_path()返回TRUE

  • 路径为<front><front>/directory,或排除相似的路径)
  • 路径是外部路径(函数url_is_external()返回TRUE
  • 该路径与菜单回调关联

除了使用绝对URL,唯一的解决方案是拥有一个自定义模块,该模块定义与您要使用的路径关联的菜单回调。
当您使用指向文件或目录的URL时,Web服务器应显示该文件或目录,而无需调用Drupal。这就是Apache的情况,因为Drupal随附的.htaccess文件包含以下指令:

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

您可以将任何值用于titlepage回调,因为该菜单回调永远不会被调用。访问回调的值告诉Drupal,每个用户都可以访问该菜单回调。

或者,您可以定义与“ alias_for_directory /%menu_tail”关联的菜单回调,该回调将用户重定向到您希望他们看到的目录(使用drupal_goto())。当服务器不使用.htaccess的内容时,我将使用此解决方案,即使URL指向现有文件或目录,它也会调用Drupal。


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 /
Martin Duys 2012年

不知道,试试看。
保罗

我发现此方法从7.22版本开始不起作用。
Rick

1
这适用于Drupal 7.23。我已经尝试了一段时间,如果可以的话,我会
投票


1

我使用sql替换了菜单结构中的链接:

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

不知道是否需要执行此操作,但是随后刷新了菜单缓存。


为什么您要更改查询呢?不推荐。
杰尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.