簡體   English   中英

WebService的Drupal模塊頁面

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM