Modal dinámico en Bootstrap 4
En un artículo anterior explicamos cómo refrescar contenido en un modal de Bootstrap 3, algo muy útil para una ventana de información tras añadir un producto al carrito con Woocommerce por ejemplo. Si no lo recordáis o queréis echarle un vistazo, podéis hacer click aquí.
En esta ocasión explicaremos cómo podemos hacer lo mismo con un modal en la versión 4 de Bootstrap, pues el método anterior ha sido eliminado del framework. No entraremos tanto en detalle explicando el por qué hemos elegido hacerlo así o para qué sería útil porque ya lo hicimos en el artículo anterior, así que vamos directamente al nuevo método para poder actualizar el contenido del modal de Bootstrap o lo que es lo mismo, hacer modals dinámicos en Bootstrap 4.
- Puesto que ya no funciona como antes, en el que utilizábamos el atributo ‘href ‘ de la etiqueta ‘a’ o bien un atributo ‘data’ con el nombre ‘remote’, no veo necesario utilizar el elemento de enlace para abrir el modal, por lo que vamos a usar un span en esta ocasión.Antes:
1<a data-toggle="modal" data-target="#AvanzaModal" href="http://www.avanzaeninternet.com/producto-de-ejemplo/?add-to-cart=463" alt="Comprar producto" class="miclase" data-product_id="463" data-product_sku="45678652" data-product-quantity="1">AÑADIR A CARRITO</a>
Ahora:
1<span data-toggle="modal" data-target="#AvanzaModal" data-remote="http://www.avanzaeninternet.com/producto-de-ejemplo/?add-to-cart=463" class="miclase" data-product_id="463" data-product_sku="45678652" data-product-quantity="1">AÑADIR A CARRITO</span>
- El código de la ventana o popup en este caso hemos preferido tener varios elementos estáticos como lo son el header y footer del modal, pero también podrían ser dinámicos si necesitáramos que tuvieran alguna otra función o información a mostrar. En nuestro caso el botón de continuar con la compra y finalizar la compra serán siempre los mismos.
1234567891011121314<div class="modal fade" id="AvanzaModal" tabindex="-1" role="dialog" aria-labelledby="AvanzaModalLabel"><div class="modal-dialog modal-lg" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button></div><div class="modal-body"></div><div class="modal-footer clearfix"><button type="button" class="pull-left btn btn-default" data-dismiss="modal">Continuar comprando</button><a href="https://avanzaeninternet.com/carrito/" class="button">Finalizar compra</a></div></div></div></div>
- Lo realmente diferente viene ahora, pues necesitaremos tener el código jQuery que ponemos a continuación para que al hacer click sobre nuestro elemento ‘Añadir al carrito’, el modal cargue la información deseada.
12345678910111213141516var remoto_href = '';jQuery('body').on('click', '[data-toggle="modal"]', function() {if(remoto_href != jQuery(this).data("remote")) {remoto_href = jQuery(this).data("remote");jQuery(jQuery(this).data("target")).removeData('bs.modal');jQuery(jQuery(this).data("target")).find('.modal-body').empty();jQuery(jQuery(this).data("target") + ' .modal-body').load(jQuery(this).data("remote") + '/?modal=1');}});
Si os fijáis, el código contiene una pequeña comprobación que hace ligeramente más óptima la carga del servidor, pues en lugar de eliminar el contenido y volver a cargarlo en cada click, lo que hacemos es comprobar si el atributo ‘remote’ sigue siendo el mismo. Por ejemplo, el modal podría contener los términos y condiciones de uso desde varios enlaces en la misma página.
También se ha añadido una variable de php por GET que nos servirá para comprobar si debo mostrar únicamente el contenido de la página solicitada, o por lo contrario debo mostrar la página junto con toda la cabecera, menús, footer, etc. - Por último el template de la página contendrá el contenido del modal. Comprobaremos si existe la variable GET llamada modal para mostrar más o menos contenido.
1234567891011121314151617181920212223242526272829303132<?phpif(isset($_GET['modal'])) {<div class="row"><div class="col-xs-12 col-sm-6"><div class="thumbnail"><img src="https://avanzaeninternet.com/producto-253.png" title="Nombre del producto" alt="Texto alternativo"></div></div><div class="col-xs-12 col-sm-6"><div class="talla">XL</div><div class="descripcion">Esto es un producto de prueba</div><div class="precio">100,00€</div></div></div>} else {?><!DOCTYPE html><html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>TITULO de la página</title>//todos los css y js</head><body>CONTENIDO NORMAL DE LA WEB</body></html><?php}?>
Por último, aclarar que el código jQuery se lanzaría en todos los modals de la web, por lo que si quisierais tener contenido estático y dinámico en diferentes modals, no deberíais aplicar el evento click a todos los elementos data-toggle modal. Una solución serían crear una clase específica para los divs dinámicos.