在URI中传递URI作为Drupal 6中的URL参数

在URI中传递URI作为Drupal 6中的URL参数

问题描述:

我遇到了一些问题,试图将绝对URI作为参数传递给干净的URL。在URI中传递URI作为Drupal 6中的URL参数

我有设立这样hook_menu():


function mymodule_menu() { 
    return array(
    'page/%' => array(
     'title' => 'DBpedia Display Test', 
     'page callback' => 'mymodule_dbpedia_display', 
     'page arguments' => array(1), 
    ), 
); 
} 

,并在页面回调:


function mymodule_dbpedia_display($uri) { 
    // Make an HTTP request for this URI 
    // and then render some things 
    return $output; 
}

什么我希望做的是某种方式传递完整的URI(如“http://dbpedia.org/resource/Coffee”)到我的页面回调。我已经尝试了一些东西,到目前为止,什么也没有工作......

  1. http://mysite.com/page/http%3A%2F%2Fdbpedia.org%2Fresource%2FCoffee
    完全打破了Drupal的改写
  2. http://mysite.com/page/?uri=http%3A%2F%2Fdbpedia.org%2Fresource%2FCoffee
    给出了一个404
  3. http://mysite.com/page/http://dbpedia.org/resource/Coffee
    仅返回“HTTP :“,这很有道理

我大概可以使用$ _GET来提取整个查询字符串,但我想我希望有更多'Drupal'解决方案。有什么建议么?

而不是使用page/%,请使用page/%menu_trail%menu_trail会将URL的其余部分作为单个字符串传递给您的示例,该字符串将作为$uri传递给菜单回调。

+0

谢谢。 %menu_trail方法不能像你所描述的那样简单,但是它使我朝着正确的方向前进,并且让它工作。我找到了解决方案[这里](http://drupal.org/node/109153#load)。我使用%wildcard_load()函数将参数映射反转为字符串。太糟糕了,这并不简单,但它有效。 – wynz 2010-06-16 14:10:36

+0

我报告的内容是用http://drupal.org/node/109153#to_arg写的。我实际上在我正在开发的一个模块(http://drupal.org/project/opensearch)中使用它,并且它可以工作。 – kiamlaluno 2010-06-17 02:53:41

+0

您的使用情况有所不同。 %menu_tail部分永远不会传递给回调。 opensearch模块和核心搜索模块都使用search_get_keys()直接从$ _GET获取参数。从我所知道的情况来看,%menu_tail主要是允许在URL中有一个额外的斜杠时正确编写页面上的链接。 D7的情况[尚未解决](http://drupal.org/node/600424)。感谢您指出opensearch模块,但期待着尝试一下即将推出的项目。 – wynz 2010-06-17 09:02:51

如果urls的源代码是您控制的东西,为什么不使用可逆编码(如base64)对字符串进行编码并因此删除任何棘手字符,然后在执行菜单回调时解码。例如:

$link = 'http://www.example.com?uri='. base64_encode($uri); 

... 


function mymodule_dbpedia_display($uri) { 

$uri = base64_decode($uri); 
// Make an HTTP request for this URI 
// and then render some things 
return $output; 
} 
+0

谢谢,这将做的工作,如果涉及直到它。但是,如果可能的话,我想避免编码到难以辨认的地方。 – wynz 2010-06-15 14:11:39

我以前有过这个问题,试图做同样的事情(RDF浏览)。我通过在URI上使用rawurlencode和rawurldecode来绕过它。

所以当创建链接时做

l('Click Here', 'page/' . rawurlencode($uri)); 

和使用$ URI变量时做一个rawurldecode();

$uri = rawurldecode($uri); 

它会给你一个URI像

http://mysite.com/page/http%253A%252F%252Fdbpedia.org%252Fresource%252FCoffee 
+0

这几乎可行。我认为关键不是使用rawurlencode()(而不仅仅是urlencode()),而是使用l()函数进行双重编码的事实。但是,SOMEHOW Drupal仍然会看到第一个斜杠和arg(1)仅返回“http:”。你是如何解决这个问题的? – wynz 2010-06-15 14:06:41

+0

它似乎只适用于我。我再次检查,它似乎还好。我正在灯堆上使用D7,不知道它是否会有所作为。 – 2010-06-16 12:27:19

+0

我应该提到我正在与D6合作。似乎参数处理可能已经改变。 – wynz 2010-06-16 13:57:47

这应该只是工作;这是一个known bug in Drupal。您可以尝试该线程中的补丁程序,但最好的办法可能是像其他人所建议的那样,在URL编码之上做一个不同的编码。

它比这一切更容易,只要你能编码您自己的URI - 阅读这些文档,所有的秘密将被揭示:drupal_urlencode()

干杯