Trabajar con registros de un webform de Drupal 8

Cosas que se les ocurren a los clientes, una vez montado un formulario de contacto ahora me vienen con que lo quieren con validación del email por doble opt in. Hay módulos de Drupal ya pensados para ello pero la mayoría de los que he visto son para el registro de usuarios, no para un webform, por lo que al final me he puesto a montarlo a pelo. Básicamente es añadir un campo que llamo uuid con el código de validación y otro campo que indica si esta validado o no. Así cuando registramos al usuario en el formulario lo haría de esta forma:

$values = [
      'webform_id' => 'formulario_contacto',
      'in_draft' => FALSE,
      'uid' => '1',
      'langcode' => \Drupal::currentUser()->getPreferredLangcode(),
      'token' => 'pgmJREX2l4geg2RGFp0p78Qdfm1ksLxe6IlZ-mN9GZI',
      'uri' => '/webform/formulario_contacto/api',
      'remote_addr' => '',
      'data' => [
          'nombre'=>$form_state->getValue('nombre'),
          'apellidos'=>$form_state->getValue('apellidos'),
          'email'=>$form_state->getValue('email'),
          'validado'=>'No',
          'uuid'=>uniqid(explode('@', $form_state->getValue('email'))[0]),
      ],
    ];

Luego mandamos el email con el enlace a una página fija que creamos mediante el fichero routing.yml del modulo.


mi_modulo.contacto_validar:
  path: '/contactos/validar'
  defaults:
    _controller: '\Drupal\mi_modulo\ContactosController::validar'
    _title: 'Contactos'
  requirements:
    _permission: 'access content'

Y en el controlador ya podemos meter toda la lógica que queramos, por ejemplo comprobar si hay un registro con el uuid que llega por URL:


   $id = $request->query->get('id');
    $database = \Drupal::service('database');
    $select = $database->select('webform_submission_data', 'wsd')
                        ->fields('wsd', array('sid'))
                        ->condition('wsd.webform_id', 'formulario_contacto', '=')
                        ->condition('wsd.name', 'uuid', '=')
                        ->condition('wsd.value', $id, '=');
     $executed = $select->execute();
     $results = $executed->fetchAll(\PDO::FETCH_ASSOC);
     if (count($results) == 1) {
	// el identificador del registro 
       $sid = $results[0]['sid'];
    }

Luego si queremos recuperar los datos del registro:


$submission = \Drupal::entityTypeManager()->getStorage('webform_submission')->load($sid);
$data = $submission->getData();

O si directamente queremos actualizar el registro como validado:


$query = \Drupal::database()->merge('webform_submission_data');
       $query->key([
            'sid' => $sid,
            'name' => 'validado',
        ])->fields([
            'value' => 'Si',
        ]);
        $query->execute();

Dejar un comentario?

0 Comentarios.

Deje un comentario


NOTA - Puede usar estosHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.