El blog de Martini

Primer Beta de Google Chrome para Mac OS X

Diciembre 8, 2009 · Dejar un comentario

La primera versión ßeta del navegador de Google: Chrome ha sido oficialmente lanzada y se alista para poner más interesante la guerra de navegadores en el sistema operativo de Apple.

Como opinión personal puedo decir que la interfaz usuaria se ve bastante limpia, el diseño es ad-hoc con el Leopard (una que otra animación por ahí), integra el corrector ortográfico OS X, me gusta que los tabs estén sobre la barra de navegación y bueno la estabilidad es aceptable, por otra parte, están disponibles los themes para personalizar un poco el navegador, pero aún no están disponibles las extensiones. No hablaré de rendimiento porque desde mi punto de vista, como usuario, es bastante poca la diferencia entre Safari, Firefox y Chrome. Dejo a su criterio cuál es el que más se acomoda a sus necesidades.

Link: Descarga Google chrome para Mac

FuenteGoogle Chrome for Mac goes beta!

→ Deja un ComentarioCategorías: Mac OS X
Etiquetado: , , , , ,

Juanelo – Exclusivo

Diciembre 8, 2009 · 1 comentario

Alguien dijo googlewave?

Link: Juanelo 1107

→ 1 comentarioCategorías: etc
Etiquetado: ,

Liberados Symfony 1.3 y 1.4

Diciembre 2, 2009 · Dejar un comentario

Hace algunas horas han sido liberados las versiones estables de Symfony 1.3 y 1.4 la lista de mejoras parece muy extensa, nuevas versiones para los ORM siendo Doctrine el nuevo motor por defecto, SwiftMailer será el encargado de las tareas de envío de emails, mejoras en las Forms, herramientas de Testing y Debug,  pero la promesa más importante del equipo de desarrollo es el aumento en el rendimiento de nuestras aplicaciones. Acá está el detalle de las novedades.

Ahora lo más interesante es que junto con actualizar el tutorial Jobeet (Practical Symfony) para las versiones 1.3 y 1.4 , han lanzado un nuevo libro, de nombre More with symfony, el cual toca tópicos más avanzados relacionados con este framework. Como dato adicional fue escrito en alrededor de 2 meses por más de 10 autores y está disponible en 5 idiomas, sin duda destacable el esfuerzo realizado.

No queda más que probar las nuevas virtudes de esta nueva versión de symfony

→ Deja un ComentarioCategorías: Symfony
Etiquetado: , , , ,

Wallpapers – Inspirados en Apple

Noviembre 30, 2009 · Dejar un comentario

He encontrado un interesante sitio con wallpapers relacionados o inspirados por los productos de Apple, todos ellos muy coloridos y disponibles en formato widescreen e iphone. Si bien algunos están inspirados en “arte” de productos tales como Final Cut, no quita el hecho que lucen bastante bien.

El sitio en cuestión es trevorkay.co.cc para que lo visiten y vean otras cosas interesantes que ha hecho este diseñador.

→ Deja un ComentarioCategorías: Diseño · Wallpapers
Etiquetado: , , ,

Un Artefacto dedicado al fin de semestre

Noviembre 22, 2009 · Dejar un comentario

Artefactos: Parra - Tejeda

Mi ilustración favorita de fin de semestre :P

→ Deja un ComentarioCategorías: etc
Etiquetado: , , ,

Symfony – Fixtures con las Ciudades y Comunas de Chile

Noviembre 22, 2009 · 1 comentario

Durante el desarrollo de nuestro proyecto para la Feria de Software tuvimos que tener algunos datos de prueba para las comunas y ciudades de Chile, como no era fundamental tener las regiones simplificamos el modelo propuesto en este sitio al siguiente (escrito en notación YAML)

Para las ciudades:

  ciudad:
   id: ~
   nombre:      { type: varchar(100) }

Para las comunas

  comuna:
   id: ~
   nombre:      { type: varchar(100) }
   ciudad_id:   { type: integer, foreignTable: ciudad, foreignReference: id, onDelete: restrict }

Los cuales, como es de presumir, fueron agregados a nuestro esquema (./config/schema.yml). Hasta aquí nada muy interesante, pero mientas discutíamos la forma más compleja y por ende mejor ( xD ) de cargar los datos,  Camila Maldonado se tomó la ‘molestia’ de pasar la información directamente a un par de archivos yaml para ser cargados como fixtures (./data/fixtures) en nuestro proyecto. Les dejo a continuación los archivos:

