2010-01-30 77 views
0

幫我弄清楚,爲什麼不是我的形式得到的風格一拉網站/所有/模塊/ pecapture /主題/ pecapture-displayform.tpl.phpDrupal的模塊 - 表格中塊不應用模板

這裏的我的代碼:

/** 
* Implementation of hook_theme() 
*/ 
function pecapture_theme() { 
    $path = drupal_get_path('module', 'pecapture') . '/theme'; 
    return array(
    'pecapture_displayform' => array(
     'arguments' => array('form' => NULL), 
     'template' => 'pecapture-displayform', 
     'path' => $path, 
    ), 
); 
} 

這基本上說,主題文件都在模塊/主題文件夾($ PATH)

有一個主題功能pecapture_displayform($形式= NULL),使用主題叫做('pecapture_displayform ',$ form)其中$ form是一個Drupal形式陣列

有在$路徑中的模板文件pecapture_displayform.tpl.php

function pecapture_block($op = 'list', $delta = 0, $edit = array()) { 
    $block = array(); 
    if ($op == "list") { // Generate listing of blocks from this module, for the admin/block page 
    $block[0]["info"] = t('Persistent E-mail Capture Form Block'); 
    } 
    else /* if ($op == 'view') */ { // Generate our block content 
    $block['subject'] = ''; //'Persistent E-mail Capture Form'; 
    $block['content'] = pecapture_displayForm(); 
    } 
    return $block; 
} // function pecapture_block 

此說,當你正在查看塊,使用功能pecapture_displayForm()來生成內容。 $塊獲取PHP打印()的

/** 
* Callback for pecapture_theme 
*/ 
function pecapture_displayform() { 
    return drupal_get_form('pecapture_blockform'); 
} 

這是說返回HTML格式的Drupal的形式陣列(輸出)

function pecapture_blockform(&$form_state) { 
    /* the form, standard ... */ 

這是形式的內容,這是典型的。

我試着顯式調用主題功能pecapture_displayform:
return theme('pecapture_displayform', $form);

return theme('pecapture_displayform', drupal_get_form($form));

那麼,爲什麼不通過pecapture-displayform.tpl.php會的形式?

+0

您是否清除緩存?或主題註冊表重建? – Nikit 2010-01-30 02:40:02

回答

1

從模塊創建主題有兩種基本方式 - 使用主題功能或使用模板。在這兩種情況下,都需要在模塊的hook_theme函數中註冊主題(pecapture_theme)。你的例子的那部分看起來是正確的。

如果您註冊了一個主題功能,則可以創建主題功能,並將其命名爲theme_themename。如果你註冊一個模板(就像你做的那樣),你可以使用一個可選的template_preprocess函數和一個模板。 Template_preprocess函數被稱爲template_preprocess_themename,並通過引用傳遞一個變量數組,然後傳遞給模板。另外,你不應該直接調用主題函數。總是使用theme('themename', $args)來訪問主題,以便drupal可以正確處理它(允許重寫和正確變量預處理)。

因此,首先,它看起來像你試圖直接調用drupal無法識別爲主題函數的主題函數。其次,您使用的是模板,因此如果您想在將表單發送到模板之前處理該表單,則需要一個名爲template_preprocess_pecapture_displayform(&$vars)的函數。另外請確保您的模板名爲pecapture-display.tpl.php,因此它與您在hook_theme中提供的名稱完全匹配,但擴展名除外。

此外,它看起來像你試圖主題的形式。因此,您需要通過在表單功能中包含$form['#theme'] = 'pecapture_displayform'來告訴drupal_get_form使用您的主題。你可以通過調用drupal_render($form['element'])來輸出你的主題中的單個表單元素,調用drupal_render($form)將呈現任何剩餘的未呈現元素(drupal保持跟蹤,使它們不會被呈現兩次)。

有關主題表單的更多信息,請參閱http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6

只要您指定的表單功能的主題,你將不再需要顯式調用它,所以你應該能夠做到

$block['content'] = drupal_get_form('pecapture_blockform'); 

在你的大鉤。

+0

這看起來像我想要的...我會在星期一嘗試它。 – davidosomething 2010-01-30 16:03:00

+0

$ form ['#theme'] ='pecapture_displayform'; $ block ['content'] = drupal_get_form('pecapture_blockform'); 完美運作。謝謝! – davidosomething 2010-02-01 14:02:50