Sigueme en Twitter

Archivo de artículos en la categoría "Programación"

Ir al inicio

Elements en Helpers de CakePHP

19/04/2008

Tanto como no se debe de usar un Model dentro de un Component, tampoco se debe de usar un Element dentro de un Helper, aun así, si tienes una situación especial donde debes de hacerlo, lo puedes lograr de la siguiente manera.

1
2
$vista = ClassRegistry::getObject('view');
$vista->renderElement('nombre_elemento');

CakePHP te pone las reglas (y para tu propia sanidad, deberías de seguirlas), pero no te limita a ellas.

Sin Comentarios

Validando XMLs contra XSD en Linux

26/03/2008

Un archivo XSD (XML Schema Definition) contiene una serie de patrones que un archivo XML debe de cumplir para ser considerado ‘valido’ de acuerdo a ese esquema.

Si estas en linux, puedes utilizar el parser de XML de manera muy sencilla y ahorrarte el tener que perderte entre las decenas de opciones para validación.

xmllint –schema esquema.xsd archivo.xml

Si por alguna razón no puedes usar este útil comando, la W3 y XML.com sugieren muchas (pero muchas) herramientas que nos sirven, y sino siempre esta Don Google que no se raja.

Sin Comentarios

Utilizando Prototype correctamente

11/03/2008

Leyendo Quest’s Blog, me encontré un par de artículos de Perfection Kills, que dan unos tips acerca del uso básico de Prototype.

El primero en especial me parece muy útil, a pesar de que son cosas muy simples son errores que todos cometemos al principio, ¿Seamos sinceros, que tantos se chutan toda la documentación antes de empezar a programar?

Me servirá de recordatorio así que me he tomado la libertad de publicarlo:

Errores comunes con Prototype

1.

Modo Incorrecto

1
document.getElementById('foo')

Modo Correcto

1
$('foo')

El operador $ es lo mas esencial de Prototype, de ahí viene toda su magia, utilizalo!

2.

Modo Incorrecto

1
2
var woot = document.getElementById('bar').value
var woot = $('bar').value

Modo Correcto

1
var woot = $F('bar')

El operador $F es un gran atajo para obtener valores de elementos.

3.

Modo Incorrecto

1
2
$('footer').style.height = '100px';
$('footer').style.background = '#ffc';

Modo Correcto

1
2
3
4
5
6
$('footer').setStyle(
  {
      height: '100px',
      background: '#ffc'
  }
)

Olvidate de problemas de bugs sobre diferentes navegadores si utilizas el metodo setStyle()

4.

Modo Incorrecto

1
$('tusuperelemento').innerHTML = 'algun contenido'

Modo Correcto

1
$('tusuperelemento').update('algun contenido')

Podras decir que es casi la misma, pero no opinaras lo mismo cuando necesites concatenar funciones.

5.

Modo Incorrecto

1
new Ajax.Request('ninja.php?weapon1=foo&weapon2=bar')

Modo Correcto

1
2
3
4
5
6
7
8
9
new Ajax.Request('ninja.php',
  {
    parameters:
      {
        weapon1: 'foo',
        weapon2: 'bar'
      }
  }
)

Escribe código limpio, tu cerebro te lo agradecerá.

6.

Modo Incorrecto

1
2
3
4
5
6
7
8
new Ajax.Request('blah.php',
  {
    method: 'POST',
    asynchronous: true,
    contentType: 'application/x-www-form-urlencoded',
    encoding: 'UTF-8',
  }
)

Modo Correcto

1
new Ajax.Request('blah.php')

Todos esos parámetros ya son defaults, ¿Para que repetirlos?.

7.

Modo Incorrecto

1
Event.observe('myContainer', 'click', doSomeMagic)

Modo Correcto

1
$('myContainer').observe('click', doSomeMagic)

Es mas fácil concatenar si escoges el segundo, pero aquí es cuestión de gustos, escoge el sabor que mas te guste.

8.

Modo Incorrecto

1
2
3
4
5
$$('div.hidden').each(function(el)
  {
    el.show();
  }
)

Modo Correcto

1
$$('div.hidden').invoke('show')

Invoke es muy útil, piensa en el como en un atajo cuando necesitas asignar valores iguales a todos tus elementos sin necesidad de iterar sobre ellos.

9.

Modo Incorrecto

