Archivos de Categoría: Drupal 8

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

Módulo de Drupal conectado a un CRM basado en Dynamics 365

En un proyecto reciente me han pedido que los registros de un formulario se guarden tanbien en un CRM basado en Dynamics 365 asi que ha tocado investigar un poco y sobretodo basándome en la única librería que me funcionaba bien para conectarme. El código está alojado en Github.

Básicamente tenemos un formulario con nombre, apellidos e email (ver fichero contacto_form.build) y lo que hacemos es montar un módulo que muestre el formulario. Toda la lógica de la conexión al CRM está en la clase \module_dynamics\src\Form\CRM donde comprobaremos primero si el email está registrado como lead y en caso contrario lo crearemos.

Generar CSV de un webform de Drupal 8

En su dia monte un Drupal 8 que iba sobrado con balanceador de carga y demás historias pero ahora anda saturado porque les monte una mini extranet aprovechando la misma instalación de Drupal, El problema es que ahora el servidor esta petado el pobre y cuando intentan sacar el listado de registros insertados en los webform, se les queda colgado. Así que la solución para salir del paso hasta que amplíen el alojamiento de Amazon es acceder al mysql a pelo y ejecutar esta consulta:

select concat('id;', group_concat(name separator ';') , ';fecha') as data from webform_submission_data where webform_id = 'NOMBRE_WEBFORM' group by sid limit 1
union
select concat(s.sid, ';', group_concat(value separator ';') , ';', from_unixtime(s.created,'%d/%m/%Y %H:%i:%s')) as data
from webform_submission s inner join webform_submission_data d on s.sid = d.sid where s.webform_id = 'NOMBRE_WEBFORM'
group by s.sid

Esto hecho desde consola redirigimos la salida a un fichero y ya tenemos un csv con todos los registros del formulario en cuestión .