Rutas fáciles de cambiar en Codeigniter, cercano a WordPress

Con estos cambios podríamos llegar a tener un simil Wordpress y con total libertad para definir las rutas desde base de datos. Sólo necesitamos unos pocos archivos y una tabla en la DB.

Publicado el miércoles 3 de enero de 2017, a las 02:23am

Si algo tiene Codeigniter de bueno es el manejo de las rutas en el framework. 

Por lo general se deben harcodear en el archivo "Config/Routes.php" pero, se puede dinamizar la cuestión? 

Hasta ahora (por lo menos en mi caso) no había respuesta hasta que descubrí esta respuesta en StackOverflow (o también conocido como el paraíso de los programadores cuando tenemos un infierno en la cabeza), de hecho, les dejo el link: http://stackoverflow.com/questions/5826282/codeigniter-generate-routes-dynamically 

Pero acá yo se los voy a dejar más fácil aún. 

Primero ante nada vamos a armar una tabla "routes" con estos campos: 

  • ruta_id (int, primary key con autoincrement) 
  • orden (int)
  • url (text) 
  • url_variable (text)
  • clase (text)
  • metodo (text)
  • variable (text)
  • timestamp (obviamente timestamp) 

Pueden ponerle los nombres que mejor les queden cómodos, eso sí, tendrán que cambiarlos en las variables correspondientes de los snippets que siguen. 

Este snippet se llama "pdo_db_connect.php", lo tenés que poner en "application/config". 

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
function pdo_connect(){
try{
// Levantar el archivo de base de datos. 
include 'database.php';
if(!isset($db)){
echo 'No hay conexión a la base de datos.'; exit;
}
$hostname   = $db['default']['hostname']; 
$database   = $db['default']['database']; 
$username   = $db['default']['username']; 
$password   = $db['default']['password']; 
//to connect
$DB = new PDO('mysql:host='.$hostname.'; dbname='.$database, $username, $password);
return $DB;

catch(PDOException $e) 
{
echo 'Ocurrió un error. Mensaje: '.$e->getMessage();
}
}

Esto hará la conexión con la DB para traer las rutas de la DB. 


Este otro snippet reemplazará el contenido de "Routes.php", te recomiendo que hagas una copia de tu "Routes.php" actual. 

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
// Hacemos una conexión PDO
include('application/config/pdo_db_connect.php');
class dynamic_route{
public $pdo_db = FALSE;
public function __construct(){
}
private function query_routes(){
try{
$routes_query = $this->pdo_db->query('SELECT * FROM Routes ORDER BY `Orden` ASC');
if($routes_query){
$return_data = array(); 
foreach($routes_query as $row) {
$return_data[] = $row; 
}
return $return_data;
}
}catch(PDOException $e) {
echo 'Ocurrió un error. Mensaje: '.$e->getMessage();
}
}
private function filter_route_data($data){
$r_data = array();
foreach($data as $row){
$return_data = new stdClass;
if(empty($row['url_variable']) ){
$return_data->url = $row['url'];
}else{
$return_data->url = $row['url'].'/'.$row['url_variable'];
}
if(empty($row['metodo']) && empty($row['Variable']) ){
$return_data->route = $row['clase'];
}elseif(!empty($row['metodo']) && empty($row['variable']) ){
$return_data->route = $row['clase'].'/'.$row['metodo'];
}elseif(!empty($row['metodo']) && !empty($row['variable']) ){
$return_data->route = $row['clase'].'/'.$row['metodo'].'/'.$row['variable'];
}
$r_data[] = $return_data;
}
return $r_data;
}
public function get_routes(){
$route_data = $this->query_routes();
$return_data = $this->filter_route_data($route_data);
return $return_data;
}       
}
$dynamic_route = new dynamic_route;
// Give dynamic route database connection
$dynamic_route->pdo_db = pdo_connect();
// Get the route data
$route_data = $dynamic_route->get_routes();
//Iterate over the routes
foreach($route_data as $row){
$route[$row->url] = $row->route;
}

Acá imprimirá en forma dinámica todas las rutas que hayamos cargado en la DB. 

Como primer registro en la tabla podés colocar esto: 

Registro: 

ruta_id: 1 

orden: 1 

url: default_controller 

url_variable: (null) 

clase: home 

metodo: (null) 

variable: (null) 

timestamp: (timestamp) 


Como ves, es fácil setear una ruta sin tener que ir cargando una y otra vez el archivo "Routes.php". 

También permitirá que puedas ir agregando dinámicamente una página o redirigir una noticia (por ejemplo) a una ruta fija, a lo Wordpress. Eso ya queda en vos querer armarlo. 


Espero que te sirva ;) 

El contenido de mi Sitio Personal está licenciado bajo Creative Commons Reconocimiento 4.0 Internacional.

Esta web utiliza tecnologías demasiado recientes, tan recientes que Internet Explorer no los soporta.

Por favor bajate un navegador apto para webs del siglo actual.

Ir a bajar un buen navegador de verdad
Continúo con el riesgo de tener la peor experiencia del mundo