Saltar al contenido

Drupal - ¿Cómo envío un valor variable desde mi formulario a otra página usando el método POST?

Posteriormente a consultar con expertos en este tema, programadores de diversas ramas y profesores hemos dado con la solución a la pregunta y la plasmamos en esta publicación.

Solución:

Así envío información de un formulario a otro.

En la primera página:

use DrupalCoreUrl;

function submitForm(array &$form, FormStateInterface $form_state)
  drupal_set_message($this->t('@candidate_name! Wow! Nice choice! Thanks for telling us!', array('@candidate_name' => $form_state->getValue('candidate_name'))));

  $params['query'] = [
    'candidate_name' => $form_state->getValue('candidate_name'),
  ];

  $form_state->setRedirectUrl(Url::fromUri('internal:' . 'second_page', $params));

En la segunda página:

public function buildForm(array $form, FormStateInterface $form_state)    
  $candidate_name = Drupal::request()->query->get('candidate_name');

  $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Candidate Name:'),
    '#required' => TRUE,
    '#value' => $candidate_name,
  );

  return $form;

EDITAR: Para el método POST, nunca lo vi antes, pero puede crear en la primera página una var de sesión y usar esta var en la segunda var después de la redirección. Eche un vistazo a Almacenamiento de datos de sesión con Drupal 8.

SEGUNDA EDICIÓN: Parece que la forma correcta de hacer esto es con PrivateTempStore, si vas a ver CommentAdminOverview en Core verás esto:

  /**
   * @inheritdoc
   */
  public function submitForm(array &$form, FormStateInterface $form_state) 
      ...
      $info = [];
      /** @var DrupalcommentCommentInterface $comment */
      foreach ($comments as $comment) 
        $langcode = $comment->language()->getId();
        $info[$comment->id()][$langcode] = $langcode;
      
      $this->tempStoreFactory
        ->get('comment_multiple_delete_confirm')
        ->set($this->currentUser()->id(), $info);
      $form_state->setRedirect('comment.multiple_delete_confirm');
    
  }

En esta página, recopila la identificación del comentario que desea eliminar y realiza una redirección, y la eliminación del comentario ocurre en comment.multiple_delete_confirm (ConfirmDeleteMultiple) que tienen el siguiente código:

  /**
   * @inheritdoc
   */
  public function buildForm(array $form, FormStateInterface $form_state) 
    $this->commentInfo = $this->tempStoreFactory->get('comment_multiple_delete_confirm')->get($this->currentUser()->id());
    if (empty($this->commentInfo)) 
      return $this->redirect('comment.admin');
    
    /** @var DrupalcommentCommentInterface[] $comments */
    $comments = $this->commentStorage->loadMultiple(array_keys($this->commentInfo));
  ...
  

Entonces, no tenemos un método POST de un formulario a otro en Drupal 8, pero esto se puede resolver de esta manera.

Una forma de hacerlo es agregar una consulta string con el valor en él con setRedirect.

$form_state->setRedirect('second_page', ['name' => $form_state->getValue('name')]);

Luego, léelo en la siguiente forma:

// top of file
use DrupalCoreComponentUtilityXss;

$name = Xss::filter(Drupal::request()->get('name'));

$form['name'] = array(
  '#type' => 'textfield',
  '#title' => t('Candidate Name:'),
  '#default_value' => isset($name) ? $name : '',
  '#required' => TRUE,
);

Tenga en cuenta que no haría esto para obtener información más confidencial, como números de tarjetas de crédito o algo por el estilo.

¡Menudo pepinillo! Aquí hay algunas sugerencias:

Solución 1: ¡Sesión al rescate!

  • Después de enviar, validar y procesar el primer formulario, almacene los valores relevantes (los que desea pasar al segundo formulario) en la sesión.
  • Mientras crea el segundo formulario, use los valores almacenados en la sesión como valores predeterminados para completarlo previamente.

Solución 2: formulario de varios pasos

  • Fusiona las 2 formas en una forma gigante. Poner los elementos de la primera forma en uno envase y los elementos de la segunda forma en otra envase. Colocar #access para FALSE para que el segundo contenedor oculte el segundo contenedor.
  • Después de que el usuario envíe la información en la primera parte del formulario, oculta el primer contenedor y muestra el segundo.

Referencia: Consulte los ejemplos de formulario proporcionados en el módulo de ejemplos.

Solución 3: ¿Estados de forma?

Dependiendo de la situación, también puede considerar usar estados de formulario. Si usa estados de formulario, ocultar y mostrar se puede hacer en el lado del cliente. Entonces, el formulario hará una solicitud al servidor una vez que tenga todos los datos.

Solución 4: ¡Cambie la acción del formulario!

Dependiendo de la situación, incluso puede considerar cambiar el action attribute del formulario para que los valores se envíen a la URL que especifique en el formulario action attribute.

Si sostienes alguna perplejidad o disposición de modernizar nuestro tutorial eres capaz de escribir una anotación y con placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.