2010-01-30 89 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