2010-11-17 40 views
0

通過頁面管理器和視圖兩個面板,您可以創建一個接受像用戶/%/點這樣的參數的頁面。在Drupal中創建一個頁面,其中包含一個沒有視圖或面板的動態URL

但是,除了創建動態頁面URL之外,我不需要這些模塊的其他任何功能。我只是想創建一個頁面,當某個用戶位於url users /%/ points時,該頁面會顯示。如何在不使用視圖或面板之類的模塊的情況下設置URL?

回答

3

Drupal有一個系統來創建動態網頁,這是當你查看一個節點或用戶會發生什麼。你有幾個選擇,但這一切都發生在hook_menu

function modulename_menu() { 
    $items = array(); 
    $items['users/%user/points'] = array(
     'page callback' => callback, // the function to call 
     'page arguments' => array(1), // The argument to pass, 1 = %user, which will be a user object. 
     ... 
    ); 
    $items['users/%/points'] = array(...); 
    $items['users/points'] = array(...); 
} 

在第一個例子中,您使用Drupal的加載系統。如果Drupal發現一個用戶,它將在參數索引處調用user_load,該索引可用,而不是實際參數(用戶標識)。如果沒有用戶被發現404將被退回。

在第二個示例中,允許使用任何參數,這意味着如果您嘗試訪問user/my-little-pony/points,您將獲得一個頁面。

在第三個示例中用於表示Drupal允許其他參數。所以如果你想訪問user/points/pony,你會得到user/points頁面,如果你的回調函數允許的話,可以使用額外的參數。

還記得設置某種訪問控制。您可以定義自定義函數以確定用戶是否應該訪問,使用drupal菜單系統並需要權限,如access content

現成代碼:

/** 
* Implementation of hook_menu(). 
*/ 
function example_menu() { 
    $items = array(); 

    $items['user/%/points'] = array(
    'title' => 'Page title here', 
    'description' => 'Description here, mostly used for admin pages', 
    'page callback' => 'example_callback', 
    'page arguments' => array(1) 
    'access arguments' => array('access content'), 
); 
    return $items; 
} 

example_callback($arg) { 
    return t('The arg is @arg', array('@arg' => $arg)); 
} 

這將需要進入example.module,你需要創建一個example.info文件。您可以將示例更改爲您創建的任何模塊。

+0

太好了。我需要更多的幫助來實現這個目標。我假設我把這個代碼放到了modulename.install文件中,對嗎?這裏是我所做的:1)用模塊名稱(custom_functions_menu)重命名了modulename_menu 2)刪除了第二個$ items數組中的'...'3)刪除了第三個和第四個$ items數組,因爲我第一次只想在獲得更好的功能之前獲得這個工作的基本版本(即只有用戶/%/點)。 4)運行update.php(不知道這是否有必要,但值得一試)。最後,我仍然收到「找不到頁面」錯誤。 – maxedison 2010-11-17 13:27:53

+0

@maxedison,你的代碼應該放在'.module'文件中。 '.install'用於安裝鉤子,比如創建數據庫表並將其插入到數據庫中。你可以看一下[手冊](http://drupal.org/developing/modules)閱讀更多關於模塊開發的內容。順便說一句,你還需要創建一個回調函數,只需創建一個函數,該函數返回一個文本字符串,以便看到所有東西都能正常工作。另外,當更改hook_menu中的東西時,您需要清除菜單緩存。 – googletorp 2010-11-17 14:31:03

+0

仍然沒有運氣。我已將代碼移至.module文件,使頁面回調函數返回一個字符串,並使用Performance頁面上的「Clear cached data」按鈕(清除菜單緩存,不是?)。我仍然收到頁面​​未找到錯誤。 – maxedison 2010-11-17 21:03:43

2

如果我正確理解你的話,可以使用自定義模塊中的hook_menu輕鬆完成。下面是動態頁面的示例,其中動態頁面由用戶插入的變量創建。

function MYMODULE_menu() { 
$items = array(); 
$items['user/points/%/'] = array(
'page callback' => 'MY_PAGE_CALLBACK_FUNCTION', 
'title callback' => 'MY_PAGE_CALLBACK_TITLE_FUNCTION', 
'title arguments' => array(3), 
'type' => MENU_CALLBACK, 
); 
    return $items; 
} 
 
function MY_PAGE_CALLBACK_TITLE_FUNCTION($arg) { 
    return "My dynamic title: " . $arg; 
} 
相關問題