2010-06-15 73 views
1

我遇到了一些問題,試圖將絕對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'解決方案。有什麼建議麼?

回答

1

而不是使用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

1

如果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

2

我以前有過這個問題,試圖做同樣的事情(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

0

這應該只是工作;這是一個known bug in Drupal。您可以嘗試該線程中的補丁程序,但最好的辦法可能是像其他人所建議的那樣,在URL編碼之上做一個不同的編碼。

0

它比這一切更容易,只要你能編碼您自己的URI - 閱讀這些文檔,所有的祕密將被揭示:drupal_urlencode()

乾杯