Descarga: Fixtures symfony – Ciudades y Comunas de Chile (zip – 5,5 KB)

Es muy posible que falten varias comunas, pero como comenté sólo necesitábamos datos de prueba y éstos se ajustaron bastante bien: 52 ciudades y 345 comunas no está mal :)

→ 1 comentarioCategorías: Symfony
Etiquetado: , , , , , ,

Symfony – Validador de RUT

Noviembre 14, 2009 · Dejar un comentario

Utilizando la clase para validar RUT que mostré en esta entrada cree un sencillo validador de RUT para los formulario de symfony 1.2

Por convención he creado la clase sfValidatorRut.class.php en el directorio /lib de la raíz del proyecto. Aquí está el código de esta clase:

<?php
/**
 * Validador de RUT para symfony 1.2
 *
 * @author Esteban Martini Muñoz
 * @version 1.0
 */
require_once dirname(__FILE__).'/../Rut.class.php';
class sfValidatorRut extends sfValidatorString
{
  public function configure ($options = array(), $messages = array())
  {
    $this->addMessage('invalid', 'El formato del RUT: %value% no es válido.');
    $this->addMessage('bad_dv', 'El dígito verificador del RUT es incorrecto.');
    $this->addMessage('required', 'RUT es requerido.');
  }
  public function doClean($value)
  {
      $clean = ltrim(rtrim(($value)));
      $rut = new Rut();
      if (!$rut->verificaFormatoRut($value))
        throw new sfValidatorError($this, 'invalid', array('value' => $value));
      else if(!$rut->isRut($value))
        throw new sfValidatorError($this, 'bad_dv', array('value' => $rut->getDV($value)));
      return (string)$rut->formatoUser($value);
  }
}

Su uso es igual al resto de los validadores de symfony sólo basta asignar el tipo de validación al campo a verificar de nuestro formulario.

//...
public function configure()
{
  $this->validatorSchema['rut_usuario'] = new sfValidatorRut();
}
//...

Espero les sea de utilidad.

→ Deja un ComentarioCategorías: Symfony
Etiquetado: , , , , ,

Clase para validar RUT en PHP

Noviembre 14, 2009 · 1 comentario

Validar los RUT (Chilenos) es una tarea bastante común y deben haber cientos de implementaciones… esta es la mía :P . Para esta implementación se considera que el RUT y el Dígito Verificador de éste forman, siempre, parte de la misma cadena de texto, por ejemplo: 11.111.111-1 ó 1111111.

A continuación el código fuente debidamente comentado.


<?php

/**
 * Valida y formatea RUT en distintos formatos.
 * Esta clase considera que los RUT son manejados como sólo una cadena de texto, es decir,
 * incluye SIEMPRE el digito verificador.
 *
 * @author Esteban Martini Muñoz
 * @version 1.0
 *
 */

class Rut {

  const FORMATO_CARNET = 1; //Ejemplo 12.345.678-9
  const FORMATO_CARNET_SIN_PUNTOS = 2; //Ejemplo 123456789

   /**
   * remueve caracteres que actuan como separadores dentro del
   * RUT (espacios, puntos, guiones,etc)
   *
   * @param string $r RUT
   * @return string RUT sin caracteres separadores.
   */
  public static function formatoUser($r){
      return $r = preg_replace('/(\.)|(\-)|[ ]|[\,]|[\']/','',$r);
  }

  /**
   * Crea un arreglo asociativo separando el RUT y el dígito verificador.
   * @param string $r
   * @return string[]
   */
  public static function splitRut($r)
  {
    //sacar puntos, guiones, espacios, etc:
    $r = self::formatoUser($r);

    $dv = substr($r,strlen($r)-1);
    $r = substr($r,0,strlen($r)-1);

    return ($rut = array("rut"=>$r, "dv"=>$dv));
  }

  /**
   * Retorna el RUT sin dígito verificador
   * @param <type> $rut
   * @return <type>
   */
  public function getRut($rut)
  {
      $r = self::splitRut($rut);
      return $r["rut"];
  }

  /**
   *
   * @param <type> $rut
   * @return <type>
   */
  public function getDV($rut)
  {
      $r = self::splitRut($rut);
      return $r["dv"];
  }

