Jul 21

Ajedrezenmadrid 4.0 – Trabajos en marcha

  • He creado una copia de ajedrezenmadrid.com en ajedrez8x8 (a día 22 de julio de 2019).
  • 21.07.2019 – Creo dos tablas en luismase_aem: tabla_torneos_8x8 y tabla_noticias_8x8 que son las tablas con las que voy a trabajar para incorporar las futuras mejoras.
  • 21.07.2019 – Cambio la cadena ajedrezenmadrid.com por ajedrez8x8.com en todos ficheros de la web. Para ello localizo la cadena ajedrezenmadrid.com con el programa grepWin:
    • .htaccess
    • application/config.php
    • application/views/calculadoraelo.php
    • application/views/calen_torneos.php
    • application/views/inicio.php
    • application/views/inicio2.php
    • application/views/modelo_aem.php
    • application/views/modelo_aem1.php
    • application/views/plantillas/cabecera.php
    • application/views/plantillas/cabecera_aem_gibraltar_benidorm.php
    • application/views/plantillas/cabecera_benidorm_aem_chessrecipes.php
    • application/views/plantillas/cabecera_benidorm_aem_gibraltar.php
    • application/views/plantillas/inicio_GigraltarJunior.php
    • application/views/plantillas/inicio_noticias.php
    • application/views/plantillas/lista_torneos_menu_lugardejuego.php
  • 21.07.2019 – Cambio los nobres de las tablas de ajedrezenmadrid.com a los de las tablas de ajedrez8x8.com
    • tabla_torneos -> tabla_torneos_8x8
      • application/models/noticia_model.php
      • application/models/torneos_model.php
    • tabla_noticias -> tabla_noticias_8x8
      • application/models/noticia_model.php
      • application/models/torneos_model.php
      • application/models/colaboraciones_model.php
  • 21.07.2019 – Ahora parece que tengo una versión que funciona igual que la original y sobre la que empezaré a trabajar los cambios previstos.

 

Jul 21

Nuevas versiones de Ajedrez en Madrid y AjedrezPlus

Voy a comenzar una renovación de mis dos web de ajedrez: Ajedrez en Madrid (ajedrezenmadrid.com) y AjedrezPlus (ajedrezplus.com).

Para ello voy a tratar de ir describiendo paso a paso las modificaciones que voy a hacer.

Es evidente que hay que realizar una planificación previa (qué es lo que quiero hacer), dar solución a las nuevas propuestas y probar las modificaciones.

Para ello voy a tratar de trabajar en paralelo con las versiones actuales. En el caso de Ajedrez en Madrid pretendo hacerlo en un dominio llamado ajedrez8x8.com. Mientras que en el caso de AjedrezPlus la idea es trasladar el hosting a otro servidor y una vez allí acometer las modificaciones de la web.

Algunas de las acciones que hay que realizar en Ajedrez en Madrid:

  • Cambiar mysql a mysqli (tal vez cambiar la versión de Codeigniter de 2.0 a 3.0 ó incluso a 4.0 que está próxima a salir).
  • Cambiar el código de torneos de 8 a 10 posiciones, incluyendo en las cuatro primeras posiciones el año completo, lo que permitirá incluir torneos anteriores al año 2000).
  • Tratar de generar a partir de los torneos las noticias, lo que implicará tablas de rondas y clasificaciones específicas. Esta será una tarea compleja, pero que si la saco adelante reduciré el trabajo y daré más vistosidad a la web.
Abr 20

Nuevas tablas en AeM

Con la intención de mejorar el contenido de Ajedrez en Madrid, se han añadido tres nuevas tablas a las ya existentes:

  • tabla_clasificaciones
  • tabla_rondas
  • tabla_cronicas

tabla_clasificaciones

Columna Tipo Nulo Predeterminado
cdgo_torneo varchar(8) No
cdgo_subtorneo varchar(9) No
nombre_subtorneo varchar(100) No
clasificacion_pre text No
rondas_pre mediumtext No
participa_pre text No
clasificacion_table text No

Índices

Nombre de la clave Tipo Único Empaquetado Columna
PRIMARY BTREE No cdgo_subtorneo
cdgo_subtorneo BTREE No No cdgo_subtorneo

tabla_rondas

Columna Tipo Nulo Predeterminado
cdgo_torneo varchar(8) No
cdgo_subtorneo varchar(9) No
cdgo_ronda varchar(12) No
nombre_ronda varchar(10) No
texto_ronda text No

Índices

