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.

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
 

¿Por qué será que cuando hacemos el amor, nos comemos vivos?
Por qué será y, es la verdad. Que uno toca el cielo mientras está pecando.

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
 

La dósis perfecta está en tus caderas, en tus besos, tu sonrisa, tu cabello y ese cuerpo que me eriza…

GRACIAS.

=)

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
 

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.

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
 

ENVIADO A GUSTAVO GUZMÁN SEPÚLVEDA, CECILIA FALLABRINO, CARLOS FERREIRO, ATENCIÓN A CLIENTES IUSACELL, PROCURADURÍA FEDERAL DEL CONSUMIDOR Y RICARDO BENJAMÍN SALINAS PLIEGO.

SOLAMENTE SE HAN “OSCURECIDO” LOS NÚMEROS DE TELÉFONO CON EL FIN DE MANTENER CIERTA PRIVACIDAD.

A los viejos, a los nuevos y a los usuarios:

Licenciados Guzmán y Fallabrino, esos que, antes de la entrada del dinero de Televisa, se interesaban un pesito más por los clientes.
Lic. Carlos Ferreiro, CFO de Grupo Iusacell, este que, una vez entregados los activos, ha logrado que los empleados traten a los clientes como pasivos.

Antes que nada, reitero que esto es una carta abierta, por lo que espero que su reproducción sea realizada por todos los niveles, por todos los medios, con el fin único que sea conocido este caso, compuesto de muchos pequeños casos, que al final están derivando en que un cliente solicite su portabilidad y exija, en calidad del derecho a las telecomunicaciones y como la resolución de la COFETEL lo marca, su derecho intransferible e ineludible, su número telefónico de vuelta, tal como lo dispone la ley.

Yo he sido cliente de Grupo Iusacell durante más de 5 años. En todo este proceso, he tenido buenos días y malos días, porque las telecomunicaciones son suceptibles de falla, como todo es suceptible de fallas. Eso lo comprendo plenamente.

Recuerdo varias veces que no funcionó una tarjeta de recarga, y el Grupo se hizo cargo del problema, puntualmente.

Entiendo también que haya problemas que requieran hacer pruebas, tomen tiempo y además requieran la atención del usuario. Recuerdo muy bien que durante al menos cuatro años, me devolvían la llamada, me apoyaban para lograr el cometido de tener un excelente (siempre en esa temporada) servicio, y hasta me bonificaban si había algo qué bonificar.

Básicamente, se trató de un servicio de calidad. No sé si herencia de Verizon, o si realmente era porque estaban completamente comprometidos con atender al cliente como tenía merecido.

Recuerdo también los tiempos en que ilimitado significaba ilimitado, no una burda copia de ello. Pero me pongo en sus zapatos: es un negocio y hay que ganar dinero. Así de frío, así de simple.

Hasta hace poco, cuando tuve el problema en que un atrevido empleado de piso de ventas se negó a hacer una garantía argumentando que el cliente tenía la culpa, ustedes se pusieron de parte del cliente. Gissele Feria, quien ya no está en AteCliente, me atendió de una manera comprensiva, profesional y siempre dispuesta a resolver de la mejor manera los conflictos. Nada de gritos, como hoy en el centro de atención a clientes. No, para nada. Nada de “yo soy la gerente y te trato como quieras”. Porque así me atendieron hoy, solo que sin mediar estas palabras.

Gritar, señores, es un recurso para gente sin criterio, sin educación. Claro, a menos que sea gritar en una manifestación pública, derecho primordial de los ciudadanos, protegido y privilegiado por la Constitución, y por supuesto, por el Derecho Internacional. Pero gritarse de uno a uno, es falta de elegancia. Es falta de valor y una actitud cobarde del que se queda sin argumentos. Vamos; es cerrado, es grotesco y es retrógrada. Gritar, que no levantar la voz, solo es muestra de emociones y nada de razocinio.

Levantar la voz, ustedes lo tienen ensayado más que yo, es muestra de el llamamiento a la atención. Es hacer recordar al interlocutor que se está pasando de la raya. Es un pequeño acicate, necesario hasta en un discurso, ya no digamos en un diálogo.

La gerente del Centro de Atención con domicilio en Av División del Norte No 410 Del Valle Benito Juarez, México D.F C.P 03100, confundió términos. Gritar, es algo que no hago hace tiempo, porque gritar no lleva a nada. Mucho menos en una situación Cliente-Proveedor. La señorita porque le dije “póngase en mi lugar” me dijo “no me grite”. ¡Vaya! Valiente personal del que gozan ustedes. Valiente no: intrépido.

Reconoceré, antes de continuar, que hubo disposición en ciertos momentos, de parte de su empresa (representada por una empleada de atención a clientes, y después de parte de la ya mencionada gerente) por resolver el problema. Lo relataré con detalles, porque es adecuado hacerlo.

