Comment imprimer les résultats après avoir soumis un formulaire Drupal?

9

J'ai une configuration de module Drupal simple qui a une seule zone de texte.

Je peux retourner ce qui a été tapé dans la zone de texte en utilisant drupal_set_message():

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

Cependant echo $username;ne fonctionnera pas pour moi, rien n'est imprimé. Comment puis-je retourner des résultats sans utiliser drupal_set_message()?

h00j
la source

Réponses:

7

La façon normale de gérer cela est d'implémenter un workflow en plusieurs étapes. Voir drupal_rebuild_form()pour plus d'informations, mais en gros, vous définissez $form_state['rebuild'] = TRUE;dans votre gestionnaire d'envoi, et dans la fonction de formulaire d'origine, ajoutez une vérification pour voir si le formulaire a été soumis. Si c'est le cas, vous avez accès aux valeurs soumises et pouvez manipuler le formulaire comme bon vous semble.

Un exemple très basique:

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
la source
2

Un gestionnaire de soumission de formulaire ne peut imprimer un message qu'en utilisant drupal_set_message()ou en écrivant un message dans le journal avec watchdog().

L'alternative consiste à enregistrer les données nécessaires dans la session et à rediriger l'utilisateur (en utilisant $form_state['redirect'] = 'page path';) vers une page où le contenu de la session est affiché.

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

En remarque, le premier argument de t()doit être une chaîne littérale, pas une chaîne obtenue concaténant deux chaînes, comme dans votre cas. Vous devez utiliser des espaces réservés, comme dans le code suivant.

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

Dans Drupal 7, au lieu de renvoyer une chaîne, vous pouvez renvoyer un tableau de rendu .

kiamlaluno
la source
1

Toutes les données soumises stockées dans $form_state, si vous voulez voir ce qui se passe, installez le module de développement et après, vous pouvez toujours faire comme ceci:

À l'intérieur de votre firstmodule_form1_submitfonction pour imprimer tout le $form_statetype de tableau - dpm($form_state)- et vous verrez une sortie, où vous pouvez trouver votre nom d'utilisateur de zone de texte ou tout autre, sera quelque chose de similaire à ceci$form_state['values']['username']

Et puis vous pouvez simplement l'imprimer drupal_set_message(t($form_state['values']['username']);

Petro Popelyshko
la source
Merci, j'ai cette partie mais drupal_set_message la renvoie comme une chose de type "Message d'aide". Je voudrais renvoyer beaucoup de contenu sur la page elle-même.
h00j
0

Ce que vous devez faire est d'avoir un rappel de menu, ce serait essentiellement une page que vous configurez et affichez les informations.

Plus d'informations sont disponibles ici: http://api.drupal.org/api/drupal/includes!menu.inc/group/menu/7 et vous devez en savoir plus sur hook_menu ()

J'espère que cela vous aide, dites-moi si vous avez besoin d'un exemple.

Chiko
la source