  /**
   * Formatea el RUT en el formato específicado, se asume que incluye DV
   * @param string $rutCompleto
   * @param integer $formato
   * @return string
   * @example getRutCompleto(163580357,FORMATO_CARNET)
   */
  public static function getRutCompleto($r, $formato = 0){

      if(strlen($r)==0)
          return '';

      $rut = self::splitRut($r);

      if($formato == self::FORMATO_CARNET){
        return number_format($rut["rut"],0,'','.')."-".$rut["dv"];
      }
      else if($formato == self::FORMATO_CARNET_SIN_PUNTOS){
        return $rut["rut"]."-".$rut["dv"];
      }
      else{
          return $rut["rut"].$rut["dv"];
      }

  }

  /**
   * Verifica que el formato del rut sea tipo usuario (123456789)
   * y tenga un largo entre 6 y 9
   * @param <type> $r
   * @return <type>
   */
  public static function verificaFormatoRut($r)
  {
      //sacar puntos, guiones, espacios, etc:
      $r = self::formatoUser($r);

      //extraer el rut sin dv:
      $rut = substr($r,0,strlen($r)-1);

      return (preg_match('/^[0-9]+$/', $rut) && preg_match('/([kK0-9])$/',$r) && strlen($rut)>5 && strlen($rut)<9);
  }

  /**
   * Verifica que un RUT tenga un dígito verificador válido.
   * @param string $r
   * @return boolean
   */
  public function isRut($r)
  {
    $rut = self::splitRut($r);
    return (strcasecmp($rut["dv"], self::calculaDV($rut["rut"])) == 0 ? true : false);
  }

  /**
  * Calcula el digito verificador de un RUT.
  * Fuente: http://www.dcc.uchile.cl/~mortega/microcodigos/validarrut/php.php
  * @author Luis Dujovne
  * @param int $r  Un RUT sin DV
  * @return char(1) el digito verificador del RUT
  */
  public function calculaDV($r)
  {
    $s=1;
    for($m=0;$r!=0;$r/=10)
      $s=($s+$r%10*(9-$m++%6))%11;
    return chr($s?$s+47:75);
  }
}
?>

Se aceptan comentarios, correcciones, optimizaciones, etc.

Saludos!

→ 1 comentarioCategorías: PHP
Etiquetado: , , , ,

Ordenar cadenas de texto que contengan números en MySQL y Symfony

Noviembre 2, 2009 · 2 comentarios

En un proyecto reciente, tuve que ordenar una columna que contenía RUN, estas cadenas tienen entre 7 y 8 números enteros y un dígito verificador que puede ser un número entre 0-9 o una letra K, ordenar estas cadenas puede ser algo complicado pues el ordenamiento no es numérico.

En este sitio presentan una solución bastante sencilla, básicamente es sumarle un cero a la columna por la que queremos ordenar.

mysql> SELECT column FROM table_name ORDER BY column+0;

Esta idea se puede llevar a symfony simplemente añadiendo una cláusula de ordenamiento en un Criteria.

$c = new Criteria();
$c->addDescendingOrderByColumn('USERNAME+0');

Saludos!

→ 2 comentariosCategorías: MySQL · Symfony
Etiquetado: , , , ,

Usando JSON con jQuery en Symfony

Octubre 30, 2009 · 2 comentarios

JSON es una forma bastante cómoda de tratar con “objetos” y si lo usamos junto con AJAX puede resultar muy sencillo tratar con respuestas que contienen mas de un elemento, tales como una array o un objeto. En el siguiente ejemplo veremos como usar  jQuery y JSON para realizar consultas AJAX en symfony (sin helpers o similares)

Voy a evitar declarar el modelo de datos, por lo que supongo que el lector ya tiene algunos conocimientos básicos de este framework.

1.- El Action

Lo primero que haremos es crear un nuevo método para nuestro action, el objetivo es retornar un texto serializado con información de un usuario.

public function executeAjaxDatosCorredorById(sfWebRequest $request){

  /* Asegurar que la solicitud sea AJAX */
  if (!$request->isXmlHttpRequest())
    return $this->renderText(json_encode(array('error'=>'Sólo respondo consultas vía AJAX.')));

  /* si entra por POST o GET la variable sfUserId, continuar */
  if($request->getParameter('sfUserId'))
  {
     $usuario = sfGuardUserPeer::retrieveByPK($request->getParameter('sfUserId'));
     /* Crear array asociativo con los atributos del objeto $usuario */
     $datosUsuario = array(
        "nombre"    => $usuario->getProfile()->getNombre(),
         "apellidoP" => is_null($usuario->getProfile()->getApellidoP()) ? '' : $usuario->getProfile()->getApellidoP(),
         "apellidoM" => is_null($usuario->getProfile()->getApellidoM()) ? '' : $usuario->getProfile()->getApellidoM(),
         "rut"       => $usuario->getUsername()
      );

      /* retornar el arreglo en formato JSON */
      return $this->renderText(json_encode($datosUsuario));
   }
   return $this->renderText(json_encode(array('error'=>'Faltan parámetros para realizar la consulta')));
}

