Como imprimo resultados após enviar um formulário Drupal?


9

Eu tenho uma configuração simples do módulo Drupal que possui uma única caixa de texto.

Posso devolver o que foi digitado na caixa de texto usando drupal_set_message():

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

No entanto echo $username;, não vai funcionar para mim, nada é impresso. Como posso retornar resultados sem usar drupal_set_message()?

Respostas:


7

A maneira normal de lidar com isso é implementar um fluxo de trabalho com várias etapas. Consulte drupal_rebuild_form()para obter mais informações, mas basicamente você define $form_state['rebuild'] = TRUE;seu manipulador de envio e, na função original do formulário, adicione uma verificação para ver se o formulário foi enviado. Se houver, você terá acesso aos valores enviados e poderá manipular o formulário como achar melhor.

Um exemplo muito 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;
}

2

Um manipulador de envio de formulários só pode imprimir uma mensagem usando drupal_set_message()ou gravando uma mensagem no log watchdog().

A alternativa é salvar os dados necessários na sessão e redirecionar o usuário (usando $form_state['redirect'] = 'page path';) para uma página em que o conteúdo da sessão é mostrado.

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 observação lateral, o primeiro argumento de t()deve ser uma string literal, não uma string obtida concatenando duas strings, como no seu caso. Você deve usar espaços reservados, como no código a seguir.

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

No Drupal 7, em vez de retornar uma sequência, você pode retornar uma matriz de renderização .


1

Todos os dados enviados são armazenados $form_state, se você quiser ver o que acontece, instale o módulo devel e depois você sempre poderá fazer o seguinte:

Dentro da sua firstmodule_form1_submitfunção para imprimir todo o $form_statetipo de matriz - dpm($form_state)- e você verá a saída, onde você pode encontrar o nome de usuário da sua caixa de texto ou qualquer outro, haverá algo semelhante a este$form_state['values']['username']

E então você pode simplesmente imprimi-lo drupal_set_message(t($form_state['values']['username']);


Obrigado, eu tenho essa parte, no entanto, drupal_set_message retorna como uma coisa do tipo "Mensagem de Ajuda". Gostaria de retornar muito conteúdo na própria página.
H00j

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.