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.
=$comentario->com_comentario;?>
=$comentario->com_autor?>
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,
AQUÍ
pueden descargar el demo que funciona y toda la cosa.
Happy coding!