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';
...

Ago 24

Empezando con CodeIgniter

Pero ¿No estaba trabajando en la nueva web de Ajedrez en Madrid?

Bueno, la verdad es que actualmente tengo demasiadas cosas en la cabeza y es necesario poner un poco de orden en todas ellas si no quiero que esto termine en un caos.

Tengo en mente el cambio de servidor, eso implica migrar toda la web de Ajedrez en Madrid a PHP, lo que significa que tengo que aprender a utilizar este lenguaje de programación.

También hay que mejorar el diseño de la página y la programación del sitio, en este sentido de nuevo interviene el saber manejar el PHP, pero además hay que añadir el conocimiento de HTML5, el CSS3 y el Javascript. Así que me tengo que reciclar en profundidad porque, aunque sé algo de HTML y CSS, el Javascript que conozco es de «andar por casa» y el ASP ya no me va a servir de mucho en esta aventura.

Y por si no fuera suficiente con toda esta ensalada de siglas, además entra en escena mi obsesión por hacer las cosas bien.

Si tienes que hacer una cosa ¿por qué no hacerla lo mejor posible?

¿Y eso qué significa?

Pues significa que si quiero combinar todas estas cosas lo tengo que hacer de una forma ordenada y organizada, no de cualquier manera. Y ahí entran en escena las herramientas de desarrollo de aplicaciones, o frameworks. Estas herramientas tienen como objetivo ayudar al programador a realizar sus aplicaciones en un entorno «controlado» y con una metodología específica que proporciona un resultado final más organizado desde el punto de vista del desarrollador y más eficaz para el usuario.

Pero frameworks hay unos cuantos ¿Cual elegir?

Un amigo mío se decantó por el Symphony. Tardo algún tiempo en aprender a utilizarlo, pero como es un gran programador, cuando consiguió dominarlo las aplicaciones le empezaron a salir como churros, incluso las más complejas. Yo estuve valorando esta opción, por un lado tenía la ventaja del soporte personal de mi amigo, pero me pareció que para el uso que yo quería dar a mi proyecto era como «matar moscas a cañonazos«, y si además añadimos que la curva de aprendizaje es lenta, especialmente para alguien como yo con un coeficiente intelectual de lo más normalito, lo tuve que descartar y pensar en otras soluciones.

Así que empecé a buscar entornos de trabajo ligeros, con curva de aprendizaje rápida y que no dieran muchos problemas en el lado del servidor. Ésto último es un factor importante porque no es lo mismo trabajar con el localhost de tu ordenador que trabajar con un servidor de pago, ya que éstos tienen normalmente sus peculiaridades propias que te pueden permitir unos hacer ciertas cosas y otros no, y una de las razones por las que quiero rediseñar la web de Ajedrez en Madrid es que, si una vez instalada en un servidor PHP, la tengo que migrar a otro servidor, no tenga problemas en el lado de los servidores.

Después de mucho analizar artículos y comentarios en la web me quedé con dos candidatos: Laravel 4 y CodeIgniter.

Los dos son ligeros y su aprendizaje es más asumible que el de los otros framewroks.

Según algunos expertos Laravel 4 es en la actualidad mejor producto que CodeIgniter. Sin embargo a la hora de trabajar con ellos parece ser mucho más sencillo de instalar en el servidor el CodeIgniter, además de algunas otras ventajas que comentaré más adelante.


CodeIgniter es un entorno de trabajo para el desarrollo de páginas web dinámicas en PHP que facilita el desarrollo de proyectos ecritos en este lenguaje.

CodeIgniter es un framework escrito en PHP que se caracteriza por su bajo impacto en el servidor y el elevado número de librerías que incluye para trabajar con distintos objetos: calendario, bases de datos, correo electrónico, manipulación de imágenes, FTP, lenguaje, tablas, sesiones, compresión ZIP, etcétera.

A diferencia de otros frameworks, CodeIgniter cuenta con una documentación excelente que permite conocer todos los secretos de este entorno de trabajo. La cantidad de clases definidas por defecto, unido a su interfaz clara y facilidad de acceso ha hecho que CodeIgniter sea avalado incluso por Rasmus Lerdorf, creador del lenguaje PHP.

Codeigniter está basado en el sistema MVC (Modelo Vista Controlador – Model View Controller) para el desarrollo de aplicaciones web. Este sistema permite a los programadores Web mejorar la forma de trabajar y hacerlo a mayor velocidad.

¿Qué es MVC?

El Modelo Vista Controlador (MVC) es un estilo de programación en el que la aplicación está dividida en 3 capas:

  • Modelo (Model): Es dónde se procesan y obtienen los datos, la conexión con la base de datos. El Modelo representa una base de datos, tabla ó registro, así como sus relaciones con otras tablas ó registros. Los Modelos contienen las reglas para las validación de datos. Estas reglas son aplicadas cuando en el Modelo se insertan o actualizan datos.
  • Vista (View): Presenta los datos en pantalla, es donde va el código HTML que verá el usuario. Son archivos HTML con código PHP incluido
  • Controlador (Controller): Se encarga de obtener datos de un Modelo, procesalos, y pasarlos a la vista. Los Controladores manejan las peticiones del servidor. Toman las entradas del usuario (URL y datos de POST), aplican la logica de negocios, utilizan los Modelos para leer y escribir en la base de datos y otras rutas, y mandan la salida apropiada de datos junto con los archivos de Vistas

MVC

CodeIgniter está pensado para gente que tiene un dominio, al menos medio, del lenguaje de programación PHP. Hay que conocer los fundamentos básicos de PHP para empezar a trabajar de forma eficiente con este entorno de trabajo.

Ventajas de utilizar CodeIgniter

  • Las páginas se procesan más rapido, el núcleo de CodeIgniter es bastante ligero.
  • Es sencillo de instalar, basta con subir los archivos al servidor mediante ftp y modificar algunos archivos de configuración para definir el acceso a la base de datos.
  • Reutilización de código, desarrollo ágil.
  • Existe abundante documentación en la red.
  • Facilidad de edición del código ya creado.
  • Facilidad para crear nuevos módulos, páginas o funcionalidades.
  • Acceso a librerías públicas y clases. Entre otras, hay librerías para el login, paginador, calendarios, fechas, etc.
  • Estandarización del código. Fundamental cuando hay que tocar código hecho por otra persona o cuando trabaja más de una persona en un mismo proyecto.
  • URLs amigables con SEO – (Optimización en motores de búsqueda). Hoy en día nadie duda de la importancia del posicionamiento web.
  • Separación de la lógica y arquitectura de la web, el MVC.
  • CodeIgniter es bastante menos rígido que otros frameworks. Define una manera de trabajar, pero podemos seguirla o no (esto puede convertirse en un inconveniente también)
  • Cualquier servidor que soporte PHP+MySQL sirve para CodeIgniter.
  • CodeIgniter se encuentra bajo una licencia open source, es código libre.
  • CodeIgniter usa una versión modificada del Patrón de Base de Datos (Active Record). Este patrón permite obtener, insertar y actualizar información en la base de datos con mínima codificación (El patrón active record en PHP / Accesos a base de datos: Patrón ActiveRecord).
  • Permite queries más seguras, ya que los valores son escapados automáticamente por el sistema.

Evidentemente todas estas definiciones las he tomado de las muchas páginas que he visitado para documentarme para poder tomar una decisión sobre qué camino seguir, ya que yo no dispongo de momento de los conocimientos suficientes para poder emitir estas valoraciones.

Aprovecho para agradecer a tanta gente que comparte sus conocimientos y experiencias de forma altruista y que tanto ayudan a los que empiezan.

Ago 23

Torneos en AeM

Las páginas que gestionan los torneos en Ajedrez en Madrid (AeM) reunen los siguientes componentes:

Tablas

  • torneos – tabla_torneos
  • noticias – noticias

Páginas

  • calen_tot_n.asp – Muestra la página principal de los torneos (Muy importante y bastante mejorable)
  • listator_tot_n.asp – lista los torneos por meses (Muy importante y mejorable)
  • torneo_n.asp – Muestra la información de un torneo en concreto (página vital)
  • mapa_n.asp – Muestra el mapa de situación del torneo (poco utilizada por falta de datos)
  • notirel1_n-asp – Muestra las noticias relacionadas con el torneo (importante)
  • galerias/galeria_n.asp – Muestra una galería de fotos en formato swf (importante)
  • descargas/descarga1_n.asp – Muestra las descargas de los ficheros de partidas (importante)
  • visorgen_n.asp – Muestra el visor de partidas (Muy importante pero necesita cambiarse del todo)