Listo. la respuesta está lista para ser “interpretada”. Ahora vamos a ver cómo procesamos la consulta:

2.- La funcion AJAX

Los parámetros de esta función son:
sfAction: es dirección http de la accion de symfony a ejecutar.
idTrigger: Id del elemento DOM que desencadena el evento.
valorParametro: valor que toma laa variable GET['sfUserId']

function getDatosUsuarioById(sfAction, idTrigger, valorParametro)
{
      $.ajax(
      {
        url: sfAction,
        data: ({sfUserId: valorParametro}),
        dataType: "json",
        beforeSend: function()
        {
          $("#"+idTrigger).append('<span id="cargando_datos"> Cargando datos...');
        },
        complete: function()
        {
          $("#cargando_datos").hide();
        },
        success: function (data, status)
        {
          $("#propuesta_nombre_contratante").val(data.nombre);
          $("#propuesta_apellido_p_contratante").val(data.apellidoP);
          $("#propuesta_apellido_m_contratante").val(data.apellidoM);
          /* ... etc */
        }
        error: function (data, status, e)
        {
            alert('Ocurrió un error cargando los datos solicitados:.\n'+data.error);
        }
    });
}

En la sección success se puede ver que la respuesta, representada por  data,  se interpreta como si fuera un objeto.

3.- La puesta en marcha

Para ver el código en funcionamiento debemos agregar el siguiente código en la vista o template en la que necesitemos la función recién implementada. En este ejemplo la función getDatosUsuarioById(…) se dispara al entrar en foco el elemento DOM con Id: propuesta_nombre_contratante. Por otra parte, nótese cómo se declara la variable sfCargaDatosUsuario, se utiliza el helper url_for para crear una ruta, utilizando enrutamiento absoluto, hacia el URL del action a ejecutar.

$(document).ready(function(){
  var sfCargaDatosUsuario  = "<?php echo url_for('propuesta/ajaxDatosUsuarioById')?>";
   $("#propuesta_nombre_contratante").focus(function()
   {
        if($("#propuesta_cliente_id").val()>0)
        {
            getDatosUsuarioById(
                sfCargaDatosUsuario,
                "propuesta_cliente_id",
                $("#propuesta_cliente_id").val(),
            );
        }
    });
});

Eso por el momento, espero le sea de utilidad a alguien, iré puliendo esta entrada para que quede más clara.

→ 2 comentariosCategorías: Jquery - JS · Symfony
Etiquetado: , , , ,

jQuery – Seleccionando elemento de un Select Box

Octubre 29, 2009 · 1 comentario

Una forma sencilla de marcar como “seleccionado” a un elemento de un select box, usando jQuery, es con el siguiente código

$("#miSelectBox option[value="+miValue+"]").attr("selected",true);

Esto puede resultar particularmente útil en un Select Box que haya “hidratado” via AJAX y despues hacer submit haya perdido las opciones y debas volver a cargarlas. Si eso es exactamente lo que andas buscando, se hace así:


var miValue = $("#miSelectBox" ).val();
if (miValue >0)
    $("#miSelectBox option[value="+miValue+"]").attr("selected",true);

Muy sencillo :D

Fuente: jivebay.com (ojo con algunos selectores utilizados, varios de ellos ya están obsoletos en la versión 1.3 )

→ 1 comentarioCategorías: Jquery - JS
Etiquetado: ,

Symfony – Ver los detalles de error en Formularios Personalizados

Octubre 12, 2009 · 1 comentario

Si no utilizas los templates que genera automáticamente symfony para nuestros formularios, ya sea porque requieres agregarle un poco de color, algo más de información etc, seguramente más de una vez te haz topado que algo falló y no sabes qué es (validación, olvidaste agregar un campo, etc), una solución rápida e informativa es agregar la siguiente pieza de código en alguna parte visible de nuestro template:

<ul class="error_list">
    <?php if($form->hasErrors()):?>
    <?php foreach ($form->getErrorSchema() as $name => $error): ?>
      <li><?php echo $name.': '.$error ?></li>
    <?php endforeach; endif?>
</ul>

Esto nos mostrará un listado los errores de nuestro formulario.

Saludos

→ 1 comentarioCategorías: Symfony
Etiquetado: , , ,