Archivos de Categoría: PHP - Paginas 6

Minificar css, javascript y html en Laravel 5

Para reducir el tiempo de carga de una página hay una serie de recomendaciones básicas y entre ellas está la de reducir al máximo los ficheros que carga el navegador, para ello la solución es devolver todo el código del fichero en una linea.
Para los css y javascript lo que suelo usar el gulp, en mi servidor de desarrollo tengo los ficheros «legibles» y cuando los quiero subir al repositorio hago la minificación con las siguientes tareas:

var gulp = require('gulp'),
  concat = require('gulp-concat'),
  uglify = require('gulp-uglify'),
  cleanCSS = require('gulp-clean-css');

gulp.task('javascript', function () {
    gulp.src('public/js/*.js')
        .pipe(uglify())
        .pipe(gulp.dest('/mnt/repositorio/public/js/'));
});

gulp.task('estilos', () => {
   gulp.src('public/css/*.css')
       .pipe(cleanCSS({compatibility: 'ie8'}))
       .pipe(gulp.dest('/mnt/repositorio/public/css/'));   
});

Pero minificar el html de salida, en mi caso en Laravel, es otra historia. Al principio probé con el componente gulp-htmlmin de gulp pero me generaba errores, también existe la posibilidad de usar paquetes de terceros para minificar como por ejemplo https://github.com/HTMLMin/Laravel-HTMLMin pero de los que he visto no funcionan en Laravel 5.0 que es el que uso por restricciones del servidor de producción, asi que googleando llegue me encontré en stackoverflow el middleware definitivo (lo retoque un poco):

<?php
namespace App\Http\Middleware;
use Closure;
class MinifyHtml
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $buffer = $response->getContent();
        if(strpos($buffer,'<pre>') !== false)
        {
            $replace = array(
                '/<!--&#91;^\&#91;&#93;(.*?)&#91;^\&#93;&#93;-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\r/"                      => '',
                "/>\n</"                    => '><',
                "/>\s+\n</"                 => '><',
                "/>\n\s+</"                 => '><',
            );
        }
        else
        {
            $replace = array(
                '/<!--&#91;^\&#91;&#93;(.*?)&#91;^\&#93;&#93;-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\n(&#91;\S&#93;)/"                => '$1',
                "/\r/"                      => '',
                "/\n/"                      => '',
                "/\t/"                      => '',
                "/ +/"                      => ' ',
            );
        }
        $buffer = preg_replace(array_keys($replace), array_values($replace), $buffer);
        $response->setContent($buffer);
        ini_set('zlib.output_compression', 'On'); // If you like to enable GZip, too!
        return $response;
    }
}

Y para instalarlo es tan sencillo como añadirlo al array $middleware que tenemos en el fichero kernel.php

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