1
2
3
4
5
$$('div.collapsed').each(function(el)
  {
    el.observe('click', expand);
  }
)

Modo Correcto

1
$$('div.collapsed').invoke('observe', 'click', expand)

Y también puede ser usado para manejo de eventos, muy practico!

10.

Modo Incorrecto

1
2
$$('input.date').invoke('observe', 'focus', onFocus);
$$('input.date').invoke('observe', 'blur', onBlur);

Modo Correcto

1
2
3
$$('input.date')
  .invoke('observe', 'focus', onFocus)
    .invoke('observe', 'blur', onBlur)

¿Para que abusar del operador $$ dos veces si podemos concatenar?

11.

Modo Incorrecto

1
2
3
4
5
6
$('productTable').innerHTML = 
  $('productTable').innerHTML + 
  '<tr><td>' + productId + ' '
  + productName + '</td></tr><tr><td>' 
  + productId + ' ' + productPrice + 
  '</td></tr>'

Modo Correcto

1
2
3
4
5
6
7
8
9
10
11
var rowTemplate = new Template('<tr><td>#{id} #{name}</td></tr><tr><td>#{id} #{price}</td></tr>');
  $('productTable').insert(
    rowTemplate.evaluate(
      {
        id: productId,
        name: productName,
        price: productPrice
      }
    )
  )
)

Este tip en especial es una joya, con Prototype podemos hacer templates, evitando de esta manera enormes plastas de código. Me confieso culpable de no haber utilizado esto antes.

Enlace | How well do you know prototype

5 Comentarios

Usando funciones de MySQL en CakePHP

11/03/2008

Algo que me atraso en la madrugada era que CakePHP escapa todas las condicionales que le mandas en una consulta SQL, y si la condicional de casualidad esta formada con una funcion de MySQL, esta obviamente no se ejecuta.

Por ejemplo, esto no funcionara: (busca que el campo created sea mas reciente que hace 1 día)

1
2
3
4
5
$conditions = array
    (
        "created" => "> date_sub( curdate(), interval 1 day)"
    );
$this->Model->findAll( $conditions, null, "depart_date ASC");

Para evitar esto CakePHP implementa un operador mágico “-!” que le indica no escapar esa sentencia y nuestra consulta se ejecute como pretendemos.

1
2
3
4
5
$conditions = array
    (
        "created" => "> -!date_sub( curdate(), interval 1 day)"
    );
$this->Model->findAll( $conditions, null, "depart_date ASC");

Voilà!

3 Comentarios

Eclipse y sus problemas con Java en Linux

10/02/2008

Eclipse tiene algún problema para correr aplicaciones gráficas que corren con librerías de Swing en Java 5 (1.5), a pesar de que el código este bien y corra perfectamente normal si lo compilas y lo corres desde consola, al correrlo sobre Eclipse solo conseguirás que cualquier menú gráfico como un simple Input Dialog se bloquee.

Input Dialog

Este problema se soluciono con Java 6 (1.6), así que es recomendable actualizar, en Ubuntu puedes conseguir el paquete de Sun en el repositorio.

sudo aptitude install sun-java6-jdk

Enseguida puedes seleccionar que versión de Java esta utilizando tu sistema.

sudo update-alternatives –config java

Y finalmente configurar tus projectos existentes en Eclipse para que funcionen con la nueva versión.

Window -> Preferences -> Java -> Installed JREs

Agregando Java 6

2 Comentarios

Problemas de conexión entre Java y MySQL

9/02/2008

Dato cultural que me traia loco un buen rato.

Si estas usando el driver de JDBC para conectarte a una base de datos MySQL desde Java y estas teniendo esta excepción al simplemente iniciar la conexión:

Exception: Error during query: Unexpected Exception: java.io.CharConversionException message given: null

Pueden ser dos cosas:

  • Estas usando java 1.4, si es asi, solo actualiza a java 1.5 y problema solucionado.
  • No tienes seteado utf8 en la configuración de MySQL, modifica tu archivo my.cnf (/etc/mysql/) y agrega los siguientes parametros, reinicia MySQL después de eso y listo.

[client]
default-character-set=utf8

[mysqld]
default-character-set=utf8

4 Comentarios

Wt Framework de desarrollo web en C++

14/08/2007

Wt es un framework de desarrollo web que incluye su propio servidor web, si eres un empedernido desarrollador de C posiblemente te sera muy útil.

