Cómo mostrar "algo" sólo una vez al día, a la semana, o cada X horas
Tiempo de lectura: 2.24 minutos
En este artículo vamos a ver cómo mostrar "algo" a los visitantes de nuestra página, sólo una vez cada cierto tiempo.
Ese algo puede ser:
- Un anuncio importante que se debe mostrar una vez por día
- Un recordatorio que se debe mostrar como máximo una vez por semana
- Una promoción exclusiva (evitando que se muestre muchas veces, a fin de no incomodar)
Para lograr esto, vamos a usar cookies.
Vamos a ver 2 formas de implementar esto: usando cookies con código PHP, y usando cookies con código específico de Laravel.
El código PHP puede usarse perfectamente también en un proyecto Laravel. De todas formas, analizaremos cómo es que se haría lo mismo usando el facade Cookie
de Laravel.
Código PHP
En un proyecto PHP, donde no se hace uso de un framework, es común encontrar código PHP dentro de la estructura HTML de una página.
En ese caso es posible usar algo como lo siguiente:
<? if (!isset($_COOKIE['show_occasionally'])): ?>
<!-- aquí estaría el contenido que se espera mostrar ocasionalmente -->
<?
setcookie('show_occasionally', true, time() +86400); // 1 día equivale a 86400 segundos
?>
<? endif; ?>
En el código anterior, creamos 1 cookie con el nombre show_occasionally
, pero el nombre podría ser cualquier otro.
De hecho, podemos tener distintas cookies conviviendo, para mostrar contenido variado, según las distintas secciones de nuestra página.
En el ejemplo:
- Si no existe
show_occasionally
mostramos el contenido y creamos la cookie. - La cookie se crea con una duración de 86400 segundos, eso equivale a 1 día. Una hora sería 3600 segundos, y así puedes establecer el tiempo que consideres prudente.
Código Laravel
En Laravel también podemos usar isset
y el arreglo global $_COOKIE
para verificar la existencia de una cookie.
Así mismo, también podemos usar setcookie
para crear una cookie nueva.
Sin embargo, en Laravel podemos hacer uso del facade Cookie
o el helper cookie
, que son equivalentes pero más legibles.
Veamos un ejemplo.
- Tengo un controlador llamado
ArticleController
que se encarga de generar la vista para mostrar los artículos de mi blog (a través de un método llamadoshow
). - Entonces en el método
show
voy a escribir una lógica para que una oferta de descuento se muestre como máximo 1 vez por minuto. - El controlador enviará una variable
$showDiscount
a la vista, de modo que la vista entenderá si debe o no mostrar la oferta de descuento.
Entonces en el método show
ponemos:
if (Cookie::has('hide_discount')) {
$showDiscount = false;
} else {
$showDiscount = true;
$cookie = Cookie::make('hide_discount', true, 1);
Cookie::queue($cookie);
}
return view('articles.show')->with(compact('article', 'tags', 'showDiscount'));
Esto dice lo siguiente.
- Si existe una cookie llamada "esconder descuento", entonces la variable
$showDiscount
será false. - Si no existe esta cookie,
$showDiscount
será true, y creamos la cookie (de tal forma que dure un minuto y durante este tiempo no se muestre la oferta).
Así es. Como habrás notado, Laravel usa minutos en vez de segundos.
El método make
nos devuelve una cookie. Pero si no hacemos nada con este objeto, la cookie no se va a crear para el visitante.
Para usar la cookie tenemos varias formas. Una de ellas es usar queue
, para que esta cookie se cree justamente al termino de la petición (es decir, devolvemos la vista al usuario, y en ese momento Laravel creará también la cookie).
En el código de ejemplo de hecho he añadido un return view
para mostrar cómo la variable $showDiscount
es enviada la vista.
De forma tal que en la vista sólo tendríamos:
@if ($showDiscount)
{{-- aquí el contenido que quieras mostrar --}}
@endif
Dentro de la directiva if podrías imprimir código HTML o incluso incluir un archivo Javascript sobre la página.
Ello ya depende de tus necesidades.