Al llegar al citado Centro, una señorita, cuyo nombre desconozco hasta ahora, ya que no tenía identificación alguna a la vista, comenzó a atenderme. Un chip GSM, prepago, misteriosamente “perdió” el servicio. El sistema perdió mi número. Y yo perdí mi tiempo, porque este tema se atendió en repetidas ocasiones tanto en el chat de atención, en twitter, por teléfono (inclusive me pidieron que fuera a un Centro para ser atendido), y hasta hoy, este asunto sigue sin respuesta. ¿La causa? Pues debía dejar mi equipo y mi chip por tiempo indefinido. Según entiendo, había 110 solicitudes de servicio antes que la mía, y debía dejar mi equipo. Lo único que pedí (honestamente, sigo sin comprender cómo un equipo GSM puede funcionar bien con un chip y con otro no, salvo que el chip esté mal en uno de los puntos), fue que me devolvieran mi equipo, dejarles el chip y que hicieran las pruebas. Lo hice en buena fe. Sin altisonancias. Sin levantamientos de voz, inclusive hasta ese punto.

Otro problema que estaba resolviendo es que un equipo, que ya no cuenta con número porque solicité que cambiaran mi número de tecnología (el número del chip que ahora no tiene servicio), de CDMA a GSM, y así fue hecho. El equipo por tanto debería por tanto volverse a activar, para darlo como regalo, por ejemplo, o porque quisiera venderlo. O porque se me pegara la gana, que para eso ya pagué. Y pues el sistema (su dichoso sistema que parece tener más errores de los que les gustaría reconocer) lo marca como “registrado en Tienda” (en stock disponible para venta, para el que no entienda qué significa).

Todo esto debía ser resuelto de manera puntual, supongo. Y debía ser resuelto de una manera que no afectara mayormente al usuario. Pero al final, porque no me daban alternativas (algo que siempre brindaron), pedí hablar con la gerente. Y fue la gerente quien, sin una disposición de atención, sino más bien como a quien sacan de su burbuja de zona de confort, llegó, me habló despectivamente, dijo que le grité, dijo que si volvía a gritar le llamaba al “policía” (un guardia de seguridad privada, en NINGÚN país es un policía) y yo le dije, sí, perdiendo los estribos porque no escuchó mis argumentos, también, que eso no era gritar, y le pregunté, en el mismo tono que ella (porque soy el cliente, porque al cliente NADIE le habla mal, licenciados) “eso no fue gritar ¿quiere saber lo que es gritar?”, y de repente me vi rodeado de los empleados varones del Centro de Atención y el “policía” desechable, además de decirle a la señorita que me atendía “devuélvele sus equipos al señor”.

110 personas, en un chat de atención, pueden ser hasta 8 horas, 10 horas, de espera. El centro de atención no tiene horario los domingos. O sea, que si bien me iba, el lunes recibiría mi equipo. Y por supuesto, NUNCA me dijeron que me llamarían.

Lamentablemente, creo que hay algo que ustedes no comprenden, y esto lo he mencionado en varios chats antes que este: se están peleando entre empresas por ganar el capital que significa el cliente, y no hacen nada por mantenerlo. Estoy harto, asqueado, y desilusionado del servicio que están brindándonos a los clientes de esta empresa. ¿Cómo es posible que prescindan de la satisfacción del cliente, cuando precisamente su argumento de ventas y publicidad es que son la mejor alternativa a lo previamente conocido, al “monopolio” que significa Telcel, y sobre todas estas cosas, a ser la empresa más avanzada tecnológicamente en este país? Es algo que ni el más tonto podrá aceptarles en breve.

Yo soy un hombre que gusta de resolver las cosas, y al día de hoy, su empresa no ha resuelto nada. Por eso me acerqué a un centro de atención. Por eso hoy me desesperé y decidí hacer público este caso. El tema del número que ustedes tienen secuestrado es de hace dos meses. Dos meses de estar comunicando un nuevo número y esperar que haya una respuesta de su parte.

Exijo, nuevamente, mi número de vuelta. En la posdata a esta carta tendrán mis dos números, y solamente requiero mis pines de portabilidad. No quiero que estén contactándome con promesas de un mejor servicio. Eso es como una promesa de amor eterno: no va a suceder. También quiero que pasen por los equipos de la discordia. Se los regalo; pero no quiero tirarlos ni llevarlos a una tienda. No: quiero que tengan el valor, la civilidad de acercarse al cliente y que el cliente les entregue esos equipos y les diga lo que les queda por escuchar. Aunque dudo de su parte que vayan siquiera a hacer lo primero que solicito, ya mucho menos lo segundo.

Quedo en espera de ustedes,

Miguel Villanueva

