Template Parser Class en CodeIgniter 3
- Andrés Cruz
Una de las cosas que hace prácticamente imprescindible el uso de framework MVC al momento de programar en PHP es la organización y legibilidad del código que viene también gracias a lo primero.
Evitar colocar código para inserciones, conexiones a base de datos, procesamiento de formularios con frameworks como CodeIgniter es muy fácil; al no emplear estos frameworks PHP puede que en algún momento se complique mantener dicha organización y tengamos que realizar muchas prácticas no convencionales que nos puede que resulten una buena idea en ese momento, pero que a posterior nos podrían traer complicaciones.
Con los frameworks viene incorporada una sería de funcionalidades que podemos emplear en la mayoría de los problemas que tengamos que resolver sin necesidad de emplear otras herramientas o programarlas nosotros mismos; por lo tanto, ganamos tiempo y calidad en el código al momento del desarrollo de nuestras aplicaciones.
Template Parser Class en CodeIgniter al rescate de la organización de nuestro código
Con la librería Template Parser Class de CodeIgniter se puede ganar organización y legibilidad al momento de y crear la estructura de anidamiento de nuestro HTML, menos código, menos fragmentación de las vistas, menos métodos para cargar fragmentos de vistas mediante la más que conocida:
$this->load->view('name');
Y por lo tanto todo más fácil de comprender y mantener; por ejemplo, teniendo el siguiente código:
<html>
<head>
<title><?php echo $blog_title ?></title>
</head>
<body>
<h3><?php echo $blog_heading ?></h3>
</body>
</html>
Que genera el siguiente HTML en base a la colección de datos que dispone:
Con el Template Parser Class podemos simplificarlo o reducirlo al siguiente código:
<html>
<head>
<title>{blog_title}</title>
</head>
<body>
<h3>{blog_heading}</h3>
</body>
</html>
Con una plantilla maestra podemos evitar múltiples cargas de vistas en los controladores
Otro factor importante que nos ayuda a la organización es que no tenemos que realizar en múltiples cargas de vistas en fragmentos como en el siguiente escenario:
$this->load->view('admin/header'); $this->load->view('admin/grid/usuarios', $output); $this->load->view('admin/footer');
Aquí podemos ver que realizamos 3 inserciones de bloques de vistas en nuestro controlador, el problema ocurre cuando tenemos múltiples vistas que trabajen de forma similar en múltiples acciones de uno o más controladores (en muy probable que en cada una de ellas tomando como ejemplo el esquema anterior realicemos exactamente la misma inserción, y solo variamos la vista del medio o algo por el estilo).
A la final la aplicación es más difícil de mantener y perdemos en organización, ya que si queremos modificar/agregar algún particularidad, diseño, etc de la vista es posible que nos perdamos en la búsqueda y el mantenimiento de dicha vista.
Otro factor importante es que es casi seguro que dejemos el HTML truncado al no poder cerrar todos los tags correspondientes en una estructura HTML, sobre todo con los tags HTML, BODY, etc.
Ahora con crear un solo template para el módulo que vamos a desarrollar (que en este caso sería el del admin) y realizar la carga de la siguiente forma en una única vista madre, que en caso de ser necesario, puede incluir a otras vistas solventaremos la situación anterior:
$this->parser->parse('templates/admin_body', $data);
Cargando y usando los Parser Class (Templates) en CodeIgniter
Como con cualquier librería o clase, para emplear el Template Parser Class en CodeIgniter debemos de cargar la librería o clase asociada a través de la carga habitual de la librería:
$this->load->library('parser');
Que también la podemos cargar desde el autoload
de CodeIgniter.
Con esta línea de código en nuestro controlador podemos comenzar a emplear el Template Parser Class.
Cómo pudiste ver anteriormente, ahora nuestra vista tiene una estructura diferente que en esencia es más simple; a a partir de ahora no cargaremos nuestra vistas de la manera tradicional:
$this->load->view('test/index', $data);
Si no ahora con parse
:
$this->parser->parse('test/index', $data);
Iteración de colecciones de datos con el Template Parser Class en CodeIgniter
Uno de los puntos fuertes de los Parser Class es no tener que usar la sintaxis clásica de los bucles como for
o foreach
en las vistas y ahorrarnos "ensuciar" las mismas; en su lugar creamos estructuras como la siguiente:
<html>
<head>
<title>{blog_title}</title>
</head>
<body>
<h3>{blog_heading}</h3>
{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}
</body>
</html>
Desde nuestro controlador colocamos la siguiente colección de datos:
$data = array(
'blog_title' => 'My Blog Title',
'blog_heading' => 'My Blog Heading',
'blog_entries' => array(
array('title' => 'Title 1', 'body' => 'Body 1'),
array('title' => 'Title 2', 'body' => 'Body 2'),
array('title' => 'Title 3', 'body' => 'Body 3'),
array('title' => 'Title 4', 'body' => 'Body 4'),
array('title' => 'Title 5', 'body' => 'Body 5')
)
);
Y logramos el mismo resultado que obtendremos al emplear un for o foreach en pero de una manera mucho más simple; nos da el siguiente resultado:
Es muy común que al momento de crear una vista final para el usuario la misma presente la misma codificación (a lo sumo con algunas pequeñas variaciones) en todas las secciones salvo por la central, la cual podemos guardar en otras vistas y obtenemos el contenido de las mismas en nuestro controlador y luego lo retornamos en nuestro template.
Hasta ahora hemos visto cómo devolver datos básicos procesados desde el mismo controlador, pero también podemos obtener el HTML de una página web y con esta la embebemos en una sección de nuestro template como hemos visto anteriormente:
$parse['body'] = $this->load->view('usuario/perfil', $data, TRUE);
$this->parser->parse('templates/admin_body', $parse);
Proveyendo a la vistas de contenido que no sean textos
Es muy probable que queramos devolver ciertos datos que no son solo textos si no es una estructura como un array, como nos sucede cuando intentamos importar el contenido de una tabla en Grocery CRUD; nos da el siguiente error:
Object of class stdClass could not be converted to string
Una forma de solventar este error es empleando las funciones; json_encode
que nos permite convertir un array a Json; es decir, a texto plano:
$data['body'] = '';
$data['grocery_crud'] = json_encode($crud->render());
$this->parser->parse('templates/admin_body', $data);
Y luego desde la vista empleamos el proceso inverso:
<?php isset($grocery_crud) ? $this->load->view('templates/grocery_crud', ['grocery_crud' => $grocery_crud]) : '' ?>
Aunque debemos evitar emplear este estilo de lógica y métodos en nuestras vistas, para casos específicos podemos adaptarlo bastante bien:
Por lo demás hay poco que decir, los templates en CodeIgniter nos permite elevar el nivel de organización de nuestro código tanto a nivel de vista como de Controlador, evitando en estos hacer múltiples inserciones de vistas en los mismos.
Puedes ver la documentación oficial en el siguiete enlace: Template Parser Class.
Conclusiones
Como podemos ver, esta es otra poderosa herramienta provista mediante una librería que nos permite crear nuestras propias plantillas de una manera muy fácil, nos ayudan enormemente para mantener organizado nuestro código; podemos agregar fácilmente un Bootstrap dashboard template o cualquier otro template con Bootstrap u otra tecnología como explicamos en el Master con CodeIgniter.
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter