A lo largo de las dos últimas semanas, por necesidades de un proyecto, me he visto obligado a trabajar con formularios en los que había bastantes campos de fecha.

Lo que pretendo hoy aquí es dar una serie de recetas rápidas que puedan solucionar esas preguntas “fáciles” que puedan surgir.

Cambiando el formato

Por defecto el formato es “año/mes/día”. En España el formato usual es “día/mes/año” así que para cambiarlo:

$format = '%day%/%month%/%year%';
 
$this->widgetSchema['date_field'] 
  = new sfWidgetFormDate(array('format' => $format));

Mostrando una fecha por defecto

Supongamos ahora que queremos una determinada fecha por defecto.

$default = array( 
                 'year'  => 2010, 
                 'month' => 2, 
                 'day'   => 12
              );
 
$this->widgetSchema['date_field'] 
  = new sfWidgetFormDate(array('default' => $default));

Mostrando hoy como la fecha por defecto

Si lo que queremos es que la fecha a mostrar por defecto sea el día actual

$today = array(
                'year'  => date('Y'),       
                'month' => date('n'),
                'day'   => date('j')
);
 
$this->widgetSchema['date_field'] = 
     new sfWidgetFormDate(array('default' => $today));

Eligiendo sólo unos determinados años

Supongamos que sólo nos interesa que muestre como posibles opciones de años, éste y los dos siguientes

$range  = range(date('Y'), date('Y')+2);
$years = array_combine($range,$range);
 
$this->widgetSchema['date_field'] = 
     new sfWidgetFormDate(array('years' => $years));

Validando que una fecha no es pasada

Si lo que nos interesa es que el usuario no pueda introducir una fecha pasada, por ejemplo para hacer una reserva.

$this->validatorSchema['date_field'] =
    new sfValidatorDate(array('min' => date('Y-m-d'));

Validando que una fecha no es futura

O bien nos interesa que la fecha no pueda ser futura, porque se trata de que esté diciendo cuando tuvo lugar un hecho.

$this->validatorSchema['date_field'] =
    new sfValidatorDate(array('max' => date('Y-m-d'));

Validando que una fecha es mayor que otra

Si tenemos dos campos de fecha, nos puede interesar que uno sea mayor que otro, por ejemplo la fecha de salida y llegada para una reserva de hotel.

      $this->validatorSchema->setPostValidator(
          new sfValidatorSchemaCompare('date_starts', '<', 'date_ends')
      );

Después de muchos años en el entorno Windows, me he decido armar de valor y moverme a Linux, y como tampoco soy tan geek, me he ido al Linux “para seres humanos”, esto es, Ubuntu.

Puesto que para mí el paso ha sido algo costoso (en tiempo, se entiende), detallaré paso a paso que es lo que he hecho para configurar e instalar Apache, PHP y MySQL, así como configurar correctamente el entorno de desarrollo (ver Symfony y Ubuntu II: Virtual Hosts y Entorno de Desarrollo).

Antes de nada, en la fecha en la que escribo este post la versión de Ubuntu es la 9.10 (Karmic Koala)

Instalando Apache
Lo primero que habrá que hacer es instalar Apache, el servidor HTTP, esto es bastante sencillo:

sudo apt-get install apache2

Y habilitamos el MOD_REWRITE que no viene de serie

sudo a2enmod rewrite

Instalando MySQL
Igual de sencillo que en el caso anterior

sudo apt-get install mysql-server

Instalando PHP 5
En este caso habrá que instalar el paquete propiamente dicho

sudo apt-get install php5

La extensión para MySQL

sudo apt-get install php5-mysql

Si te parece interesante tener la aplicación de PHP, phpMyAdmin, también puedes instalarla así

sudo apt-get install phpmyadmin

Y puesto que todo esto lo estamos pensando para utilizar symfony será muy recomendable instalar el paquete de línea de comandos, CLI:

sudo apt-get install php-cli

Para asegurarnos de que los cambios surgen efecto, reiniciamos el servidor apache:

sudo /etc/init.d/apache2 restart

Y ya debería todo funcionar correctamente. Para ello, comprobamos que nuestro navegador responde correctamente a la petición


http://localhost/

¡Estupendo! Ya tenemos corriendo Apache, PHP y MySQL en nuestro PC.

Hace poco posteé un artículo sobre cómo tweetar con PHP. Normalmente estos updates van acompañas de un enlace con información más completa, y para eso tenemos tinyurl.

El siguiente código se conecta a la API de tinyurl y te devuelve el valor de la URL empequeñecida, así de sencillo:

    function tinyURL($url)
    {
        $context = stream_context_create(array(
            'http' => array(
              'method'  => 'GET',
              'timeout' => 5
            ),
        ));
        $ret = file_get_contents('http://tinyurl.com/api-create.php?url='.urlencode($url), false, $context);
        return $ret;
    }

Y ésta sería la forma de utilizar en un caso “práctico”:

tweet('Ya tengo blog, '.tinyURL('http://www.loalf.com'), 'loalf', 'Pa$$');

Hace poco vi esta pequeña joya de código que permite tweetear (¿?) directamente desde código PHP.

function tweet($message, $username, $password)
{
  $context = stream_context_create(array(
    'http' => array(
      'method'  => 'POST',
      'header'  => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)).
                   "Content-type: application/x-www-form-urlencoded\r\n",
      'content' => http_build_query(array('status' => $message)),
      'timeout' => 5,
    ),
  ));
  $ret = file_get_contents('http://twitter.com/statuses/update.xml', false, $context);
 
  return false !== $ret;
}

La forma de utilizarlo no puede ser más sencilla

tweet('From PHP, yeah...', 'fabpot', 'Pa$$');

Muy útil hoy en día cuando muchas aplicaciones se conectan a Twitter para hacer actualizaciones automáticas.

Post original: Tweeting from PHP

Symfony y Desarrollo Web © Copyright 2009, All Rights Reserved.