Includes

  • n_pie.php
  • i1_funciones – Conjunto de las funciones básicas empleadas en la mayor parte de las páginas de la web. Es vital su función.
  • cabecera2.php
  • menu2.php

Funciones

  • FechaBonita() – Convierte la fecha recibida en formato dd-mm-aaaa
  • i1_funciones – GenerarTorneosEnJuego() – Genera una consulta de los torneos que se están disputando durante la fecha del sistema
  • i1_funciones – GenerarTorneosProximos() – Genera una consulta de los torneos que se disputarán inmediatamente después de la fecha del sistema
  • i1_funciones – GenerarTorneosFinalizados() – Genera una consulta de los torneos que han finalizado justo antes de la fecha del sistema

Reflexiones

Creo que voy a empezar por calen_tot_n.asp ya que es la entrada natural a la zona de torneos. Es cierto que la página más importante es torneo_n.asp, pero para esa página necesito la tabla de noticias, y de momento sólo dispongo de la de torneos, así que me pelearé con ella y con la experiencia que consiga con calen_tot_n.asp creo que allanaré el terreno para el resto.

Ago 21

Importar la tabla de torneos de Access a MySQL

Una vez realizados los primeros pasos con páginas estáticas, llega el turno de ponerse a trabajar con las páginas dinámicas.

En este sentido el primer paso es crear la base de datos y las tablas correspondientes para poder empezar a trabajar, y no es tarea sencilla… si no se sabe mucho del tema.

La base de datos – aem

El primer paso es crear la base de datos. Lo voy a hacer en local ya que pienso que luego la exportación al servidor será más sencillo. Para crear la base de datos utilizo el phpMyAdmin y simplemento creo la base con la opción nueva Base de datos.

Esto no tiene ningún misterio.


La tabla de torneos – tabla_torneos

Ahora toca el turno de las tablas de la base de datos. He de reconocer que he tenido que pelearme mucho con ello porque lo que parece tan sencillo como exportar una tabla de Access a un formato que admita MySQL, se complica mucho con el tema de los encodings y las fechas.

Lo intenté con ficheros csv y xml y no conseguí nada.

Por no extenderme diré que encontré un artículo que me hizo ver la luz ya que explicaba este asunto de forma muy clara y didáctica:

Pasar una BD de Access a MySQL con phpMyAdmin

De forma esquemática señalaré el procedimiento;

  • phpMyAdmin admite para importar tablas los siguientes formatos: SQL, CSV, ODS y XML.
  • En esta ocasión vamos a utilizar ODS. ¿Por qué? El formato ODS va a ser capaz de leer las tildes y ñ sin problema.
  • ODS es un formato abierto que utiliza Openoffice.org. Para obtener este formato, debemos abrir nuestro fichero de Access, sobre cada una de las tablas, exportarla a formato Excel (que es el más parecido a ODS).
  • Una vez obtenido el fichero Excel, lo abrimos. Tras abrirlo, utilizaremos Guardar Como para obtener el fichero ODS.
  • Ya tenemos generado nuestro fichero ODS.
  • Ahora volvemos a phpMyAdmin y abrimos la opción IMPORTAR.
  • Pulsamos el botón Examinar y seleccionamos el fichero ODS anteriormente generado. Veremos cómo automáticamente cambia el Formato del fichero a Hoja de Cálculo de Open Document.
  • Si todo ha ido bien, aparecerá un mensaje que nos informará de cuántas estructuras se han creado y cuántas consultas se han ejecutado.
  • Nos ha creado una tabla cuyo nombre es igual al nombre del fichero ODS (tabla_torneos).
  • Las tablas se han importado casi correctamente. Los nombres de los campos los ha cogido perfectamente, pero nos faltarían algunos detalles.
  • En primer lugar, la llave primaria, seleccionamos el campo cdgo_torneo que será llave primaria y en la parte de abajo de la página pulsamos el botón Primaria.
  • Otro problema que teníamos era con las fechas. En nuestro caso tenemos dos fechas inicio_torneo y final_torneo, que son fechas, pero no está almacenado en MySQL como Date.
  • Cambiar simplemente el tipo del campo de Varchar a Date no funciona, ya que en el Varchar están almacenadas las fechas en el formato dd-mm-yyyy y ese formato no lo soporta MySQL.
  • Debemos crear un campo nuevo para cada fecha, de tipo Date. Tras crearlo, debemos realizar un UPDATE como el siguiente:
    UPDATE `tabla_torneos` SET `final_torneo2` = STR_TO_DATE(`final_torneo`, ‘%d/%m/%Y’) UPDATE `tabla_torneos` SET `inicio_torneo2` = STR_TO_DATE(`inicio_torneo`, ‘%d/%m/%Y’)
  • En los nuevos campos ya tenemos los valores de manera correcta, así que podemos borrar los antiguos. Y los campos nuevos renombrarlo para que aparezca con el nombre correcto.
  • Algo parecido pasa con los campos BOOLEANOS, no los coge correctamente y almacena valores de tipo cadena VERDADERO y FALSO.
  • Así, deberíamos crear un campo nuevo, de tipo BOOLEAN, y actualizarlo utilizando la siguiente consulta:
    UPDATE `usuarios` SET `fumadornuevo`=’true’ where `fumador`=’VERDADERO’
    UPDATE `usuarios` SET `fumadornuevo`=’false’ where `fumador`=’FALSO’
  • Con esto tendríamos todo terminado para una única tabla. Si nuestra Base de Datos de Access tiene varias tablas, con llaves externas, tendremos que ir importando todos los ficheros generados para cada tabla.

Para completar el trabajo con la tabla he añadido una nueva columna llamada auto_torneo, que va después de estado_torneo. Este campo va a contener la autonomía del torneo, ya que pienso que puede ser útil para hacer separación de torneos por autonomías.

Ago 20

Pablo Viquez Blog » Encoding, UTF-8, ISO 8859-1 y PHP

Pablo Viquez Blog » Encoding, UTF-8, ISO 8859-1 y PHP.

Encoding, UTF-8, ISO 8859-1 y PHP

4 September, 2008 (17:01) | PHP, Web Development | By: Pablo Viquez

Hace unos dias tuve un problema tratando de desplegar tildes en una aplicación, el problema surgió cuando quise hacer que toda la aplicación fuera UTF-8.

Es decir, que la DB hablara UTF-8 y las paginas desplegaran UTF-8:

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">

Ahora, cuando hice el despliegue en la página, en vez de ver caracteres con tildes o signos de puntuancion de un lenguaje específico, no se desplegaban sino que mostraban caracteres extraños.

Despues de buscar e investigar, mi conclusión fue la siguiente:

Basicamente, los archivos de texto pueden tener diferentes «encodings» y asi reaccionan las funciones.

Por ejemplo, la función utf8_decode, convierte los datos pasados por parametro de tipo multy-byte UTF-8 a un single-byte de tipo ISO-8859-1.

Ahora la funcion utf8_encode funciona bien con un archivo guardado con encoding ANSI, PERO si aplicamos la misma funcion con archivo de tipo UTF-8, nos despliega caracteres extraños en las tildes y ñ’s. Esto porque la funcion espera un parametro de tipo ISO-8859-1 y le estamos pasando uno de tipo UTF-8.

Anyway, ¿porque es importante? por lo siguiente:

Si deseo escribir un archivo en español usando UTF-8, y guardo el archivo en ANSI, los caracteres se van a desplegar de una manera extraña.

Ahora bien, si guardo los archivos fisicamente usando UTF-8, al ser multi-byte el encoding del archivo, los caracteres en español se desplegarán correctamente.

A todo esto, una funcion que sirve mucho si desea hacer la conversion explicita es «iconv»

Funcion: iconv

Uso: string iconv (string in_charset, string out_charset, string str)

Propósito: Convierte un string al encoding solicitado

Ejemplo:

<?php echo iconv('ISO-8859-1', 'UTF-8', 'á'); ?>

En un archivo guardado fisicamente como ANSI, funciona bien, PERO en un archivo guardado como UTF-8 va a desplegar un caracter extraño.

Ahora hay que tener cuidado, ya que si hacemos esto:

<?php echo iconv('UTF-8', 'ISO-8859-1', 'á'); ?>

En un archivo ISO-8859-1, nos genera un error «Notice», porque esta esperando un string de tipo multi-byte, y le estamos pasando un string single-byte, debido al encoding del archivo PHP.

Por último, solo para probar el concepto:

En un archivo guardado como ANSI:

<?php echo ord('á'); ?>

