Как распечатать результаты после отправки формы Drupal?

9

У меня есть простая установка модуля Drupal, которая имеет одно текстовое поле.

Я могу вернуть то, что было напечатано в текстовом поле, используя drupal_set_message():

function firstmodule_form1_submit($form, &$form_state) {
    drupal_set_message(t("The user is $username"));
}

Однако echo $username;у меня не получится, ничего не печатается. Как я могу вернуть результаты без использования drupal_set_message()?

h00j
источник

Ответы:

7

Обычный способ справиться с этим - реализовать многошаговый рабочий процесс. Смотрите drupal_rebuild_form()для получения дополнительной информации, но в основном вы установили $form_state['rebuild'] = TRUE;в своем обработчике отправки, и в исходной функции формы добавьте проверку, чтобы увидеть, была ли форма отправлена. Если это так, у вас есть доступ к отправленным значениям и вы можете манипулировать формой по своему усмотрению.

Очень простой пример:

function MYMODULE_some_form($form, &$form_state) {
  // If the form has been submitted, output something related to the submission
  if (!empty($form_state['values']['some_field'])) {
    $form['submission'] = array(
      '#markup' => function_to_get_markup_from_value($form_state['values']['some_field'])
    );
  }
  else {
    // Otherwise build the normal form
    $form['some_field'] = array(
      '#type' => 'textfield',
      // ...
    );
  }

  return $form;
}

function MYMODULE_some_form_submit($form, &$form_state) {
  $form_state['rebuild'] = TRUE;
}
Клайв
источник
2

Обработчик отправки формы может только распечатать сообщение, используя drupal_set_message()или записав сообщение в журнал с помощью watchdog().

Альтернативой является сохранение необходимых данных в сеансе и перенаправление пользователя (с помощью $form_state['redirect'] = 'page path';) на страницу, где отображается содержание сеанса.

function firstmodule_menu() {
  $items['the path for your page'] = array(
    'page callback' => 'firstmodule_show_submitted_data';
    // ...
  );

  return $items;
}

function firstmodule_form1_submit($form, &$form_state) {
  $_SESSION['firstmodule_username'] = $username;
  // ...

  $form_state['redirect'] = 'the path for your page';
}

function firstmodule_show_submitted_data() {
  // Populate $result with the string to show.

  return $result;
}

Как примечание стороны, первый аргумент t()должен быть литеральной строкой, а не строкой, полученной конкатенацией двух строк, как в вашем случае. Вы должны использовать заполнители, как в следующем коде.

drupal_set_message(t("The user is %username", array('%username' => $username)));

В Drupal 7 вместо возврата строки вы можете вернуть массив визуализации .

киамалуно
источник
1

Все отправленные данные хранятся в $form_state, если вы хотите увидеть, что происходит, установите модуль devel и после этого вы всегда можете сделать так:

Внутри вашей firstmodule_form1_submitфункции для печати всех $form_stateтипов массивов - dpm($form_state)- и вы увидите, что вывод, где вы можете найти ваше имя пользователя текстового поля или любое другое, будет что-то похожее на это$form_state['values']['username']

И тогда вы можете просто напечатать его drupal_set_message(t($form_state['values']['username']);

Петр Попелишко
источник
Спасибо, у меня есть эта часть, однако drupal_set_message возвращает ее как тип сообщения "Help Message". Я хотел бы вернуть много контента на самой странице.
h00j
0

То, что вам нужно сделать, это иметь обратный вызов меню, в основном это будет страница, которую вы настроили, и отобразить информацию о ней.

Более подробная информация доступна здесь: http://api.drupal.org/api/drupal/includes!menu.inc/group/menu/7, и вам нужно больше узнать о hook_menu ()

Надеюсь, это поможет, скажите мне, если вам нужен пример.

Chiko
источник