P.D. Número secuestrado: 55xxxx 6950, anteriormente en el chip 895xxxxxxxxxx688017F. Dicho chip venía en la compra del equipo Huawei Ideos con IMEI 352608xxxx6359, comprado en el Centro de Atención División del Norte. El número procedía del equipo Moto Q CDMA con serie Hex 0C1190A que ahora aparece en sistema como “registrado en tienda”. Se solicita PIN de portabilidad.

Número funcional aun: 55xxxx 1985, registrado al chip 89520xxxxxxxxxx5944F. Se solicita PIN de portabilidad.

Espero su llamada al número 55xxxx 1985, con la resolución a mi caso.

Esta carta quedará registrada PERMANENTEMENTE en el blog http://www.pimpompapas.com Y NO SERA ELIMINADA.

 

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
 

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}");

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
 

Quiroz, un joven faquir que entre cristales rotos se gana la vida
y con baños de agua oxigenada a diario cuida de ella lavando sus heridas.

Sus muchos y bellos tatuajes marcando el camino de sus promesas.
En la brecha, en camino al túnel, el tomó su rumbo a mi izquierda y yo, me quedé allí.

Busqué refugio en el siguiente portón y me quedé pensando…

… decidí que iba a escribir unas cuantas letras para mi.

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
 

Mi primer script funcional en python.
Siguiendo las enseñanzas del libro Learn python – the hard way, me encontré con un ejercicio donde se invita al lector a hacer sus propias cosas, scripts chiquitos que puedan ayudarle en algo.
Me animé y con gusto noté que no ha sido tiempo perdido aquél que he invertido en leer y practicar sobre los ejercicios de este libro. El cuál, por cierto, es muy bueno.

Y aquí les dejo mis “pininos” en python.


#!/usr/bin/env python
# coding: utf8
# author: Pedro [byteStriker] Navarro

import sys
import os

"""
Script para conectarme a los servers de MySQL porque soy muy huevon para escribir los comandos a pata.
"""

# Aquí defini la lista donde accedo a las conexiones, se pueden meter tantas como se deseén.
mysql_servers = ['mysql -uroot -proot -h localhost', 'mysql -uroot -proot -h otropinche.hostname.mx', 'mysql -uroot -proot -h www.google.com']
def conectar ( conexion_indice ):
	"""Conecta a la base de datos."""
	os.system(mysql_servers[conexion_indice])
	sys.exit(0);

def salir ():
	"""Te saca del script."""
	print("\nSaliendo del programita\n");
	sys.exit(0);

def seleccionar_conexion ( param_conexion = 0):
	"""Recibe el parametro seleccionado y conecta al server requerido."""  

	if 'q' == param_conexion:
		salir()

	if len(param_conexion) == 1 :

		try:
			#prueba si el parámetro (string) que le pasaste puede convertirse a entero
			opcion_selccionada = int(param_conexion)
			opcion_selccionada = opcion_selccionada - 1 #Le resto 1 para acceder bien a los índices de la lista
                        #Como python no tiene SWITCH tuve que usar el viejo truco del if elif else

			if opcion_selccionada == 0:
				print("Conectando a la opcion 1, [MySQL Alias 1]")
				conectar(opcion_selccionada)

			elif opcion_selccionada == 1:
				print("Conectando a la opcion 2, [MySQL Alias 2]")
				conectar(opcion_selccionada)

			elif opcion_selccionada == 2:
				print("Conectando a la opcion 3, [MySQL Alias 3]")
				conectar(opcion_selccionada)
			#Si el usuario la cagó e intentó pasarse de corneta, pues le pintamos cremas:
			elif param_conexion not in (1,2,3):
				print("No existe una conexion definida para la opcion ", opcion_selccionada);
				iniciar()

			else:
				print(opcion_selccionada + "no es una opcion valida")
				iniciar()

		#Aquí es donde se cachan las excepciones que arroja la evaluacion del try de arriba
		except:
			print("Utilice solo numeros.")
			iniciar()

	else:
		print("El programa solo acepta una opcion, esta debe ser un digito que represente una de las opciones mostradas")
		iniciar()

def iniciar():
	"""Muestra un listado de eaeas que permite conectarte a una base de datos porque eres muy huevon y no quieres escribir el comando completo"""
	print("Presiona el numero correspondiente al server de MySQL que quieres conectarte")

	print("[1] MySQL Alias 1")
	print("[2] MySQL Alias 2")
	print("[3] MySQL Alias 3")
	print("[q] Para salir")
	opcion = raw_input("Opcion> ")

	if( len(opcion) == 0 ):
		print("\n=====Opcion no registrada, intentalo de nuevo=====\n")
		iniciar()
	else:
		seleccionar_conexion(opcion)

iniciar();

¡Voilà, ya tenemos un script en python que funciona y hace mi vida más sencilla!

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
 

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.











com_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



Fecha

Como ya les había comentado previamente,

AQUÍ

pueden descargar el demo que funciona y toda la cosa.

Happy coding!

© 2011 Geekeandome Suffusion theme by Sayontan Sinha