Retorna, 255

En un archivo guardado como UTF-8:

<?php echo ord('á'); ?>

Retorna, 195

Dentro del zip file hay 2 archivos PHP, los 2 con el mismo contenido, la diferencia es el Encoding que use para guardar los archivos.

Resumen y conclusión

Si se trabaja con páginas donde el charset va a ser «ISO 8859-1»

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">

Asegurese de guardar los archivos fisicos PHP o HTML con un formato compatible tipo ANSI.

PERO si las paginas van a tener un charset distinto como UTF-8:

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">

El archivo físico debe ser guardado con el encoding UTF-8.

Ago 17

Páginas de enlaces convertida a PHP en localhost

El primer trabajo que he realizado es el más sencillo que se podía hacer, convertir una página ASP a PHP sin hacer acceso a bases de datos.

Algunas de las páginas que cumplían ese requisito son las de enlaces, que forman un conjunto de ocho páginas enlazadas entre si.

La tarea ha consistido en convertir la primera página enlaces_news.php.

He tenido que crear los siguientes subdirectorios colgando de htdocs.

  • aem/docs
  • aem/includes

Luego he ido viendo las necesidades que tenía la página para funcionar:

  • Añadir en el directorio aem los ficheros:
    • 2color.css – Agrupa los estilos 1reset.css, 1cabecera.css, 2estructura.css y 2color.css
    • 1reset.css – Afecta a toda la web
    • 1cabecera.css – Afecta a la cabecera de toda la web
    • 2estructura.css – Afecta a la estructura de las hojas de este nivel
    • 2estilos.css – Afecta a los estilos de este nivel
    • jquery.tools.min.js – Utilidad para paginar por solapas las páginas de la web
    • solapa.js – Complemento de jquery.tools.min.js
  • Añadir/crear en el directorio aem los includes los siguientes ficheros, cambiando la extensión .inc por .php
    • n_cabecera2.php – Crea la cabecera de este nivel
    • n_menu2.php – Crea el menú de navegación de este nivel
    • n_pie.php – Crea el pié de página
    • ini_enlaces.php – Conjunto de código de inicio para las páginas de enlaces
    • fin_enlaces.php – Conjunto de código final para las páginas de enlaces
  • Añadir las imágenes necesarias en el directorio aem/imagenes
  • Crear en el directorio aem/imagenes los siguientes subdirectorios
    • fondos
    • galerias

Una vez conseguido que funcionara perfectamente esta página he hecho lo mismo con el resto de páginas de enlaces:

  • enlaces_fede.php
  • enlaces_player.php
  • enlaces_teoria.php
  • enlaces_practica.php
  • enlaces_games.php
  • enlaces_com.php
  • enlaces_varios.php

El resultado se puede ver en local, una vez está arrancado el servidor Apache (Xampp) en la siguiente dirección:
localhost/aem/docs/enlaces_news.php

Aunque sea un primer paso sencillo hay que destacar que ya he resuelto algunos temas que son recurrentes en el resto de la web como las cabeceras, los includes necesarios, las imágenes más comunes que se utilizan y las rutinas de jquery que utilizo.

Todo esto significa que en los próximos pasos tendré que hacer frente a otras complejidades, pero éstas ya están solucionadas. Además me motiva para seguir ya que veo resultados.

Ago 16

Buenas maneras de escribir código PHP

Buenas maneras de escribir código php

Pues eso, que ya que estoy empezando he pensado que mejor empezar haciendo bien las cosas y no de cualquier manera. Así que me he puesto a buscar sitios donde hablen de este tema y voy a tratar de incluirlos en esta entrada.

De entrada distinguir algunos conceptos:

Ago 14

CSS3

id, clases, pseudo-clases

Conceptos básicos: CSS es un lenguaje que trabaja junto con HTML para proveer estilos visuales a los elementos del documento, como tamaño, color, fondo, bordes, etc.

Importante:
-moz (Mozilla) o -kevit (Chrome, Safari, Opera)

Estructura en Bloque

  • Cuando hablamos de estructura, nos referimos a la manera en la que un sitio web está dispuesto.
  • Cada navegador implementa una estructura por defecto.

Block

Son posicionados uno sobre otro hacia abajo en la página. (por defecto en los navegadores).

Inline-block

Son posicionados lado a lado, uno al lado del otro en la misma línea, sin ningún salto de línea a menos que no haya más espacio horizontal para ubicarlos.

Modelo de caja

Todas las reglas que especifican la disposición en la que será organizada una página web se le denomina «Modelo de Caja»

Conceptos

CSS3

  • Sobreescribe los estilos básicos del navegador
  • Puede crear nuevos estilos
  • Se pueden combinar los estilos para hacer cosas geniales

Estilos en línea

<p style=»font-size: 20px>Esto es un párrafo</p>

  • Forma
    • Simple
    • Rudimentaria
    • Poco práctica
    • Pero puede ser útil para una vista rápida de un estilo que deseemos implementar

Estilos embebidos

Una mejor alternativa es insertar los estilos en la cabecera del documento y luego usar referencias para afectar los elementos HTML correspondientes

<!DOCTYPE html>
<html lang="es">
    <head>
        <meta charset="UTF-8">
        <title>Elementos en bloque</title>
        <style>
           p { font-size: 20px }
        </style>
    </head>
    <body>
        <p>Esto es un párrafo</p>
    </body>
</html>

Archivos externos

  • Tiene más ventajas que el método de estilos embebidos
  • Facilita la actualización de los extilos
  • Se implementa mediante la etiqueta <link>
<!DOCTYPE html>
<html lang="es">
    <head>
        <meta charset="UTF-8">
        <title>Elementos en bloque</title>
        <link rel="stylesheet" type="text/css" href="css/estilos.css">
    </head>
    <body>
        <p>Esto es un párrafo</p>
    </body>
</html>

estilos.css

p{
    font-size:: 20px;
}

Selector Universal

Este selector representa cada uno de los elementos en el cuerpo del documento, y es útil cuando necesitamos establecer ciertas reglas básicas

*{
margin: 0;
}
p:nth-child(2){
background: #999999;
}

Referencia por etiqueta
Referencia por la palabra clave del elemento

Referencia por id

Problema
Supongamos que desemos implementar dos estilos diferentes a una misma etiqueta
La respuesta más simple es hacer uso de un id

<body>
<p id="articulo">Texto para el artículo</p>
<p id="aside">Texto para el aside</p>

estilos.css

p#articulo{
    font-size:: 20px;
}

p#aside{
    color:: red;
}

Para referenciar un elemento en particular usando el atributo id desde nuestro archivo CSS la regla debe ser declarado con el símbolo # delante del valor que usamos para identificar el elemento.

Notas para las referencias en id

  • Es una referencia sumamente específica, ya que no debe de haber más de un elemento con el nombre del id
  • Normalmente se emplean los id para elementos estructurales
  • Suele emplearse más en JavaScript
  • CSS3 nos proporciona referencias más flexibles

Referencias con el atributo class

  • Este atributo es más flexible
  • Puede ser asignado a cada elemento HTML en el documento que comparte un diseño similar

Se emplea de forma similar que el id sólo que:
– En HTML, en vez de colocar id se coloca class

<p class="principal">Texto para el artículo</p>
<p class="aside">Texto para el aside</p>

En CSS3, en vez de colocar #, se coloca un punto (.)

.principal{
    font-size:: 20px;
}

.aside{
    color:: red;
}

Un dato
¿porqué colocar un punto antes de la referencia?
La razón es que con las clases podemos construir referencias más complejas

p.principal{
    font-size:: 20px;
}

p.aside{
    color:: red;
}

De esta manera, sólo las etiquetas <p>, se verán afectadas por esta clase.

Referenciando por cualquier otro atributo

  • Las nuevs especificaciones de CSS3 nos permite referenciar por cualquier otro atributo:
    <p name=»especial»>Referencia por cualquier otro atributo</p>
  • El CSS3 sería:
         p[name="especial"] {
             font-size: 20px;
             color: red;
         }

Referencias locas

p[name^="mi"] {
    font-size: 20px
}

(^) Será asignada a todo elemento <p> que contenga un atributo name con un valor comenzado en «mi».

p[name$="mi"] {
    font-size: 40px
}

(^) Será asignada a todo elemento <p> que contenga un atributo name con un valor finalizado en «mi».

p[name*="mi"] {
    font-size: 60px
}

(^) Será asignada a todo elemento <p> que contenga un atributo name con un valor que incluye el texto «mi».

Referenciando con pseudo clases

Consideremos el siguiente código

