Drupal вопросы - как распечатать форму из другого модуля? - PullRequest
3 голосов
/ 21 июля 2010

Я пытаюсь включить форму модуля в панель, и я пытался использовать drupal_get_form (), но не уверен, что я использую его правильно.

В модуле органических групп есть функция для визуализации og_broadcast_form. Он вызывается в обратном вызове страницы в og.module:

    // 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 ]

4 голосов
/ 23 октября 2010

К вашему сведению .. ваша проблема в том, что вы пытаетесь загрузить форму, расположенную в файле включения других модулей. Функция находится в og.pages.inc, и вам нужно позвонить по номеру:

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

Это нужно сделать, прежде чем вы сможете получить форму.

2 голосов
/ 21 июля 2010

Если 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_load (arg (1)) любой вызываемой функции.

1 голос
/ 23 октября 2010

drupal_get_form получает форму для вас.Вы пытались напечатать drupal_render (drupal_get_form («что угодно»)))?

0 голосов
/ 21 июля 2010

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(), оно должно вернуть обработанную форму.

...