Desde hace mucho, MUCHO pero ¡¡¡MUCHOOOOO!!!! tiempo, me vienen consultando sobre cómo generar selects dinámicos con datos traídos desde una BD, sin embeber el código HTML con PHP. Básicamente, las consultas siempre llegan a través de programadores que están dando sus primeros pasos con MVC.
Hoy me decidí a escribir este post cansada de responder una y mil veces lo mismo, a fin de dejar este tema en claro y por qué no, desmitificarlo un poco. Así que como diría Le Corbusier[0] ¡Manos a la obra!
Lo primero que vamos a necesitar, es la plantilla HTML que contiene el código del select. Imaginemos que se trata de un formulario como este:
<h3>Agregar nueva ciudad</h3>
<form mtehod="POST" action="/modulo/ciudad/guardar">
<label for="nombre">Ciudad:</label><br />
<input type="text" name="nombre" id="nombre"/><br /><br />
<label for="provincia">Provincia:</label><br />
<select name="provincia" id="provincia">
<strong> <!--ESTA PARTE DEL CODIGO SE ITERA--></strong>
<strong> <option value="1">Buenos Aires</option></strong>
<strong> <!--ESTA PARTE DEL CODIGO SE ITERA--></strong>
</select><br /><br />
<input type="submit" value="Agregar ciudad"/>
</form>
Como se puede observar en el código, hay un comentario HTML que indica la parte del código sobre la cual, debe realizarse un render de forma iterativa: los options. Solo que éstos, no tendrán el value y el text predefinidos, sino que también, deberán ser sustituidos de forma dinámica. Y para ello, utilizaremos el mismo sistema de comodines, que explico en mi libro de OOP y MVC para newbies:
<strong> <!--PROVINCIAS--></strong>
<strong> <option value="{provincia_id}">{nombre}</option></strong>
<strong> <!--PROVINCIAS--></strong>
Las preguntas a hacernos ahora son: ¿Qué sabemos? ¿Qué tenemos? y ¿Qué necesitamos?
Sabemos que los datos de las provincias, los obtendremos efectuando una consulta a la base de datos y que ésta, nos retornará un array cuyos elementos, serán arrays asociativos, donde las claves, serán los nombres de los comodines (pero sin las llaves) y los valores, los datos por los cuales debemos sustituir los comodines.
Tenemos la plantilla HTML que contiene el código sobre el cual habrá que realizar las sustituciones.
Necesitamos obtener la fracción del código HTML sobre la cual realizar las sustituciones, para finalmente, iterar sobre str_replace()
pasándole un array de comodines a buscar, otro de datos por los cuales reemplazar dichos comodines y obtener el HTML renderizado.
La parte más divertida, es obtener la fracción de código sobre la cual iterar. ¿Cómo vamos a obtenerla sin embeber el HTML con PHP? Simple: utilizando una expresión regular:
<strong># Defino la expresión regular</strong>
$regex = "/<!--PROVINCIAS-->(.|n){1,}<!--PROVINCIAS-->/";
<strong># Busco la el patrón coincidente en mi plantilla HTML</strong>
preg_match($regex, file_get_contents('archivo.html'),
$array_coincidencias);
Una vez definida la expresión regular y buscada con preg_match, la fracción de código que necesitamos, la obtendremos en el índice 0 de $array_coincidencias: $codigo = $array_coincidencias[0];
. Ahora nos resta generar el array de comodines. Sabemos que los comodines serán siempre los mismos y solo variarán los datos por los cuales sustituirlos:
$comodines = array('{provincia_id}', '{nombre}');
Solo necesitamos iterar sobre el array retornado por la consulta a base de datos, para realizar las sustituciones dinámicamente:
$render_options = '';
foreach($array_de_resultados as $array_asociativo) {
$sustituciones = array_values($array_asociativo);
$render_options .= str_replace($comodines, $sustituciones,
$codigo);
}
Una vez hecho esto, habremos obtenido todo el HTML de los options. Solo nos resta insertarlo en nuestra plantilla HTML:
print str_replace($codigo, $render_options,
file_get_contents('archivo.html'));
Y si nos quisiéramos poner más detallistas y minuciosos, a la hora de imprimirlo, podríamos quitarle los comentarios HTML:
$html = str_replace($codigo, $render_options,
file_get_contents('archivo.html'));
<strong>print str_replace('<!--PROVINCIAS-->', '', $html);</strong>
Después de todo, no era algo tan complejo. ¡Disfrútenlo!
[0] Famoso arquitecto de «obras» suizo-francés… lo sé… es un juego de palabras pelotudo pero a mi me divierte igual xD
Una idea sobre “Generando selects dinámicos en PHP sin embeber código HTML”
Pero si pensaba que había dejado aquí un comentario !! Es un post de esos que tienes que guardar a buen recaudo, muy grande y muchas gracias Euge 😉