Drupal模块 - 块中的表单不应用模板

时间:2010-01-30 00:13:10

标签: php drupal

帮我弄清楚为什么我的表单没有被设置为la sites / all / modules / pecapture / themes / pecapture-displayform.tpl.php

这是我的代码:

/**
 * 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($ form = NULL),使用theme('pecapture_displayform',$ form)调用,其中$ form是一个Drupal表单数组

$ path

上有一个模板文件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()来生成内容。 $ block获取php print()ed

/**
* 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?

1 个答案:

答案 0 :(得分: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中提供的名称完全匹配,但扩展名除外。

此外,您似乎正在尝试主题表单。因此,您需要通过在表单函数中包含drupal_get_form来告诉$form['#theme'] = 'pecapture_displayform'使用您的主题。您可以通过调用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');

在您的块挂钩中。