在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”)到我的页面回调。我已经尝试了一些东西,到目前为止,什么也没有工作......
-
http://mysite.com/page/http%3A%2F%2Fdbpedia.org%2Fresource%2FCoffee
完全打破了Drupal的改写 -
http://mysite.com/page/?uri=http%3A%2F%2Fdbpedia.org%2Fresource%2FCoffee
给出了一个404 -
http://mysite.com/page/http://dbpedia.org/resource/Coffee
仅返回“HTTP :“,这很有道理
我大概可以使用$ _GET来提取整个查询字符串,但我想我希望有更多'Drupal'解决方案。有什么建议么?
而不是使用page/%
,请使用page/%menu_trail
。 %menu_trail
会将URL的其余部分作为单个字符串传递给您的示例,该字符串将作为$uri
传递给菜单回调。
如果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;
}
谢谢,这将做的工作,如果涉及直到它。但是,如果可能的话,我想避免编码到难以辨认的地方。 – 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
谢谢。 %menu_trail方法不能像你所描述的那样简单,但是它使我朝着正确的方向前进,并且让它工作。我找到了解决方案[这里](http://drupal.org/node/109153#load)。我使用%wildcard_load()函数将参数映射反转为字符串。太糟糕了,这并不简单,但它有效。 – wynz 2010-06-16 14:10:36
我报告的内容是用http://drupal.org/node/109153#to_arg写的。我实际上在我正在开发的一个模块(http://drupal.org/project/opensearch)中使用它,并且它可以工作。 – kiamlaluno 2010-06-17 02:53:41
您的使用情况有所不同。 %menu_tail部分永远不会传递给回调。 opensearch模块和核心搜索模块都使用search_get_keys()直接从$ _GET获取参数。从我所知道的情况来看,%menu_tail主要是允许在URL中有一个额外的斜杠时正确编写页面上的链接。 D7的情况[尚未解决](http://drupal.org/node/600424)。感谢您指出opensearch模块,但期待着尝试一下即将推出的项目。 – wynz 2010-06-17 09:02:51