<!DOCTYPE html>
<html lang="es">
    <head>
        <meta charset="UTF-8">
        <title>Estilos con pseudo clases</title>
        <link rel="stylesheet" type="text/css" href="css/estilos.css">
    </head>
    <body>
        <div id="wrapper">
            <p class="miestilo1">Párrafo1</p>
            <p class="miestilo2">Párrafo2</p>
            <p class="miestilo3">Párrafo3</p>
            <p class="miestilo4">Párrafo4</p>
        </div>
    </body>
</html>

La etiqueta <div> agrupa a varias etiquetas <p>.
La etiqueta <div> se considera una etiqueta padre.
Las etiquetas <p> son hijos de la etiqueta <div> y hermanos entre si.

Las pseudo clases nos permiten hacer referencias considerando la estructura del documento

p:nth-child(2)
{
background: #999999;
}

En este caso p es el elemento clave
La referencia nth-child() nos permite encontrar un hijo específico
El 2 nos indica a que elemento hermano nos referimos
A continuación se coloca el estilo que queramos utilizar

Odd – even

Son dos palabras reservadas.

Odd afecta a los elementos hijos que poseen un número impar.
Even afecta a los elementos hijos que poseen un número par.

Haciendo uso de odd y even, se facilita muchísimo la tarea de alternar estilos en una serie de elementos contínuos.

*{
margin: 0px;
}

p:nth-child(odd)
{
background: #999999;
}
p:nth-child(even)
{
background: #cccccc;
}

Otras pseudo clases

Existen otras importantes pseudo clases relacionadas con esta última, como

  • firstchild – Referencia sólo al primer hijo
  • last-child – Referencia al último hijo
  • only-child – Referencia a elementos padres que sólo tienen un hijo

Pseudo clase not()

  • Se emplea para realizar una negación
  • Tiene el mismo alcance que un selector universal
    *{
    margin: 0px;
    }
    :not(p){
    margin: 0px;
    }
  • Dentro de los paréntesis podemos colocar la referencia que queramos

En este caso estamos indicando con un selector universal * un margen de 0px (es decir sin margen) a todos los elementos de la página.
Con la pseudo clase :not(p) le indicamos que a los elementos p no les afecte el margen de 0px, de tal manera que utilizarán las características por defecto del navegador o las que nosotros deseemos.

Nuevos selectores

Estos selectores usan los símbolos <, + y div>p.mitexto2{
color: #990000;
}
Le decimos es este elemento( p.mitexto2) sea afectado siempre que tenga como padre un elemento div

p.mitexto2 + p{
color: #990000;
}
El elemento <p> inmediatamente inferior al elemento p con la clase (mitexto), se verá afectado por los estilos.

p.mitexto2 ~ p{
color: #990000;
}

El estilo será aplicado a todos los elementos <p> que son hermanos y se encuentran luego del elemento <p> identificado con el valor mitexto2 en su atributo class.

Ago 13

Empezando mi andadura con php

    • Trabajar con servidor A2Hosting
    • Trabajar en local

Se trata de hacer todas las pruebas en los dos sitios, tanto en local como en el servidor A2Hosting que tengo contratado.

Local

Usuario: root@localhost

Los programas PHP se almacenan en local en c:/xampp/htdocs/misitio
mientras que en luismaseda.com en: public_html/misitio

Nota: Añadir código de autonomía en el fichero de torneos
Pensamiento: Potenciar el calendario de torneos. Es muy solicitado
  • Formulario de torneos
  • Mejor presentación
  • Filtros de búsqueda

A sangre y fuego

  • En phpMyAdmin para exportar y/o importar tablas tiene que estar creada la base de datos
  • Quitar error «la conexión para controluser, como está definida en su configuración, fracasó»Respuesta: En c:\xampp\phpMyAdmin se edita el fichero config.iniVerificar que estos dos campos estén vacios
    $cfg[‘Servers’][$i][‘controluser’]=»;
    $cfg[‘Servers’][$i][‘controlpass’]=»;

Cómo empiezo

Siguiendo los pasos de este manual en la web: http://librosweb.es/symfony_2_x/capitulo_2.html

No es que vaya ha trabajar con symfony2 (no lo sé), pero creo que esta parte del manual puede enseñarme a escribir un buen código de programación, aunque no llegue al nivel de utilizar Symfony.