Nombre de la clave Tipo Único Empaquetado Columna
PRIMARY BTREE No cdgo_ronda
cdgo_ronda BTREE No No cdgo_ronda

tabla_cronicas

Columna Tipo Nulo Predeterminado
cdgo_torneo varchar(8) No
cdgo_subtorneo int(11) No
cdgo_cronica varchar(12) No
tipo_cronica enum(‘Ronda’, ‘Final’, ‘Previa’) No Ronda
cdgo_ronda varchar(12) No
pdf_ronda varchar(100) No

Índices

Nombre de la clave Tipo Único Empaquetado Columna
PRIMARY BTREE No cdgo_cronica
cdgo_subtorneo BTREE No No cdgo_subtorneo
Feb 29

Reutilizar un array en una vista (2)

Una vez resuelto el problema sobre la reutilización en una vista de un array de datos, he de puntualizar que esa no es la manera «correcta» de hacerlo con el sistema MVC, ya que en la vista no debe haber lógica, sino que tiene que ser el controlador quien proporcione tal información.

En el caso que nos ocupa lo correcto es que el controlador haga una nueva llamada a la función del modelo para obtener de nuevo los datos del array. Se que parece un poco más lento pero es lo que hay que hacer para que en la vista no haya lógica de programación.

De esta manera en el controlador habría algo así:

//pido las partidas de un torneo $id
$partidasTorneo = $this->Partidas_model->dame_partidas_torneo($id);
$partidasTorneo2 = $this->Partidas_model->dame_partidas_torneo($id);

//creo el array con el código de torneo y las partidas del torneo para la vista
$data = array (‘cdgotorneo’ => $id, ‘nombretorneo’ => $nombreTorneo, ‘rs_par’ => $partidasTorneo, ‘rs_par2’ => $partidasTorneo2, ‘rs_tor’ => $datosTorneo, ‘tor_exi’ => $torneosFinal);

De tal manera que en la vista utilizo $rs_par para la primera utilización de los datos, y luego utilizo $rs_par2 para utlizar los mismos datos por segunda vez.

Feb 27

Reutilizar un array en una vista

Tras enviar un array con los datos de una base de datos y recorrerlos en la vista para poder visualizarlos, tuve la necesidad de volver a utilizar ese array en la misma vista.

En principio pensé que volviendo a utilizar el array recibido era suficiente, pero no es así. Al parecer una vez terminado de recorrer, bien con un foreach o un while, el puntero del array no vuelve a funcionar.

Esto me proporcionó un gran dolor de cabeza hasta que encontré una solución. Posicionar el puntero en el elemento 0 (cero) del array mediante $rs_par->data_seek(0), y entonces pude volver a utilizar el array de nuevo.

Parecerá sencillo, pero me tiré dos días hasta que encontré la solución. Eso sí, aprendí algunas cosas de las array y su manejo con PHP.

// primera utilización del array $rs_par

while ($fila = mysqli_fetch_array($rs_par)) {…}

// segunda utilización del array $rs_par

$rs_par->data_seek(0);
while ($fila = mysqli_fetch_array($rs_par)) {…}

Feb 09

Valores devueltos por Mysqli

Un problema que me ha costado mucho solucionar ha sido entender el funcionamiento de mysqli.

Veamos los distintos conceptos:

mysqli_query — Realiza una consulta a la Base de Datos

Si no devuelve resultados es que se trata de consultas de creación, borrado, inserción y actualización en la base de datos. De momento eso no se tratará en este artículo.

Cuando devuelve resultados esta consulta se ejecutará acompañada con una sentencia SELECT sobre la base de datos.

En ese momento pueden ocurrir dos cosas, que devuelva datos o que no encuentre datos.

Si no encuentra datos devolverá un error, por eso cada vez que hacemos una consulta con SELECT a la base de datos hay que preguntar por un posible error.

Yo utilizo la siguiente secuencia en mis modelos:

$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

//Indicar a la conexión de mysqli que use la codificacion UTF8 ¡¡¡MUY IMPORTANTE!!!
mysqli_set_charset($mysqli,»utf8″);

if ($mysqli->connect_errno) {
echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;
}

Si hay resultados es donde he encontrado más dificultad para entender como se tratan los mismos.

El resultado es un conjunto de filas de la base de datos que cumplen la condición de la SELECT.

Los datos recibidos se muestran con distintos métodos.

Pongamos el ejemplo de una consulta en la que queremos obtener un único dato. El ejemplo es obtener de la tabla torneos el nombre de un torneo en concreto.