Especialmente si eres alguien que no tiene interes alguno en aprender a utilizar lenguajes interpretados que normalmente usamos los mortales (php, ruby, python, etc) o te importa poco lo que signifique DHTML, javascript, CSS, AJAX, ETC. Wt se encarga de la presentación y tu de la funcionalidad y los contenidos.

De los 11 beneficios que menciona el autor, el único que considero 100% válido es el portar viejas aplicaciones de escritorio en C++ a web fácilmente, pero de cualquier manera esta muy interesante el proyecto,

También existen otras opciones, como Tntnet, que es un servidor web que te permite crear templates con código de C++ embebido por medio de tags, tal como lo hace PHP o ASP.

Este es el código, de ejemplo en un simple Hello World con un Botón (clic para verlo funcionando).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
 * Copyright (C) 2006 Wim Dumon
 */
 
#include <WApplication>
#include <WContainerWidget>
#include <WText>
#include <WPushButton>
 
using namespace Wt;
 
// Este es el punto de entrada para nuevas sesiones
//
// Esta funcion se ejecuta cuando un nuevo usuario navega en la aplicacion,
// y despues que la libreria ha negociado el soporte para el navegador.
// Debe regresar un nuevo objeto WApplication
 
WApplication *createApplication(const WEnvironment& env)
{
  // Instanciando a la aplicacion Wt.
  WApplication *appl = new WApplication(env);
 
  // Estableciendo el titulo de la aplicacion
  appl->setTitle("Hello world!");
 
  // Se pueden agregar Widgets a un padre llamando addWidget()...
  // WApplication::root() es un WContainerWidget que esta asociado con
  // la ventana completa del navegador.
  appl->root()->addWidget(new WText(L"<h1>Hello, World!</h1>"));
 
  // .. o especificando un pariente en la construccion
  WPushButton *Button = new WPushButton(L"Quit", appl->root());
 
  // Escuchar eventos del usuario usando un mecanismo de señales. 
  Button->clicked.connect(SLOT(appl, WApplication::quit));
 
  return appl;
}
 
int main(int argc, char **argv)
{
   return WRun(argc, argv, &createApplication);
}

Prefiero mil veces usar algo para lo que fue hecho originalmente en lugar de complicar las cosas, pero nunca esta de mas saberlo.

12 Comentarios

Helpers dentro de controllers en CakePHP

9/08/2007

Esto es cochino, sucio y hay 99% de posibilidad de que si necesitas hacer esto, estes en un error de conceptos y lo que intentes hacer se pueda hacer mejor de otra forma.

Los Helpers fueron pensados para ser usados dentro de las Vistas. Punto.

Aún asi no deja de ser interesante el saber como utilizarlos dentro de un Controller, quien sabe, talvez algún día te saque de algún apuro.

1
2
3
4
5
6
7
class UsersController extends AppController {
    function index() {
        loadHelper('Html');
        $html = new HtmlHelper();
        debug($html->link('Un buen link', 'http://cakephp.org'));
    }
}

Vía | CakeBaker

6 Comentarios

Depura tus Hojas de Estilo

25/07/2007

Mike ha sacado un servicio bastante útil, cuantas veces no nos pasa que estamos modificando una hoja de estilos mientras desarrollas un diseño y al ir cambiando tus puntos de vista muchas quedan sobrando.

CSS Redundancy Checker

CSS Redundancy Checker sirve precisamente para detectar cuales son los estilos que tenemos de sobra, solo pasale la dirección de tu hoja de estilo, la dirección de la página que quieres checar y listo.

Un punto a tomar en cuenta, es que no detecta los estilos que asignas con javascript, lo cual es muy común en estos dias de ajaxmanía, asi que ten cuidado al borrar un estilo que si puedas estar utilizando.

Un link mas para delicio.us obligado.

Sin Comentarios

Tutorial de programación utilizando Java

17/07/2007

Esta es una excelente introducción a la programación, para quien se este iniciando, desde cosas simples como explicaciones sobre diferentes tipos de variables, hasta conceptos Orientados a Objetos. Todos breves y bien explicados.

También le puede ser muy útil a quien ya sabe programar pero desee enterarse de como se hacen las cosas con Java.

Por cierto, In English.

Introduction to Programming Using Java

2 Comentarios