【问题标题】:drupal questions - how to print a form from another module?drupal 问题 - 如何从另一个模块打印表单?
【发布时间】:2010-07-20 22:40:27
【问题描述】:

我正在尝试在面板中包含一个模块表单,并且我尝试使用 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); 

等等等等...有没有办法完成我在这里尝试做的事情?

【问题讨论】:

    标签: forms drupal drupal-modules


    【解决方案1】:

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

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

    这必须在您获取表单之前完成。

    【讨论】:

      【解决方案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)) 传递给正在调用的任何函数。

      【讨论】:

        【解决方案3】:

        drupal_get_form 为您获取表单。你试过 print drupal_render(drupal_get_form('whatever'))) 吗?

        【讨论】:

          【解决方案4】:

          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() 时,它应该返回呈现的表单。

          【讨论】:

          • 谢谢,但我也试过了...这是我列出的第二个,它根本没有呈现表单?
          • 不正确; drupal_get_form() 确实接受多个论点。请参阅参数说明,其中报告“...任何其他参数都传递给由 drupal_get_form() 调用的函数,包括唯一的表单构造函数。例如,node_edit 表单要求在此处传递一个节点对象当它被调用时。”,就在参数$form_id的描述之后。
          猜你喜欢
          • 1970-01-01
          • 2012-08-03
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          • 2011-04-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多