$resultado4 = $mysqli->query(«SELECT mt_torneo FROM torneos WHERE mt_cdgo = ‘$id'»);

$linea = mysqli_fetch_array($resultado4);

return $linea[«mt_torneo»];

En $resultado4 llega un array con sólo una fila de la base de datos y con un solo campo mt_torneo, pero para poder tratarlo como un dato individual hay que extraerlas del array mediante mysqli_fetch_array($resultado4) y luego acceder al dato mediante $linea[«mt_torneo»].


Si lo que se obtiene es un numero indeterminado de filas de la base de datos entonces lo que hay que hacer es rellenar un array que contendra todas las filas obtenidas.

Por ejemplo como la siguiente secuencia en uno de mis modelos:

$resultado = $mysqli->query(«SELECT * FROM partidas WHERE mp_cdgotorneo = ‘$id’ ORDER BY mp_ronda ASC «);

$resultado = $mysqli->query(«SELECT * FROM partidas WHERE mp_cdgotorneo = ‘$id’ ORDER BY mp_ronda ASC «);

while ($fila = mysqli_fetch_array($resultado)) {
echo «Torneo: » . $fila[‘mt_anyo’] . » – » . $fila[‘mt_torneo’] . «<br />»;
}

En $resultado llega un array con varias filas de la base de datos con todos sus campos (columnas) pero para poder tratarlo como datos hay que extraerlo del array mediante mysqli_fetch_array($resultado) y luego acceder a los dato mediante un while que recorre el array y podemos referenciar los campos de cada fila usando como indice el nombre del campo.

Feb 08

Conversion varchar a float

He necesitado cambiar en una tabla unos valores que estaban como tipo varchar a tipo float.

En concreto era una columna de puntuaciones de resultados que tenían decimales, pero que estaba grabada como varchar (3).

Para hacer la conversión correctamente he tenido que asegurarme de quitar los signos + que llevaban algunas puntuaciones. No así con los signos – que han quedado como estaban, porque la conversión los interpreta correctamente como negativos.

También he tenido que asegurarme de que todos los decimales venían con punto (.) y no con coma (,), para ello he hecho un update a la tabla modificando en el campo correspondiente todas las comas por puntos.

A continuación simplemente he ido a la estructura de la tabla y he cambiado el tipo de la columna correspondiente. En este caso lo he cambiado a tipo Float con longitud 2,1 que significa que tiene dos dígitos, uno entero y otro decimal, dado que en este campo sólo podían venir los valores 0.0 0.5 y 1.0.

Para otro caso en el que los valores son mayores he utilizado un tipo Float con longitud 4,2 lo que me permite valores de 99.99 hasta 00.00 ¡incluyendo los negativos!.

Feb 06

Inicio de webRepertorio4 con CodeIgniter

Funcionamiento

El controlador (inicio.php) hace las llamadas necesarias al modelo (torneos_model) para recopilar los datos necesarios para lanzar la vista (inicio.php).

La vista necesita los siguientes datos para mostrar la página de inicio:

  • la fecha del día (fecha_hoy)
  • el número de registros de la tabla torneos (num_tor)
  • el número de registros de la tabla partidas (num_par)
  • una tabla con los años en los que ha habido torneos, para cargar el menú lateral sólo con esos años (tor_exi).

El controlador pide los datos que necesita la vista al modelo

  • $numeroTorneos = $this->Torneos_model->dame_numero_torneos();
  • $numeroPartidas = $this->Torneos_model->dame_numero_partidas();
  • $torneosFinal = $this->Torneos_model->dame_torneos_existen();

y se los envía a la vista en un array de datos

  • $datos = array(‘fecha_hoy’ => $fecha_hoy, ‘num_tor’ => $numeroTorneos, ‘num_par’ => $numeroPartidas, ‘tor_exi’ => $torneosFinal);

El modelo realiza los cálculos necesarios mediante funciones para davolver los datos que le pide el controlador.

  • function dame_numero_torneos()
  • function dame_numero_partidas()
  • function dame_torneos_existen()

Los documentos de Inicio de webRepertorio4

Controlador: inicio.php

function index(){
//cargo el helper de url, con funciones para trabajo con URL del sitio
$this->load->helper(‘url’);

//cargo el helper de date, con funciones para trabajo con fechas del sitio
$this->load->helper(‘date’);
$fecha_ahora = now();

//preparando el dato de fecha de referencia para la página de inicio
$format = ‘DATE_W3C’;
$fecha = standard_date($format, $fecha_ahora);

//ponemos en $fecha_hoy la fecha en formato dd-mm-AAAA
$fecha_hoy = substr($fecha, 8, 2) . ‘-‘ . substr($fecha, 5, 2) . ‘-‘ . substr($fecha, 0, 4);

//ponemos en $fecha_tor la fecha en formato AAAA-mm-dd
$fecha_tor = substr($fecha, 0, 4) . ‘-‘ . substr($fecha, 5, 2) . ‘-‘ . substr($fecha, 8, 2);

//$fecha_partidas = date(‘Y-m-d’,strtotime(‘+7 days’, strtotime($fecha)));
$fecha_inipartidas = date(‘Y-m-d’,strtotime(‘+7 days’, strtotime($fecha)));
$fecha_finpartidas = date(‘Y-m-d’,strtotime(‘-7 days’, strtotime($fecha)));

//cargo el modelo de torneos
$this->load->model(‘Torneos_model’);

//preparando el cálculo del número de torneos en la base de datos mispartidas
$numeroTorneos = $this->Torneos_model->dame_numero_torneos();

//preparando el cálculo del número de partidas en la base de datos mispartidas
$numeroPartidas = $this->Torneos_model->dame_numero_partidas();

//preparar una tabla con sólo los años en los que existen torneos

$torneosFinal = $this->Torneos_model->dame_torneos_existen();

//recopilo en un array los datos de envío a la vista
$datos = array(‘fecha_hoy’ => $fecha_hoy, ‘num_tor’ => $numeroTorneos, ‘num_par’ => $numeroPartidas, ‘tor_exi’ => $torneosFinal);

//cargo la vista pasando el array con los datos recopilados
$this->load->view(‘inicio’, $datos);
}

Modelo: torneos_model.php

class Torneos_model extends CI_Model {

function __construct(){
parent::__construct();
}

function dame_numero_torneos(){
$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);
//Indicar a la conexión de mysqli que use la codificacion UTF8 ¡¡¡MUY IMPORTANTE!!!
mysqli_set_charset($mysqli,»utf8″);

if ($mysqli->connect_errno) {
echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;
}

//$resultado = $mysqli->query(«SELECT mt_cdgo FROM torneos ORDER BY mt_cdgo ASC»);
$resultado = $mysqli->query(«SELECT * FROM torneos»);
return mysqli_num_rows($resultado);

// Cerrar la conexión.
mysqli_close($mysqli);

}

// ————————————————————————————————-

function dame_numero_partidas(){
$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

//Indicar a la conexión de mysqli que use la codificacion UTF8 ¡¡¡MUY IMPORTANTE!!!
mysqli_set_charset($mysqli,»utf8″);

if ($mysqli->connect_errno) {
echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;
}

$resultado2 = $mysqli->query(«SELECT * FROM partidas»);
return mysqli_num_rows($resultado2);

// Cerrar la conexión.
mysqli_close($mysqli);

}

// ————————————————————————————————-

function dame_torneos_anyo($id){
// $id viene en formato aaaa
$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

//Indicar a la conexión de mysqli que use la codificacion UTF8 ¡¡¡MUY IMPORTANTE!!!
mysqli_set_charset($mysqli,»utf8″);

if ($mysqli->connect_errno) {
echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;
}

$resultado3 = $mysqli->query(«SELECT * FROM torneos WHERE mt_anyo = ‘$id’ ORDER BY mt_cdgo ASC»);
return $resultado3;

// Cerrar la conexión.
mysqli_close($mysqli);

}

// ————————————————————————————————-

function dame_torneos_existen(){
$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

//Indicar a la conexión de mysqli que use la codificacion UTF8 ¡¡¡MUY IMPORTANTE!!!
mysqli_set_charset($mysqli,»utf8″);

if ($mysqli->connect_errno) {
echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;
}

// Se seleccionan de la base los torneos comprendidos entre 1987 y 2017

$resultado3 = $mysqli->query(«SELECT * FROM torneos WHERE ((mt_anyo > 1987) AND (mt_anyo < 2017))»);

// Se crea una tabla de 69 elementos conteniendo cada elemento un año desde 1988 hasta 2056

for ($i = 1; $i <= 69; $i++) {
$anyo[$i]=$i + 1987;
}

// inicializar tabla de años ($anyoexiste) que tienen torneos con valor cero
for ($i = 1; $i <= 69; $i++) {
$anyoexiste[$i]=0;
}

// contabilizamos el número de torneos existentes en cada año en la tabla $anyoexiste

$conta_mad = 0;
while ($fila = mysqli_fetch_array($resultado3)) {
$conta_mad += 1;
//echo «Torneo » . $conta_mad . «: » . $fila[‘mt_torneo’] . «
«;

for ($i = 1; $i <= 69; $i++) {
if ($anyo[$i] == $fila[‘mt_anyo’]) {
$anyoexiste[$i]++;
//echo «paso por este año» . $fila[‘mt_anyo’] . » – » . $i . » – » . $anyoexiste[$i] . «
«;
break;
}
}
}

// creamos una tabla ($torneosfinal) con aquellos años que SI tienen torneos en la tabla $anyoexiste
$k = 0;
for ($i = 1; $i <= 69; $i++) {
if ($anyoexiste[$i] |= 0) {
$k++;
$torneosfinal[$k] = $anyo[$i];
//echo $i . » – » . $anyo[$i] . » – » . $anyoexiste[$i] . «
«;
}
}
return $torneosfinal;

// Cerrar la conexión.
mysqli_close($mysqli);

}

Vista: Inicio.php

<!DOCTYPE html>
<head>
<meta charset=»utf-8″ />
<meta name=»viewport» content=»width=device-width, initial-scale=1.0″ />
<title>WebReperetorio4</title>
<?php include ‘includes/head0.inc’ ?>
</head>
<body>
<div id=»wrapper»>
<!– NAV TOP  –>
<?php include ‘includes/menu_superior0.inc’ ?>
<!– /. NAV TOP  –>

<!– Inicio Nav Lateral  –>
<?php include ‘includes/menu_lateral0.inc’ ?>
<!– Fin Nav Lateral  –>

<!– Inicio Page-wrapper –>
<div id=»page-wrapper» >

<!– Inicio Page Inner –>
<div id=»page-inner»>
<div class=»row»>
<div class=»col-md-12″>
<h2>Mi historial de Ajedrez</h2>
<h5>Bienvenido a la página del historial de mi ajedrez. </h5>
</div>
</div>
<!– /. ROW  –>
<hr />
<div class=»row»>
<div class=»col-md-6 col-sm-6 col-xs-6″>
<div class=»panel panel-back noti-box»>
<span class=»icon-box bg-color-red set-icon»>
<i class=»fa fa-envelope-o»></i>
</span>
<div class=»text-box» >
<p class=»main-text»><?php  echo $num_tor . » Torneos»; ?> </p>
<p class=»text-muted»>Torneos</p>
</div>
</div>
</div>
<div class=»col-md-6 col-sm-6 col-xs-6″>
<div class=»panel panel-back noti-box»>
<span class=»icon-box bg-color-green set-icon»>
<i class=»fa fa-bars»></i>
</span>
<div class=»text-box» >
<p class=»main-text»><?php  echo $num_par . » Partidas»; ?></p>
<p class=»text-muted»>Partidas</p>
</div>
</div>
</div>
</div>
<!– /. ROW  –>
<hr />
<?php
echo «Estos son los resultados <br />»;
echo $fecha_hoy . «<br />»;
echo $num_tor . » torneos<br />»;
echo $num_par . » partidas<br /><br />»;

$k = count($tor_exi);
echo «k = » . $k;
echo «<br /><br />»;

for ($i = 1; $i <= $k; $i++) {
echo «tor_exi(» . $i . «) – » . $tor_exi[$i] . «<br />»;
}

?>

</div>
<!– /. PAGE INNER  –>
</div>
<!– /. PAGE WRAPPER  –>
</div>
<!– /. WRAPPER  –>

<!– SCRIPTS -AT THE BOTOM TO REDUCE THE LOAD TIME–>
<?php include ‘includes/scripts0.inc’ ?>

</body>
</html>

Vista: menu_lateral0.inc

<nav class=»navbar-default navbar-side» role=»navigation»>
<div class=»sidebar-collapse»>
<ul class=»nav» id=»main-menu»>
<li class=»text-center»>
<img src=»assets/img/maseda_luis5_80.jpg» class=»user-image img-responsive»/>
</li>

<li>
<?php
echo ‘<a class=»active-menu»  href=»‘ . site_url(») . ‘»><i class=»fa fa-home fa-2x»></i> Inicio</a>’;
?>
</li>
<?php
$k = count($tor_exi);

for ($i = $k; $i >= 1; $i–) {
//for ($i = 1; $i <= $k; $i++) {
if ($tor_exi[$i] |= 0) {
echo ‘<li>’;
echo ‘<a href=»‘ . site_url(‘/torneosanyo/muestraanyo/’ . $tor_exi[$i]) . ‘»><i class=»fa fa-sitemap fa-2x»></i> ‘ . $tor_exi[$i] . ‘<span class=»fa arrow»></span></a>’;
echo ‘<li>’;
}
}
?>

</ul>

</div>

</nav>

Feb 03

Contando registros con mysqli (mysqli_num_rows)

Los documentos de Inicio de webRepertorio4

Controlador

$this->load->model(‘Torneos_model’);

//preparando el cálculo del número de torneos en la base de datos mispartidas

$numeroTorneos = $this->Torneos_model->dame_numero_torneos();

//preparando el cálculo del número de partidas en la base de datos mispartidas

$numeroPartidas = $this->Torneos_model->dame_numero_partidas();

//recopilo en un array los datos de envío a la vista

$datos = array(‘fecha_hoy’ => $fecha_hoy, ‘num_tor’ => $numeroTorneos, ‘num_par’ => $numeroPartidas);

//cargo la vista pasando el array con los datos recopilados

$this->load->view(‘inicio’, $datos);

Modelo

function dame_numero_torneos(){

// Conexión a la base de datos

$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

if ($mysqli->connect_errno) {

echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;

}

//Consulta a la base de datos

$resultado = $mysqli->query(«SELECT * FROM torneos»);

return mysqli_num_rows($resultado);

}

function dame_numero_partidas(){

// Conexión a la base de datos

$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

if ($mysqli->connect_errno) {

echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;

}

//Consulta a la base de datos

$resultado2 = $mysqli->query(«SELECT * FROM partidas»);

return mysqli_num_rows($resultado2);

}

Vista

echo «Estos son los resultados </br >»;
echo $fecha_hoy . » </br >»;
echo $num_tor . » torneos</br >»;
echo $num_par . » partidas</br >»;

Ago 31

Primera página con CodeIgniter

Modificaciones en application\config

database.phpautoload.phproutes.phpconfig.php
...
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'aem';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
...
...
$autoload['libraries'] = array('database');
...
...
$route['default_controller'] = "Torneos";
...
...
$config['base_url'] = 'http://localhost/aem3';
...

Páginas del modelo MVC

controllers/torneos.phpviews/home.phpmodels/torneo_model.php
<?php
class Torneos extends CI_Controller {
   function index(){
      //cargo el helper de url, con funciones para trabajo con URL del sitio
      $this->load->helper('url');

      //cargo el modelo de artículos
      $this->load->model('Torneo_model');

      //pido los ultimos torneos al modelo
      $ultimosTorneos = $this->Torneo_model->dame_ultimos_torneos();

      //creo el array con datos de configuración para la vista
      $datos_vista = array('rs_torneos' => $ultimosTorneos);

      //cargo la vista pasando los datos de configuacion
      $this->load->view('home', $datos_vista);
   }
}
?>
<html>
<head>
  <meta charset="UTF-8" />
  <title>Portada de mi sitio</title>
</head>
<body>
<h1>Bienvenido a mi web</h1>
<p>Estos son los &uacute;ltimos torneos publicados.</p>
<?php
while ($fila = mysql_fetch_array($rs_torneos)){
   echo '<p>';
   echo '<a href="' . site_url('/torneos/muestra/' . $fila['cdgo_torneo']) . '">' . $fila['nombre_torneo'] . '</a>';
   echo '</p>';
}
?>

</body>
</html>
<?php
class Torneo_model extends CI_Model {

   function __construct(){
      parent::__construct();
   }

   function dame_ultimos_torneos(){
      $ssql = "select * from tabla_torneos order by cdgo_torneo desc limit 10";
      return mysql_query($ssql);
   }
}
?>

 

controllers/torneos.php
<?php
class Torneos extends CI_Controller {
   function index(){
      //cargo el helper de url, con funciones para trabajo con URL del sitio
      $this->load->helper('url');

      //cargo el modelo de artículos
      $this->load->model('Torneo_model');

      //pido los ultimos torneos al modelo
      $ultimosTorneos = $this->Torneo_model->dame_ultimos_torneos();

      //creo el array con datos de configuración para la vista
      $datos_vista = array('rs_torneos' => $ultimosTorneos);

      //cargo la vista pasando los datos de configuacion
      $this->load->view('home', $datos_vista);
   }
}
?>

Un controlador en CodeIgniter es un archivo que contiene el código de una clase, de programación orientada a objetos, que colocamos en un directorio específico del esquema de carpetas de nuestro sitio. Tiene un nombre cualquiera, que se asociará con una URL de nuestra aplicación web.

Por ejemplo, esta podría ser una URL de nuestra aplicación:

midominio.com/index.php/torneos

En la URL anterior podemos ver que la palabra «torneos» determina la página que queremos ver dentro de nuestra aplicación. Pues bien, para poder atender esta solicitud nosotros vamos a tener que crear un archivo llamado torneos.php (el controlador) dentro del directorio que aloja los controladores de nuestra aplicación.

Por tanto, cuando CodeIgniter detecta una URL como esta, intentará acceder al archivo articulos.php, para cargarlo, procesarlo y de ese modo mostrar la página con los contenidos de esta sección.

Cuando ese controlador no se encuentre entre los archivos de controladores de CodeIgniter, simplemente se mostrará un error 404 de página no encontrada. Si se encontró el controlador, como se decía, se carga y se procesa para mostrar la página.

Los controladores en CodeIgniter se guardan en la carpeta «system/application/controllers/», que se encuentra dentro de los archivos de CodeIgniter.

Analizando el controlador

  • En nombre del archivo de controlador, en este caso torneos.php, va en minúsculas.
  • El nombre de la clase que implementa el controlador se tiene que llamar igual que el nombre del archivo, pero fijaros que tiene obligatoriamente la primera letra en mayúscula. Por eso aparece como class Articulo extends Controller.
  • Todos los controladores tienen que extender la clase «Controller» (que también tiene la primera letra «C» en mayúscula), que está creada dentro de CodeIgniter y en principio no necesitamos modificarla para nada.

Una vez creado el archivo, podemos acceder con el navegador al controlador, con una URL como esta:

http://luismaseda.com/aem3/index.php/torneos

Un momento ¿Qué significa extender una clase?

class Torneos extends CI_Controller

Frecuentemente son necesarias clases con variables y funciones semejantes a los de otra clase ya existente. De hecho, es una buena práctica definir una clase genérica que pueda ser utilizada en todos sus proyectos y adaptar esta clase a las necesidades de cada uno de sus proyectos específicos.

Para facilitar esto, las clases pueden ser extensiones de otras clases. La clase extendida (Torneos) tiene todas las variables y funciones de la clase base (CI_Controller) y aquello que se agregue en la definición extendida (Torneos). No es posible disminuir una clase, es decir, remover la definición de cualquier función o variable existente. Una clase extendida siempre es dependiente de una sóla clase base, es decir, la herencia múltiple no está soportada. Las clases son extendidas utilizando la palabra clave ‘extends’.

En el caso de class Torneos extends CI_Controller se define una clase llamada Torneos que contiene todas las variables y funciones de CI_Controller más una función adicional $index().

Hemos colocado una función index(), que es la que se llamará cuando se acceda a este controlador tal cual. Dentro de index estamos invocando una vista.

Nota:
¡Las clases deben de estar definidas antes de ser utilizadas! Si se desea que la clase Torneos extienda a la clase CI_Controller, se tendrá que definir primero la clase CI_Controller. Si se quiere crear otra clase llamada Calendario basada en la clase Torneos se tiene que definir primero Torneos.

Resumiendo: el orden en que las clases se definen es importante.

Controlador por defecto

Hay que hablar sobre el controlador por defecto, que es el que se invoca en CodeIgniter cuando no se especifica ningún nombre de directorio y por tanto ningún controlador, en la siguiente URL:
midomino.com/index.php/

O bien en esta otra:

midominio.com/

Esto, que sería la home de la aplicación CodeIgniter, y eventualmente la home del dominio, si es que hemos instalado el framework en la raíz del directorio de publicación, invoca también un controlador, que es el controlador por defecto.

El nombre del controlador predeterminado (Default Controller) puede ser variable, siendo el desarrollador el encargado de configurarlo en uno de los archivos de configuración de CodeIgniter, que se encuentra en el fichero «application/config/routes.php».

En ese archivo simplemente tenemos que buscar el valor $route[‘default_controller’] y asignarle el nombre de la clase donde está el controlador que queramos que se invoque. Como es el nombre de una clase de un controlador tendremos que escribirlo con la primera letra en mayúscula.

$route[‘default_controller’] = ‘Torneos’;

Si observamos el valor de esta variable de configuración, tal como está en el momento inicial, después de la instalación de CodeIgniter, veremos que el controlador por defecto está en la clase «Welcome», archivo application/controllers/welcome.php

Ahora, si ponemos la siguiente URL en nuestro navegador

http://luismaseda.com/aem3/

tendrá el mismo funcionamiento que poniendo:

http://luismaseda.com/aem3/index.php/torneos

Importante: Estamos diciendo que los controladores tienen funciones, pero en realidad deberíamos llamarles métodos, porque los controladores son clases y las clases tienen métodos y no funciones.


views/home.php
<html>
<head>
  <meta charset="UTF-8" />
  <title>Portada de mi sitio</title>
</head>
<body>
<h1>Bienvenido a mi web</h1>
<p>Estos son los &uacute;ltimos torneos publicados.</p>
<?php
while ($fila = mysql_fetch_array($rs_torneos)){
   echo '<p>';
   echo '<a href="' . site_url('/torneos/muestra/' . $fila['cdgo_torneo']) . '">' . $fila['nombre_torneo'] . '</a>';
   echo '</p>';
}
?>

</body>
</html>

Los controladores deciden qué hacer cuando se recibe una solicitud y las vistas deciden cómo mostrar los resultados. Por decirlo de otra forma, la lógica de nuestra aplicación residirá en el controlador y la vista mantendrá el aspecto de nuestra página, el diseño de la página que se mostrará al usuario.

Una vista se carga en el controlador mediante:

$this->load->view(‘nombreDeLaVista’);

En ‘nombreDeLaVista’ tendremos que indicar el nombre del archivo donde hemos guardado la vista, pero sin el «.php». En nuestro controlador se hizo mediante:

$this->load->view(‘home’, $datos_vista);

en la que también se cargó una variable con datos para ser utilizados por la vista: $datos_vista

Podemos ver cómo hacemos un recorrido a los registros de últimos torneos traídos desde la base de datos con ayuda del modelo y enviados a la vista por medio del controlador. Además, vemos que se está utilizando la función site_url() que pertenece al helper «url» que habíamos cargado en el controlador.

El resultado nos muestra los últimos torneos que se habían cargados en la base de datos, en la tabla_torneos, con un enlace a varias páginas, donde se muestra cada uno de los torneos (no creadas todavía).

models/torneo_model.php
<?php
class Torneo_model extends CI_Model {

   function __construct(){
      parent::__construct();
   }

   function dame_ultimos_torneos(){
      $ssql = "select * from tabla_torneos order by cdgo_torneo desc limit 10";
      return mysql_query($ssql);
   }
}
?>

Los modelos en el MVC son los módulos que tienen como responsabilidad el acceso y control de los datos que hay en bases de datos y mantienen encapsuladas todas las particularidades y complejidades de los accesos a las tablas para realizar cualquier tipo de operación.

En el patrón MVC, los modelos son una de las partes fundamentales, pero en el caso de CodeIgniter, su uso es sólo opcional. El desarrollador es el responsable de decidir si le viene bien el uso de los modelos o si prefiere realizar sus aplicaciones haciendo cualquier tipo de operación sobre la base de datos en los propios controladores.

Los modelos en la práctica son clases, de programación orientada a objetos, que tienen sus métodos o funciones, a los que se puede invocar desde los controladores para hacer operaciones con la base de datos.

Los modelos en CodeIgniter se construyen extendiendo la clase CI_Model y tenemos que nombrarlos con la primera letra en mayúsculas. Dentro del modelo que estamos creando tenemos que definir obligatoriamente un constructor, donde tenemos que hacer una llamada al constructor de la clase de la que hereda (clase parent, llamada __construct).

function __construct(){
parent::__construct();
}

Un modelo se carga en el controlador mediante:

$this->load->model(‘Nombre_model’);

Si queremos cargar varios modelos de una sola vez, podemos hacerlo pasando un array con todos los modelos que deseamos cargar:

$this->load->model(array(‘Torneo_model’,’Noticia_model’));

En nuestro controlador se hizo mediante:

$this->load->model(‘Torneo_model’);

Una vez cargado un modelo, sus métodos para el acceso a los datos estarán disponibles en nuestro controlador, a través del propio objeto controlador, el nombre del modelo que queremos accionar y la función que queremos invocar dentro del modelo.

$this->load->model->funcion_del_modelo();

database.php
...
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'aem';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
...
autoload.php
...
$autoload['libraries'] = array('database');
...
routes.php
...
$route['default_controller'] = "Torneos";
...
config.php
...
$config['base_url'] = 'http://localhost/aem3';
...