[英]Drupal module page from WebService
我正在尋找一種優雅的(盡可能多的)解決方案來在Drupal網站中構建特定頁面。
因此,我從開始:
function hook_menu() {
$items = array();
$items['module/articles'] = array(
'title' => 'List of articles',
'page callback' => 'show_article_list',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
$items['module/articles/%'] = array(
'title' => '',
'page callback' => 'show_article_page',
'page arguments' => array(2),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
第一項返回我的文章列表,第二項返回文章%的頁面(其中%是簡單的ID)。
關鍵是,我使用Web服務來獲取列表和每個頁面。 因此, 頁面回調會調用我的網絡服務(例如http:// api / articles ),並根據結果構建頁面。
有用。 但是,如果要設置每個%頁面的標題,則必須使用title回調 ,這是另一個功能。 而且,我不想再打我的網絡服務。 為了清楚起見: http:// api / articles / id ,在一個結果中返回標題和內容。 因此,使用兩種方法可使我兩次調用此url:一種用於標題,另一種用於內容。
是否有更好的方法來解決此問題?
提前謝謝了,
最簡單,最快的解決方案是在“模塊/文章/%”菜單項的頁面回調中使用drupal_set_title() 。 參見: https : //api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_set_title/7
但是,使用這種方法只能解決您的特定問題。 一個更通用,更優雅的解決方案是擁有一個可以加載和靜態緩存文章的功能。 例如,假設您的模塊稱為article 。 首先,您需要定義一個函數,如下所示:
function article_load($id) {
// The $articles is an array of article objects from the webservice.
$articles = &drupal_static(__FUNCTION__);
if (!isset($articles[$id])) {
$articles[$id] = call_to_your_webservice_to_load_the_article($id);
}
return $articles[$id];
}
然后,一件事是,您可以在代碼中的任何位置使用此功能。 第二件事是您還可以在菜單中使用所謂的“魔術通配符”。 因此,您可以像以下內容:
$items['module/articles/%article'] = array(
'title' => '',
'page callback' => 'show_article_page',
'page arguments' => array(2),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
這意味着在Drupal調用任何菜單函數回調(頁面,訪問,標題)之前,它將首先檢查名稱為article_load的函數是否存在,將首先調用該函數並將結果傳遞給特定的菜單函數回調。 並且由於article_load將靜態緩存數據,因此它將在第一個調用時調用您的Web服務,而在所有其他調用中,它將僅返回已緩存的商品對象。 因此,您也可以再次使用標題回調,並且不要在頁面回調中使用drupal_set_title()。
我個人更喜歡第二種方法,因為它允許在請求期間的任何時間加載文章,而無需進行額外的外部調用,因此它更通用。
另外,在菜單掛鈎中進行更改時,請不要忘記清除緩存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.