drupal问题 - 如何从另一个模块打印表单?

时间:2010-07-20 22:40:28

标签: forms drupal drupal-modules

我正在尝试在面板中包含模块表单,我尝试使用drupal_get_form(),但不确定我是否正确使用它。

在有机组模块中,有一个呈现og_broadcast_form的函数。它在og.module中的page_callback中调用:

    // Broadcast tab on group node.
  $items['node/%node/broadcast'] = array(
    'title' => 'Broadcast',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('og_broadcast_form', 1),
    'access callback' => 'og_broadcast_access',
    'access arguments' => array(1),
    'type' => MENU_LOCAL_TASK,
    'file' => 'og.pages.inc',
    'weight' => 7
  );

在og.pages.inc中,函数是:

 function og_broadcast_form($form_state, $node) {
   drupal_set_title(t('Send message to %group', array('%group' => $node->title)));

   if (!empty($form_state['post'])) {
     drupal_set_message(t('Your message will be sent to all members of this group.'));
   }

   $form['subject'] = array(
    '#type' => 'textfield',
    '#title' => t('Subject'),
    '#size' => 70,
    '#maxlength' => 250,
    '#description' => t('Enter a subject for your message.'),
    '#required' => TRUE,
  );
  $form['body'] = array(
    '#type' => 'textarea',
    '#title' => t('Body'),
    '#rows' => 5,
    '#cols' => 90,
    '#description' => t('Enter a body for your message.'),
    '#required' => TRUE
  );
  $form['send'] = array('#type' => 'submit', '#value' => t('Send message'));
  $form['gid'] = array('#type' => 'value', '#value' => $node->nid);
  return $form;
}

我尝试过drupal_get_form的多种变体:

print drupal_get_form('og_broadcast_form', NULL, arg(1)); //where arg 1 is the node id from the url
print drupal_get_form('og_broadcast_form');
print drupal_get_form('og_broadcast_form', &$form_state, arg(1));
print drupal_get_form('og_broadcast_form', $n); //where $n is node_load(arg(1));
print drupal_get_form('og_broadcast_form', &$form_state, $n); 
等等等......有没有办法完成我在这里要做的事情?

4 个答案:

答案 0 :(得分:4)

仅供参考。您的问题是您正在尝试加载位于其他模块包含文件中的表单。 该函数位于og.pages.inc中,您需要调用:

module_load_include('inc', 'og', 'og.pages');

必须先获取此信息才能获取表格。

答案 1 :(得分:2)

如果给drupal_get_form一个函数的名称作为它的第一个参数,那将是form_id和一个函数被调用以生成$ form数组。

在功能代码的第3行,我们有$args = func_get_args();,drupal_get_form使用它来收集您可能想要传递给表单构建函数的任何或所有其他参数。

您应该使用drupal_get_form('og_broadcast_form', node_load(arg(1)));

您确定应该使用print而不是return吗?我最近了解到他们在主题系统中做了很多不同的事情。我已经以这种方式使用drupal_get_form成功填充了块的内容,但我自己没有打印到屏幕上。

编辑:完整节点对象而不是nid,因为菜单路径中的%node使用通配符加载器将node_load(arg(1))传递给正在调用的任何函数。

答案 2 :(得分:1)

drupal_get_form为您获取表单。你试过打印drupal_render(drupal_get_form('what')))?

答案 3 :(得分:0)

drupal_get_form()只接受一个参数$ form_id。

http://api.drupal.org/api/function/drupal_get_form/6

运行hook_form_alter()var_dump($form_id)。这将为您提供$form_id,当您将其传递给drupal_get_form()时,它应该返回呈现的表单。