Archivos de Categoría: Drupal 8 - Paginas 2

Mandar un email con Drupal 8

Cuando quiero mandar un email desde un módulo personalizado lo que suelo hacer es primero crear el fichero templates/mail.html dentro de la carpeta del módulo. En este fichero tebndremos el html que se manda por correo y si queremos personalizar un texto normalmente le pongo el nombre de variables entre corchetes. Por ejemplo:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>el title</title>
</head>
<body>
Este es un email con el siguiente mensaje personalizado: {{mensaje}}
</body>
</html>

Lo siguiente, en la programación de nuestro módulo plantamos el siguiente código:

$mailManager = \Drupal::service('plugin.manager.mail');
$module = 'my_modulo'; 
$key = 'email_contacto'; // clave que identifica el email

// configuración del envio
$html = file_get_contents(str_replace('src/Form', 'templates/mail.html', __DIR__));
$to = 'email@prueba.es';
$params['subject'] = 'el asunto del email ';
$params['message'] = str_replace('{{mensaje}}', 'el texto a sustituir', $html) ;
$params['Cc'] = [];
$langcode = \Drupal::currentUser()->getPreferredLangcode();
$send = true;
$result = $mailManager->mail($module, $key, $to, $langcode, $params, NULL, $send);

// guardamos en el log de Drupal el resultado del envio
$message = ($result['result'] !== true)?'Se ha producido un error en el envio de email':'Email enviado';
\Drupal::logger('contactForm')->notice($message);

Por ultimo, en el fichero .modulo especificamos el siguiente hook:

use Drupal\Core\Mail\MailManagerInterface;
use Drupal\Component\Utility\SafeMarkup;
use Drupal\Component\Utility\Html;

function my_modulo_mail($key, &$message, $params) {
 $options = array(
   'langcode' => $message['langcode'],
 );
 switch ($key) {
   case 'email_contacto':
     $header = array(
           'MIME-Version' => '1.0',
           'Content-Type' => 'text/html; charset=UTF-8; format=flowed; delsp=yes',
           'Content-Transfer-Encoding' => '8Bit',
           'X-Mailer' => 'Drupal'
     );
     if(count($params['Cc'])>0) $header['Cc'] = implode(',', $params['Cc']);
     $message['headers'] = $header;
     $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed; delsp=yes';
     $message['from'] = \Drupal::config('system.site')->get('mail');
     $message['subject'] = $params['subject'];
     $message['body'][] = $params['message'];
     break;
 }
}

Redireccionar usuario Drupal 8 según perfil

He estado creando un módulo de Drupal 8 que permite subir documentos a un perfil de usuario concreto y a otro poder ver el listado de dichos documentos. Este segundo perfil en concreto debe acceder directamente al listado cuando se loga por lo que he tenido que meter el siguiente hook en el módulo:

function my_module_user_login($account) {
// si es del perfil documentacion le redirigimos al listado de documentos
    if(in_array('documentacion', $account->getRoles())) {
        $response = new Symfony\Component\HttpFoundation\RedirectResponse("/user/listado-documentos");
        $response->send();
        return;
    }
}

Con esto ya estamos redirigiendo a los usuarios pero ahora hay que crear esa ruta, para ello en el módulo creamos un fichero routing y creamos la ruta restringiendo el acceso al perfil documentación:

my_module.listado:
  path: '/user/listado-documentos'
  defaults:
    _controller: '\Drupal\my_module\MyController::listado'
    _title: 'Listado de documentos'
  requirements:
    _permission: 'access content'
    _role: 'financial'

Y ya en el controlador MyController metemos toda la lógica que necesitemos

Módulo de Drupal 8 para extender funciones y filtros de Twig

Siempre que tengo que tocar un tema de Drupal 8, instalo un módulo para poder usar mis propias funciones y filtros desde Twig. El código fuente se puede descargar desde el repositorio https://github.com/ErTomy/twig_extension_module
Por ejemplo si queremos sacar una imagen a un tamaño en concreto (en este caso en el tamaño preestablecido imagen_grande):

<img src="{{thumb(item.field_image, 'imagen_grande')}}"/>

O sacar los resultados de una vista de un bloque concreto (donde actualidad sería la vista y block_actualidad el nombre del bloque):

{% for key,item in vista('actualidad', 'block_actualidad') %}
{{item.field_title}}
{% endfor %}

Crearse nuevas funciones o filtros sería tan sencillo como añadirlas en el fichero twig_extension_module/twig_extension_ertomy/src/TwigExtension/ErtomyExtension.php
Si es un filtro añadiríamos un nuevo elemento en el array dentro de la función getFilters() por ejemplo:

public function getFilters() {
    return array(
      'formatea_fecha' => new \Twig_Filter_Function(array('Drupal\twig_extension_ertomy\TwigExtension\ErtomyExtension', 'fechaFilter')),
      'peso' => new \Twig_Filter_Function(array('Drupal\twig_extension_ertomy\TwigExtension\ErtomyExtension', 'pesoFilter')),
      // nuevo filtro a añadir
      'nuevofiltro' => new \Twig_Filter_Function(array('Drupal\twig_extension_ertomy\TwigExtension\ErtomyExtension', 'nuevoFilter')),
    );
}

Y luego crear una función estática por ejemplo en este caso convertiría en mayúsculas el literal que le llegue:

public static function pesoFilter($string){
   return strtoupper($string);
}

Asi en la plantilla podríamos aplicar este filtro de esta forma:

{{ 'La cadena de texto'|nuevofiltro }}

Y para las funciones es exactamente lo mismo pero añadiendo el elemento en el array de la función getFunctions()