Archivo de la categoría: Desarrollo

Symfony propel: usar funciones en el objeto Criteria

Criteria es el objeto que permite definir los criterios de selección de resultados en sistemas que emplean Propel como ORM. Propel y Doctrine son dos plataformas de mapeo de resultados SQL a clases empleados por Symfony. Este post se centra en el uso de Propel y describo como emplear funciones SQL propias en el objeto Criteria.

Imagina que tenemos una tabla llamada producto con dos campos:

  • id
  • nombre

En el modelo de clases generado por Symfony tendremos una clase llamada ProductoPeer que es la encargada de realizar los accesos a base de datos. Para realizar las consultas hemos de construir un objeto Criteria que contiene las características de los datos que deseamos seleccionar. En algunas ocasiones es útil emplear funciones que hemos escrito en base de datos, como por ejemplo, una función que dado un id de producto nos devuelve el número de veces que se ha consultado en nuestra web. El código lógico sería el siguiente:

$criteria = new Criteria();

$criteria->addAsColumn(‘consultas’, ‘getConsultasProducto(‘.ProductoPeer::ID.’)');
$criteria->add(ProductoPeer::ID, $productoId);
ProductoPeer::doSelect($criteria);

getConsultasProducto es una función de base de datos que devuelve el número de consultas.

Si lanzamos la aplicación dará un error indicando que ProductoPeer no puede encontrar el campo con la clave primaria. Para evitar esto usamos lo siguiente:

$criteria = new Criteria();
$criteria->clearSelectColumns();
$criteria->addSelectColumn(self::ID);
$criteria->addSelectColumn(self::NOMBRE);
$criteria->addAsColumn('consultas', 'getConsultasProducto('.ProductoPeer::ID.')');
$criteria->add(ProductoPeer::ID, $productoId);
ProductoPeer::doSelect($criteria);

Lo nuevo con respecto al código inicial es que se resetean los campos que estarán en la select y se añaden en el mismo orden en el que están declarados en config/schema.yml del proyecto. Gracias a esto, podemos ordenar los resultados por el número de consultas del producto:

$criteria->addDescendingOrderByColumn($criteria->getColumnForAs('consultas'));

Espero que sea de utilidad. Saludos.

PHP: JSON en una cookie

Las cookies son pequeños fragmentos de información que las páginas web envían al navegador  para recordar cierta información en el futuro. Se almacenan de forma local, es decir, cada usuario las almacena en un archivo de su máquina. Las cookies pueden contener información simple, como una cadena de texto, pero también pueden tener información compleja. Por ejemplo, imagine una tienda tipo ebay en las que se almacenan los últimos productos visitados y en función de ello, ofrecerte nuevas ofertas similaes a lo que has buscado. Sin duda, esto mejora la experiencia del usuario.

Este post trata de cómo almacenar información estructurada en una cookie para luego obtenerla fácilmente. Una de las mejores formas de intercambiar información estructurada en páginas web es el formato JSON. Este es un formato ligero, fácil de usar e interpretar que ha experimentado una gran crecimiento en los últimos tiempo. Existen parsers (intérpretes) en casi todos los lenguajes y PHP lo incluye de forma nativa desde la versión 5.2.

Almacenar información estructurada en una cookie es sencillo: crea una clase y define la estructura de variables:


class miClase {
public dato1 = "valor";
public dato2 = array("entrada");
}

Este clase será serializada y convertida a JSON mediante la función json_encode:


$resultado = json_encode(miClase);

La función devuelve una cadena de texto en formato JSON. Como restricción, esta función sólo trabaja con datos en formato UTF-8. Finalmente, para no tener problemas con algunos caracteres que no pueden aparecer en las cookies, aplicamos la función urlencode y tendremos el texto listo para almacenarlo en la cookie:


setcookie('nombreCookie', $resultado);

Cuando llega una petición web, la obtención de los parámetros de la cookie se realiza con los pasos anteriores de forma inversa:


$jsonString = urldecode($datosCookie);
$datos = json_decode($jsonString, true);

La variable $datosCookie contien los datos JSON almacenados anteriormente. Finalmente $datos contiene un array asociativo con los datos originales. Este array se obtiene debido a que hemos empleado el valor true en el segundo parámetro de la función json_decode. Si no se emplea este segundo parámetro,  json_decode devuelve un objeto.

Detectar los navegadores móviles en PHP

Que los dispositivos móviles, como los smartphones o las tablets, han llegado para quedarse es un realidad innegable. Para todos ellos existe varios sistemas operativos: iOS, Android, BlackBerry OS, Symbian, Palm… etc. A su vez, estos contiene aplicaciones, tales como los navegadores, que se han convertido en una de las aplicaciones más importantes de estos dispositivos. Disponer una versión para móvil de nuestra página web es muy recomendable y para poder mostrarla es necesario detectar cuando el agente o navegador proviene de una plataforma móvil. Hoy os presento Detect Mobile Browsers una web que, mediante un sencillo formulario,configuramos las acciones que se realizarán cuando se detecte el user-agent de navegadores móviles como el de iPhone, iPad, Android…

Formulario de captura

El resultado de completar el formulario es una función llamada mobile_device_detect con los parámetros adecuados para llevar a cabo las reglas configuradas. Dicha función se encuentra en un fichero PHP que podemos descargar. Para usarlo es necesario realizar un include:


require_once('mobile_device_detect.php');
$mobile = mobile_device_detect(param1, param2, ...);

En el fichero PHP que incluimos hay escritas una gran cantidad de expresiones regulares para detectar los principales navegadores. Además, si el user-agent no coincide con el de algún navegador conocido, emplea patrones usados por los principales operadores de telefonía en el user-agent de los sistemas operativos que personalizan.

El código generado se acompaña con una licencia propia que indica la posibilidad de usarlo en un sitio web sin coste alguno siempre que la web no presente actividad comercial.

Domain mapping en tu blog

Estoy finalizando la implementación de un nuevo proyecto y tras comprar el dominio, vavag.com, he comenzado a crear el “ecosistema” asociado a el: Crear una cuenta en Twitter, Facebook y un blog. Para este último, no voy a realizar ninguna instalación en el servidor que albergará el proyecto debido a que existen muy buenos servicios: WordPress, Blogger o Tumblr (No es propiamente dicho una plataforma blog).

El Domain Mapping permite crear dominios y subdominios apuntando a tu blog y  que las entradas publicadas empleen ese dominio. Más sencillo: Este blog se alberga en lennyvpg.wordpress.com, pero si deseo comprar el dominio blogextremo.com y que apunte a mi cuenta en wordpress, tengo que emplear el Domain Mapping. De las tres plataformas que he mencionado antes, wordpress es la única que cobra por este servicio: 12$/año y cuenta. El resto es completamente gratuito. Tras examinar Blogger y Tumblr me decanto por este último por acomodarse a mis necesidades actuales y por que me gustan los temas disponibles.

Realizar el Domain Mapping en Tumblr es sencillo. Es necesario acceder a la sección de DNS de tu servicio de dominio. Si el dominio es vacío (por ejemplo ejemplo.com) hay que crear un registro tipo ‘A-Name’ que apunte a la dirección que  Tumblr proporciona. Si estamos hablando de un subdominio: blog.ejemplo.com, habría que apuntarlo a la IP proporcionada por la plataforma blog. En mi caso, el registro de dominio lo he realizado en CdMon. Para configurarlo, hay que acceder a la opción ‘DNS Estático’, seleccionar el dominio y pulsar sobre el botón ‘gestionar’ y después ‘Añadir un registro A’. Una ves hecho esto, puede que sea necesario esperar unos minutos antes de que se repliquen los cambios en los servidores DNS. Para configurarlo en Tumblr, hay que acceder a ‘Customice’ y en la pestaña ‘info’, indicar que usaremos nuestro nombre de dominio ‘Use a custom domain name’. Escribimos el dominio o subdominio y tras unos segundos, todo funciona.

Recursos:

Más sobre domain mapping

La era de las movile-store

Interesante entrada publicada por Ángel Jiménez de Luis en su blog titulada “Developers, developers, developers”. En ella describe como se presenta el futuro de cara a los programadores de aplicaciones móviles, un mundo muy competente desde que hizo aparición la AppStore de Apple. Sin duda, cada compañía quiere “barrer para su campo” y están al acecho para atraer a los programadores a su propia plataforma.

Selectores CSS

Los selectores CSS son cada vez más comunes para evitar la complejidad de lectura de un ficheri HTML. Gracias a ellos, y con un formato que guarda similitud con el de las expresiones regulares, podemos construir cadena que permiten aplicar un estilo a determinados elementos HTML. Este “lenguaje” también se emplea en sistemas de pruebas funcionales -functional test- sobre aplicaciones web, para determinar si existe un elemento como resultado de aplicar la prueba y probar que todo ha marchado bien. Por ejemplo, el método checkElement del sistema Lime, motor de pruebas de Symfony, emplea dichos selectores.

Dejo un elace a modo de resumen sobre la sintaxis de los Selectores CSS que ha creado anieto2K.

qooxdoo: framework js para aplicaciones RIA

Bajo un nombre para mí algo desacertado, se encuentra un framework javascript muy interesante. Permite crear aplicaciones web con aspecto similar a las de escritorio.

Se está empleando en grandes proyectos como eyeOS, el sistema operativo de la nube made in spain que tanto ha  gustado a IBM. La programación es sencilla. Emplea name spaces para organizar el código junto con las pseudoclases que permite javascript. En su web tienes varios ejemplos muy interesantes.

Recursos:

API

NetBeans tendrá soporte para Symfony Framework

symfony_NetBeans1

Aunque todavía está verde, el soporte para Symfony Framework ya está en marcha y tiene muy buena pinta. Permite crear proyectos, modulos, asociar short-keys a nuestras acciones principales, borrar la caché…

Recursos:

Equipo de soporte de PHP en NetBeans.

Cómo llamar a una función Javascript externa a un iFrame?

Por si el título no queda claro, lo explico: Tienes un codigo HTML en el que declaras una función Javascript y despues tienes un iFrame que llama a una web y esta última hace uso de la función que previamente has declarado.

Es muy sencillo: parent.<nombre de la función>

Si queremos invocar una función de otro iFrame distinto que tenemos en la misma página:

parent.<nombre del iFrame>.<nombre de la función>

El nombre del iFrame es el valor que ponemos en el campo name:

<frame src=”miPagina.php” name=”laPagina”>

IE 8 ya dispone de una herramienta de depuración al estilo FireBug

Hoy en el trabajo he instalado la nueva versión del Internet Explorer de Microsoft -IE 8- y descubro que tras la tecla F12 se encuentra una herramienta de gran utilidad para depurar nuestras web. Aunque no posee toda la potencia del plugin de Firefox, facilita la depuración de aspecto de las web.

Caracteristicas más destacadas:

  • Permite renderizar con dos motores: IE 7 e IE 8.
  • Tiene un modo inspección que permite seleccionar los elementos del DOM HTML.
  • Resaltar las celdas de las tablas, las tablas y los div.
  • Inspector de estilos CSS.

Desventajas:

  • No se pueden añadir estios de forma dinámica.
Seguir

Get every new post delivered to your Inbox.