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();