Después de una semana intensa en la que pude llevar a la práxis una de mis teorías favoritas, puedo decir que gracias a Dios soy libre. Tengo poco. En realidad no tengo nada y soy feliz y pleno con ello.
Poca educación pero siempre dispuesto a trabajar, a entregar mi fuerza y voluntad a lo que hago. Siempre haciendo lo que me gusta con todo el amor que poseo, hacerlo hasta quedar sin fuerza, completamente fatigado y con un as extra bajo la manga, sustentando mi estirpe; mi gusto. Mi camino va lejos y el destino parece no estar a mi favor. Nada importa, sólo llevar la mirada al frente y un paso firme en mis decisiones. Lo que he conseguido es mío, a nadie se lo quité, no soy un ladrón. No tengo oro o plata sin embargo soy emperador en mis vastos reinos: voluntad y decisiones, soy un Rey en mi vida. Mi condición humana me remite a la muerte, pero cada elemento del cielo y la tierra tiene una caducidad, la lluvia, el viento, todo es parte de. De pronto me canso, me dan ganas de largarme y abandonar todo, mi casa es un humilde hogar, pero es mi hogar. Tal vez no tengo tanto dinero como antes, pero todo lo que hay en mi son cosas que siempre he deseado. Las noches llenas de nostalgia, las tardes tranquilas y pues, quién sino yo ha de ser bendecido con sus sueños por alimentarlos y trabajar por ellos. A veces en las áridas tierras de las emociones los astros juegan entre las sombras y las tinieblas y ese preciso momento es parte del mismo universo y su búsqueda del equilibrio. Siempre hay tempestades y siempre les sobreviene la calma, a lo lejos siempre se quedan las huellas del silencio y el agua.
Cuéntame
cuéntame como te va con él
dime si firmar en un papel
ya te ha hecho sentir bien
Cuéntame
pero dime toda la verdad
si quedar bien con la sociedad
te dio la felicidad
Cuéntame
si hoy que te dicen señora
has cumplido tu capricho y ya no te sientes sola
Cuéntame
si el que te llevo del brazo
toda vestida de blanco
tenia cariño en el banco
NO.
Hablar con honestidad, por ridículo que parezca es algo de lo más sencillo que hay en el mundo, otrora me parecía lo más complejo y lo evitaba a toda costa. Se requiere valor para ser honesto y franco yo, cuando menos siempre busqué la calidad de las palabras para dirigir con doble intensión un mensaje que sea sugerente y reservado.
Quitémonos de puterías y falta de caracter, la honestidad es así como viene, así como se siente. Ya aprendí a ser fiel a mi, a mis ideales, a mis gustos y a mis vicios. Pretendo que con cada circunstancia vital dentro de mi vida se forme un criterio amplio, congruente con la finalidad de no tener nada de qué avergonzarme.
Me he enamorado, sí, varias veces. No tantas como las que en verdad he deseado. Luchar contra la emoción o dejar de creer en la ilusión es apabullar el alma como a un perro se le golpea el hocico cuando muerte el muy amado par de pantuflas que el amo adora por su comodidad.
Los aspectos de mi vida, sin lugar a dudas y, sin temor a admitirlo me tienen perplejo; no hay medida que refleje una dimensión aproximada al hervir de mi sangre que con aires de guerra se irgue de su seol buscando el freno de sus pasiones.
De cierto expreso que bajo la influencia del esfuerzo puedo apenas imaginar lo que al caer la noche será de mi vida. Muy seguramente, al abrigo del tejaban de la azotea encienda un cigarro, haga una llamada de teléfono, persiga las luces que con candor danzan frente a mis ojos y el humo del cigarro haga presa de mis fosas nasales.
Al día de mañana, día en que quizás no esté vivo, no sé que haya de ser-hacer-querer para mi, para lo que amo. Es cierto, estoy hecho para ser feliz. Sí, y hoy se ha presentado la oportunidad perfecta para que con sobriedad y entereza haga lo que como guerrero (el mejor que he podido ser) aceche mis debilidades y mis emociones para sacar siempre una ventaja notoria de ellas.
La variedad de circunstancias, donde hay ira, amor e ilusión en un mismo ser, al mismo tiempo, en el mismo lugar ponen bajo la lupa las habilidades que poseo para su escrutinio y crítica despiadados. Me alegra tener esta fortuna de contar conmigo y con quienes he podido llamar amigos sólo para poder liberar un poco de la presión que bajo el volcán taponado de mi energía destructora pretende salir a cazar almas para saciar sus instintos.
Este día es un buen reto, este día me puso de frente un mosquito que desde esta perspectiva parece una bestia un tanto más alta, fuerte y poderosa que yo. He de quedar vivo, sé de sobra que así será. Las marcas de batalla serán las que haya de traer a mi regreso, después de enfrentarme con la bestia que se aparece con sus intimidantes 3 caras.
Les platico, tuve que hacer esto en mi archivo routes.php debido a que por recomendaciones SEO en unos ejemplos que leí de canonical URL.
Sé que es un parámetro entretenido que puede resultarnos útil para subir el ranking de la página, incrementar los resultados orgánicos y
mejorar todas esas cosas que generan monedas.
La cosa es que un cuate de aquí de la oficina estaba implantando el botón tipo “like” de facebook pero provisto por el mismísimo google.
En la documentación del botoncito, el compa encontró que ese botón tiende a buscar-usar el canonical url para asociar la página a la que se le dio LIKE.
La intención de modificar el archivo routes.php de codeigniter es precisamente para que tanto los usuarios como los crawlers puedan encontrar con el canonicalurl
una respuesta bonita (en este caso, la sección de la marca que está buscándose).
Por ejemplo, si un usuario escribía www.intruder.mx/sangoma, el router class de CI le indicaba que al no aparecer como un archivo dentro de la carpeta (y subcarpetas)
de controladores no existía y devolvía un error 404. La modificación es ésta y está pensada para que a las rutas (arreglo $routes)
del CI se le añadan las cosas que necesitamos dirigir a un controlador específico.
// conectándome a la base de datos
// DATABASE_HOST, DATABASE_USER, DATABASE_PASS son constantes definidas en mi archivo constants.php
$db_shop = mysql_connect(DATABASE_HOST, DATABASE_USER, DATABASE_PASS);
//Cheando que 'aiga' conexión.
if (! $db_shop)
{
show_error(503, "routes.php: No se pudo conectar a la base de datos: ".mysql_error(), 'error_db');
log_message('error', "routes.php: No se pudo conectar a la base de datos: ".mysql_error());
}
//Seleccionando la BD que se usa.
mysql_select_db('base_de_datos');
$getInformacion = "SELECT * FROM tabla WHERE campo_condicion = 1;"; // checando las marcas activas
$fuenteDatos = mysql_query($getInformacion); // consultándolo en la base
//Si se fue a la merga la conexión, pues a la merga el usuario
if (!$fuenteDatos)
{
show_error(503, 'routes.php: Consulta no válida: ' . mysql_error() . "La consulta es:
{$getInformacion}
", 'error_db');
mysql_free_result($fuenteDatos);
}
else{ // Si hay conexión y todo está chingón, vamos a iterar la respuesta de la base.
$route = array();
// iterando el recordset
while($datos = mysql_fetch_assoc($fuenteDatos))
{
// Solo si no tienes esa ruta para la marca entras, sino... bríncate
if ( ! array_key_exists("{$datos['id_o_texto']}/(:any)" , $route) )
{
$route["{$datos['id_o_texto']}"] = "controlador/metodo/{$datos['id_o_texto']}/";
}
}
mysql_free_result($fuenteDatos);
}
//cerrando la conexión con la bd porque luego hay weyes que no hacen esto y su estúpido mysql se ataranta hermoso
mysql_close($db_shop);
// a la chingada las basuras
unset($db_shop);
unset($getInformacion);
unset($fuenteDatos);
unset($marcas);
// ¿cómo queda el routes? :
ob_start();
print_r($route);
$dump = ob_get_contents();
ob_clean();
log_message('debug', "routes.php array.route {$dump}");
Ahora vamos con el modelo, el modelo (por adaptación del concepto que tomé del manual de CodeIgniter) es una entidad que se encarga de interactuar con el controlador (que es de donde vienen las solicitudes del usuario y a donde éste envía las respuestas de las consultas para mostrar info al usuario final).
@name md_comentarios
@access publico
@description Esta clase se encarga de interactuar con la base de datos, básicamente es para la minería de datos
@parameters none
*/
class md_comentarios extends CI_Model {
public function __construct()
{
parent::__construct();
}
/**
@author Pedro Navarro
@name get_comentarios
@access publico
@description Busca dentro de la base de datos los registros que aún no estén publicados, esto es para "moderar" cada uno de ellos y decidir cuáles han de mostrarse y cuales no.
@parameters none
@return resultset object
*/
public function get_comentarios()
{
//inicializando la conexión de la base de datos
$db_comentarios = $this->load->database('default', True);
//creando la consulta para obtener los registros
$sql_comentarios = " SELECT * FROM comentarios;";
//ejecuto la consulta y con un operador ternario (condicion) ? parte verdadera : parte falsa; determino qué es lo que voy a enviar como resultado al controlador
$resultado = ($db_comentarios->query($sql_comentarios)->num_rows() >= 1) ? $db_comentarios->query($sql_comentarios)->result() : Null;
//escupo al log el valor asignado a la variable; desde aquí ya sé cómo se va a comportar el controlador
log_message('info', "md_comentarios->get_comentarios->sql_comentarios: {$db_comentarios->last_query()}");
//cierro la conexión con la base de datos
$db_comentarios->close();
return $resultado;
}
/**
@author Pedro Navarro
@name get_comentario
@access publico
@description Busca dentro de la base de datos los registros que aún no estén publicados, esto es para "moderar" cada uno de ellos y decidir cuáles han de mostrarse y cuales no.
@parameters none
@return row object
*/
public function get_comentario ( $parametros = Null )
{
// la variable de retorno siempre es False al inicio
$resultado = false;
// verifica que los parámetros sean un arreglo y no sea Null
if( ( ! is_null( $parametros ) ) && ( is_array( $parametros ) ))
{
//inicializando la conexión de la base de datos
$db_comentarios = $this->load->database('default', True);
//creando la consulta para obtener los registros
$sql_comentarios_pendientes = " SELECT * FROM comentarios WHERE com_id = {$db_comentarios->escape($parametros['com_id'])} LIMIT 1; ";
//ejecuto la consulta y con un operador ternario (condicion) ? parte verdadera : parte falsa; determino qué es lo que voy a enviar como resultado al controlador
$resultado = ($db_comentarios->query($sql_comentarios_pendientes)->num_rows() == 1) ? $db_comentarios->query($sql_comentarios_pendientes)->row() : Null;
// cierro la conexión a la base de datos
$db_comentarios->close();
}
return $resultado;
}
/**
@author Pedro Navarro
@name set_publicar_comentario
@access publico
@description Actualiza el campo com_publicar a 1 en la tabla comentarios
@parameters array
@return boolean
*/
public function set_publicar_comentario ( $parametros = Null )
{
// la variable de retorno siempre se inicia con False
$resultado = False;
// verifica que los parámetros sean un arreglo y no sea Null
if( ( ! is_null( $parametros ) ) && ( is_array( $parametros ) ))
{
// inicializando la conexión a la base de datos
$db_comentarios = $this->load->database('default', True);
// creación de la consulta SQL con la actualización del registro
$sql_publicar_comentario = "UPDATE comentarios SET com_publicar = 1 WHERE com_id = {$db_comentarios->escape($parametros['com_id'])};";
// ejecuto el query
$db_comentarios->query($sql_publicar_comentario);
log_message('info', "md_comentarios->set_publicar_comentario->sql_publicar_comentario: {$db_comentarios->last_query()}");
// checo si actualizó o no alguno de los comentarios y regreso True/False dependiendo de la respuesta
$resultado = $db_comentarios->affected_rows() == 1 ? True : False;
// cerrando conexión con la base de datos.
$db_comentarios->close();
}
return $resultado;
}
/**
@author Pedro Navarro
@name set_bannear_comentario
@access publico
@description Actualiza el campo com_publicar a 1 en la tabla comentarios
@parameters array
@return boolean
*/
public function set_bannear_comentario ( $parametros = Null )
{
//la variable de retorno siempre se inicia como False
$resultado = False;
// verifica que los parámetros sean un arreglo y no sea Null
if( ( ! is_null( $parametros ) ) && ( is_array( $parametros ) ))
{
// inicializa la conexión con la base de datos
$db_comentarios = $this->load->database('default', True);
//creo la sentencia SQL para actualizar a 0 el campo com_publicar
$sql_bannear_comentario = "UPDATE comentarios SET com_publicar = 0 WHERE com_id = {$db_comentarios->escape($parametros['com_id'])};";
//ejecuto el query
$db_comentarios->query($sql_bannear_comentario);
log_message('info', "md_comentarios->set_publicar_comentario->sql_bannear_comentario: {$db_comentarios->last_query()}");
// le pregunto con un operador ternario a la base de datos cuántos registros alteró y asigno True/False dependiendo de lo que haya hecho
$resultado = $db_comentarios->affected_rows() == 1 ? True : False;
// cerrando la conexión a la base de datos.
$db_comentarios->close();
}
return $resultado;
}
//** De aquí para abajo van los métodos para la otra parte del ejemplo **//
/**
@author Pedro Navarro
@name get_comentarios_publicados
@access publico
@description Busca dentro de la base de datos los registros que aún no estén publicados, esto es para "moderar" cada uno de ellos y decidir cuáles han de mostrarse y cuales no.
@parameters none
@return resultset object
*/
public function get_comentarios_publicados()
{
//inicializando la conexión de la base de datos
$db_comentarios = $this->load->database('default', True);
//creando la consulta para obtener los registros
$sql_comentarios = " SELECT * FROM comentarios WHERE com_publicar = 1;";
//ejecuto la consulta y con un operador ternario (condicion) ? parte verdadera : parte falsa; determino qué es lo que voy a enviar como resultado al controlador
$resultado = ($db_comentarios->query($sql_comentarios)->num_rows() >= 1) ? $db_comentarios->query($sql_comentarios)->result() : Null;
//escupo al log el valor asignado a la variable; desde aquí ya sé cómo se va a comportar el controlador
log_message('info', "md_comentarios->get_comentarios_publicados->sql_comentarios: {$db_comentarios->last_query()}");
//cierro la conexión con la base de datos
$db_comentarios->close();
return $resultado;
}
/**
@author Pedro Navarro
@name set_agregar_comentario
@access publico
@description Inserta un registro en la tabla comentarios
@parameters array
@return boolean
*/
public function set_agregar_comentario ( $parametros = Null )
{
/**
En esta función voy a poner el ejemplo de la otra manera de escapar correctamente los queries usando el otro método de escape de CodeIgniter
*/
//la variable de retorno siempre va en False al inicio de la función
$resultado = False;
// verifica que los parámetros sean un arreglo y no sea Null
if( ( ! is_null( $parametros ) ) && ( is_array( $parametros ) ))
{
// inicializa la conexión con la base de datos
$db_comentarios = $this->load->database('default', True);
//creo la sentencia SQL para insertar el registro
$sql_insertar_comentario = "INSERT INTO comentarios (com_autor, com_comentario, com_fecha, com_publicar) VALUES (?, ?, ?, ?);";
//ejecuto el query
$db_comentarios->query($sql_insertar_comentario, $parametros);
log_message('info', "md_comentarios->set_agregar_comentario->sql_insertar_comentario: {$db_comentarios->last_query()}");
// le pregunto con un operador ternario a la base de datos cuántos registros alteró y asigno True/False dependiendo de lo que haya hecho
$resultado = $db_comentarios->affected_rows() == 1 ? True : False;
// cerrando la conexión a la base de datos.
$db_comentarios->close();
}
return $resultado;
}
}
/* End of file md_comentarios.php */
/* Location: ./application/models/md_comentarios.php */
Ahora vamos a ver cómo hice el controlador, éste recibe solicitudes vía ajax de parte de la vista. El primero de los controladores que voy a poner está pensado para leer (en la vista pública, por llamarlo de alguna manera)
load->model('md_comentarios', 'md_comentarios');
}
/**
@author Pedro Navarro
@name index
@access publico
@description Redirecciona al método admin.
@parameters none
@return void
*/
public function index()
{
//redirecciona a la URL del sitio a partir de la propiedad controller_name de la clase y lo manda al método admin
redirect(base_url()."{$this->controller_name}/leer");
}
/**
@author Pedro Navarro
@name leer
@access publico
@description Muestra una vista general, con los comentarios aprobados por el moderador
@parameters none
@return void
*/
public function leer ()
{
//accedo al método get_comentarios de la clase (modelo) md_comentarios para obtener la lista de comentarios
$parametros_vista['titulo_pagina'] = "{$this->controller_name}";
// le empujo a esta variable el resultado que devuelva el modelo.
$parametros_vista['rs_comentarios'] = $this->md_comentarios->get_comentarios_publicados();
// cargo la vista y le aviento los parámetros que ya definí.
$this->load->view('comentarios', $parametros_vista);
}
/**
@author Pedro Navarro
@name agregar_comentario
@access publico
@description Muestra una vista con campos para ingresar comentarios.
@parameters none
@return void
*/
public function agregar_comentario ()
{
// cargo la vista y le aviento los parámetros que ya definí.
$this->load->view('agregar_comentario');
}
/**
@author Pedro Navarro
@name guardar_comentario
@access publico
@description Muestra una vista con campos para ingresar comentarios.
@parameters none
@return void
*/
public function guardar_comentario ()
{
$parametros['com_autor'] = $this->input->post('com_autor', true);
$parametros['com_comentario'] = $this->input->post('com_comentario', true);
$parametros['com_fecha'] = $this->input->post('com_fecha', true);
$parametros['com_publicar'] = 0;
$insertar_comentario = $this->md_comentarios->set_agregar_comentario($parametros);
if ($insertar_comentario)
{
$this->lista_comentarios();
}
}
public function lista_comentarios()
{
//accedo al método get_comentarios de la clase (modelo) md_comentarios para obtener la lista de comentarios
$parametros_vista['titulo_pagina'] = "{$this->controller_name}";
// le empujo a esta variable el resultado que devuelva el modelo.
$parametros_vista['rs_comentarios'] = $this->md_comentarios->get_comentarios_publicados();
// cargo la vista y le aviento los parámetros que ya definí.
$this->load->view('lista_comentarios', $parametros_vista);
}
}
/* End of file leer_comentarios.php */
/* Location: ./application/controllers/leer_comentarios.php */
Ahora viene el controlador que hace la “moderación” de los comentarios que los usuarios escriben.
load->model('md_comentarios', 'md_comentarios');
}
/**
@author Pedro Navarro
@name index
@access publico
@description Redirecciona al método admin.
@parameters none
@return void
*/
public function index()
{
//redirecciona a la URL del sitio a partir de la propiedad controller_name de la clase y lo manda al método admin
redirect(base_url()."{$this->controller_name}/admin");
}
/**
@author Pedro Navarro
@name admin
@access publico
@description Muestra la lista de todos los comentarios que hay dentro de la base de datos
@parameters none
@return void
*/
public function admin()
{
//accedo al método get_comentarios de la clase (modelo) md_comentarios para obtener la lista de comentarios
$parametros_vista['titulo_pagina'] = "{$this->controller_name} admin";
// le empujo a esta variable el resultado que devuelva el modelo.
$parametros_vista['rs_comentarios'] = $this->md_comentarios->get_comentarios();
// cargo la vista y le aviento los parámetros que ya definí.
$this->load->view('moderador/lista_comentarios', $parametros_vista);
}
/**
@author Pedro Navarro
@name publicar
@access publico
@description Recibe el parámetro del comentario a publicar y hace las operaciones propias en el modelo
@parameters integer
@return void
*/
public function publicar()
{
//recibo
$parametros['com_id'] = $this->input->post('com_id', true);
log_message('info', "\$parametros['com_id'] es: {$parametros['com_id']}");
$comentario = $this->md_comentarios->get_comentario( $parametros );
$respuesta_modelo = False;
if($comentario)
{
log_message('info', "\$comentario->com_publicar es: {$comentario->com_publicar}");
switch ($comentario->com_publicar)
{
case 1:
$respuesta_modelo = $this->md_comentarios->set_bannear_comentario( $parametros ) ? 'Comentario deshabilitado.' : 'Error, no se pudo efectuar la operacion, revisa los logs.';
break;
case 0:
$respuesta_modelo = $this->md_comentarios->set_publicar_comentario( $parametros ) ? 'Comentario publicado.' : 'Error, no se pudo efectuar la operacion, revisa los logs.';
break;
default:
$respuesta_modelo = False;
break;
}
}
log_message('info', "\$respuesta_modelo es: {$respuesta_modelo}");
print($respuesta_modelo);
}
}
/* End of file moderar_comentarios.php */
/* Location: ./application/controllers/moderar_comentarios.php */
Ahora, vamos a las vistas, la primera de ellas se llama comentarios.php, en esta lista se ponen los comentarios “moderados” que el administrador haya promovido.
=$titulo_pagina?>
Agregar Comentario=$comentario->com_comentario;?>=$comentario->com_fecha?>No hay registros para mostrar#
Ahora, la vista que por medio de ajax se carga para agregar comentarios al programa y que le aparezcan al moderador
Como ya les había comentado previamente, pueden descargar el demo que funciona y toda la cosa.
AQUÍ
Happy coding!






