¿Cómo imprimo los resultados después de enviar un formulario de Drupal?

9

Tengo una configuración simple del módulo Drupal que tiene un solo cuadro de texto.

Puedo devolver lo que se escribió en el cuadro de texto usando drupal_set_message():

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

Sin embargo echo $username;no funcionará para mí, no se imprime nada. ¿Cómo puedo devolver resultados sin usar drupal_set_message()?

h00j
fuente

Respuestas:

7

La forma normal de manejar esto es implementar un flujo de trabajo de varios pasos. Consulte drupal_rebuild_form()para obtener más información, pero básicamente lo configura $form_state['rebuild'] = TRUE;en su controlador de envío y, en la función de formulario original, agregue un cheque para ver si el formulario se ha enviado. Si es así, tiene acceso a los valores enviados y puede manipular el formulario como mejor le parezca.

Un ejemplo muy básico:

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;
}
Clive
fuente
2

Un controlador de envío de formularios solo puede imprimir un mensaje usando drupal_set_message()o escribiendo un mensaje en el registro con watchdog().

La alternativa es guardar los datos necesarios en la sesión y redirigir al usuario (usando $form_state['redirect'] = 'page path';) a una página donde se muestra el contenido de la sesión.

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;
}

Como nota al margen, el primer argumento de t()debe ser una cadena literal, no una cadena obtenida concatenando dos cadenas, como en su caso. Debe usar marcadores de posición, como en el siguiente código.

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

En Drupal 7, en lugar de devolver una cadena, puede devolver una matriz de representación .

kiamlaluno
fuente
1

Todos los datos enviados se almacenan en $form_state, si desea ver qué sucede, instale el módulo de desarrollo y, después, siempre puede hacer lo siguiente:

Dentro de su firstmodule_form1_submitfunción para imprimir todo el $form_statetipo de matriz dpm($form_state), y verá la salida, donde puede encontrar su nombre de usuario del cuadro de texto o cualquier otro, será algo similar a esto$form_state['values']['username']

Y luego puedes imprimirlo drupal_set_message(t($form_state['values']['username']);

Petro Popelyshko
fuente
Gracias, tengo esa parte, sin embargo, drupal_set_message la devuelve como una cosa del tipo "Mensaje de ayuda". Me gustaría devolver un montón de contenido en la página en sí.
h00j
0

Lo que debe hacer es tener una devolución de llamada del menú, básicamente esa sería una página que configure y muestre la información.

Más información está disponible aquí: http://api.drupal.org/api/drupal/includes!menu.inc/group/menu/7 y necesita leer más sobre hook_menu ()

Espero que ayude, dime si necesitas un ejemplo.

Chiko
fuente