No existe ninguna imagen

Posts Tagged ‘Programación’

Buenas prácticas al escribir código usando Dreamweaver (primera parte)

Martes, noviembre 30th, 2010

Ya sé que existe mucha información en la web acerca de este tema, pero no creo que hayan muchos enfocados a Dreamweaver. Este artículo forma parte de una serie dedicada a promover el uso de estándares al escribir código para tecnología web usando Dreamweaver. Escribo específicamente acerca de DW por varias razones:

  1. Primero que nada, aunque es la razón menos importante, es el editor que más uso. Digo que es la menos importante ya que el escribir siguiendo los estandares no es algo que tenga que ver con tal o cual editor, lo menciono ya que estaré demostrando como utilizar funciones específicas de DW para lograr estos resultados.
  2. Como ya he dicho antes, debido a sus capacidades WYSIWYG DW es uno de los editores web mas utilizados por personas sin mucha experiencia escribiendo código. Debido a esto muchos de los usuarios de DW no están familiarizados con estos conceptos. Este es el grupo al cual va dirigido este artículo.
  3. También debo agregar que, aunque la manera de lograr los resultados que queremos se relacionan con DW, los conceptos generales no se relacionan con ningún editor web.

Voy a empezar con los siguientes consejos:

Valida tu código HTML/CSS

Creo que lo más importante es tener el mayor control posible del código que escribes. Las posibilidades de perder ese control aumenta mientras aumenta el tamaño del proyecto. Es por eso que verificar que el código es valido en todas las etapas del proyecto es importante. Un código válido ayuda a disminuir los problemas de visualización de las páginas. También ayuda a que las páginas se vean de forma más homogénea en todos la mayoría de los navegadores.

DW posee herramientas para hacer validaciones HTML pero siempre he considerado que no son muy buenos. Se puede validar el XHTML usando el comando: File -> Validate -> As XML, pero muchas veces no funciona de forma deseada. Mi recomendación es usar el Validador de la W3C para realizar validaciones (X)HTML y el Validador de CSS para las hojas de estilo. Recomiendo el uso del Webmaster Toolbar para hacer validaciones sin la necesidad de ir a la página de la W3C. También te da la posibilidad de validar documentos en tu servidor local:

El uso del validador también ayuda a fortalecer el conocimiento del HTML y CSS. El validador provee siempre una explicación detallada del problema, por ejemplo:

Si usamos Google Translate para traducir la página podemos ver el problema claramente:

Por último, es bueno tener en cuenta que el validaror es una herramienta. Te ayuda a tener un control de código. Para ser sincero, yo repudio el uso de “hacks” CSS (mayormente aplicados a Internet Explorer 6), pero también pienso que cada programador tiene el derecho a utilizar los recursos necesarios mientras entienda las consecuencias y mientras (de nuevo) tenga control de su código.

Como nombrar los archivos

Esto es algo que tampoco tiene que ver con DW y que también que se ha discutido bastante pero me parece que no está de más mencionarlo aquí debido a las veces que he visto a usuarios de DW tener problemas por a la mala forma de nombrar archivos dentro de un servidor.

Al momento de nombrar cualquier tipo de archivo que será incluido en el servidor (.html, .jpg, .php, .js, etc) es importante tener en cuenta las siguientes consideraciones:

  1. El nombre del archivo sólo debe poseer caracteres de la a a la z (sin incluir la ñ ni letras con acento), números del 1 al 9, underscore (_) y guiones (-).
  2. Los nombres deben ser únicos en cada directorio. Esto debería ser algo obvio ya que ningún sistema operativo permite tener dos archivos que se llamen iguales en un directorio, pero también tenemos que tener en cuenta que Windows no puedes usar nombres iguales sin importar mayúsculas mientras que en sistemas operativos tipo UNIX (Linux por ejemplo) sí se permite.
  3. También es bueno escoger una manera de remplazar los espacios en blancos y usar esta “convensión” siempre. Ejemplos para eso: usar underscore (nombre_archivo.html), usar guión (nombre-archivo.html), usar mayúsculas (algo que es menos usado) (nombreArchivo.html). Yo suelo usar la la segunda opción ya que pienso que es más fácil de leer.

Usar texto alterno (alt) para las imágenes

El uso del atributo alt en las los tags <img /> (imágenes) y <area /> (área) es requerido ya que es necesario proveer un una explicación alterna en casos que las imágenes no pueden ser visualizadas correctamente o si el contendido está siendo visto por alguna persona con algún tipo de impedimento visual.

Al momento de insertar una imagen DW te pide primero que nada que especifiques un texto alterno y, de forma opcional, una descripción más extensa:

Si decides no hacerlo en ese momento sólo necesitas dar clic al botón de cancelar. Siempre podrás agregar o cambiar el Texto ALT si le das clic a la imagen específica y buscas en el Panel de Propiedades el campo Alt:

Usar Labels correctamente en los formularios

Los label son básicamente etiquetas que se asignan a los inputs (text, checkboxes, radio boxes, etc), textareaselect menus. Su propósito es describir el uso del campo, por ejemplo, en este caso el label del campo “name” es “Name” (Imagen sacada de los ejemplos de dialog de jQueryUI):

Label 1

Parecería obvio el hecho de que se deben proveer instrucciones específicas para el usuario al momento de llenar una formulario, pero si tomamos en cuenta la manera como los elementos están organizados en la página (page flow) muchas veces la relación label/campo no es tan evidente. Esto es un problema mayor si el usuario posee un impedimento visual. Es por eso que es importante hacer que esta relación sea lo más clara posible.

Hay dos formas de crear esta relación:

  1. Meter el campo dentro del elemento label:
    <label>Nombre
    <input id="nombre" name="nombre" type="text" />
    </label>
    
  2. Igualar el valor del atributo for del label al iddel campo.
    <label for="nombre">Nombre</label>
      <input type="text" name="nombre" id="nombre" />
    

Ambas prácticas son perfectamente válidas aunque, según mi experiencia, en  la mayoría de los casos se usa la segunda opción ya que es mucho más flexible. DW provee la funcionalidad para utilizar ambos métodos. Si estás en vista de diseño y le das al botón de agregar un campo de formulario DW pregunta primero si vas a utilizar un label con el campo:

Las opciones son:

  • ID: el id del campo que vas a crear, por ejemplo: nombre (los id en html tienen que ser únicos en cada página. Se siguen las normas de nombrar un archivo pero además sólo se puede empezar con una letra).
  • Label: El label (etiqueta) del campo, por ejemplo: Favor de especificar su nombre.
  • Estilo (Style): Aquí escogeremos uno de los métodos explicados anteriormente : 1-usar el atributo for y 2-incluir el campo dentro del label o 3-optar no usar label.
  • Posición (Position): Indica la posición del label: 1-antes del campo o 2-después del campo.
DW también posee campos para el access key y el tab key, pero eso lo discutiremos en otra ocasión.

Escogido sencillo o múltiple de una lista usando jQuery (Primera parte)

Miércoles, mayo 12th, 2010
*Nota: Esta es la primera parte de una serie (espero que sea de dos partes). Me pareció indicado primero mostrar cual es el resultado que idealmente queremos mostrar al usuario. La segunda parte espero discutir el tema de como hacer que todo funcione sin el uso de javascript

Estuve pensando un buen rato antes de decidirme en usar este título. Espero que sea evidente lo que quiero decir una vez vean el demo.

Como había mencionado antes, he estado trabajando en el nuevo C.M.S. el cual remplazará el que actualmente ofrezco a mis clientes. He estado buscando como aprovechar jQuery UI al máximo y una de ellas es el escogido de categorías, ya sea de productos o cualquier otro tipo. Antes usaba algo tan sencillo como un “dropdown menu” dinámico que listaba todas las categorías y el usuario podía escoger una de ellas. Debido a la necesidad de implementar funcionalidad adicional (mostrar sub-categorías, multi-selección de categorías) recurrí a varios métodos los cuales no me convencieron. Al comenzar de nuevo me di la oportunidad de re-plantear este problema. Este es el resultado de este experimento.

La solución es básicamente algo que he estado usando constantemente últimamente: Una lista no ordenada HTML (<ul>) y, para complementar, un jQuery dialogUI. De esa manera puedo organizar las categorías y las sub-categorías y mostrarlas de una forma más visiblemente organizada. También utilizo el plugin jQuery treeview para mantener la lista organizada.

El HTML es bastante simple (aunque se va a complicar un poco más en la segunda parte):

<a href="#" id="dialog_link">Escoja</a><span id="lable_cat_act"></span>
<div id="categ_container">
  <ul class="categoririas_list_ul">
    <li><a href="#nowhere">Lorem</a>
      <ul>
        <li><a href="#nowhere">Lorem</a></li>
        <li><a href="#nowhere">Aliquam</a></li>
        <li><a href="#nowhere">Morbi</a></li>
        <li><a href="#nowhere" >Praesent</a></li>
        <li><a href="#nowhere">Pellentesque</a></li>
      </ul>
    </li>
    <li><a href="#nowhere">Aliquam</a>
      <ul>
        <li><a href="#nowhere">Lorem</a></li>
        <li><a href="#nowhere">Aliquam</a></li>
        <li><a href="#nowhere">Morbi</a></li>
        <li><a href="#nowhere" >Praesent</a></li>
        <li><a href="#nowhere">Pellentesque</a></li>
      </ul>
    </li>
    <li><a href="#nowhere">Morbi</a></li>
    <li><a href="#nowhere" >Praesent</a></li>
    <li><a href="#nowhere">Pellentesque</a></li>
  </ul>
</div>
<input type="hidden" name="categorias" id="categorias" class="categorias" />

En este caso lo que hago es guardar el valor en input para que se pueda enviar el valor ya sea usando el formulario o por medio de ajax:

<input type="hidden" name="categorias" id="categorias" class="categorias" />

Primero incorporamos jQuery, jQuery UI y el treevire pluing, y las hojas CSS correspondientes:

<link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.1.custom.css" />
<link rel="stylesheet" type="text/css" href="js/jquery-treeview/jquery.treeview.css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js" type="text/javascript"></script>
<script src="js/jquery-treeview/jquery.treeview.min.js" type="text/javascript"></script>

Al principio intenté utilizar el selectable de jQuery UI pero tuve algunos problemas tratando de que se seleccionen sólo los enlaces y también debido a que la listas eran mul-tinivel. Es por eso que decidí trabajar el código que realmente necesito.

Primero asignamos los dialogs y las opciones:

//opciones de ambos dialogs
$("#categ_container").dialog({
	autoOpen: false,
	modal: true,
	height: 400,
	buttons: {
		"Ok": function() {
			$(this).dialog("close");
		}
	}
});

//categorias sencillas
$("#dialog_link").click(function(){
	$("#categ_container").dialog("open");
	return false;
});

Dependiendo si es escogido sencillo o múltiple el código varía. Para el escogido sencillo:

//para categorias sencillas
$('#categ_container a').click(function(){

	var linkActivo = $(this);
	var htmlActual = $(this).html();
	var categoria = linkActivo.next().val();

	$('#categ_container a').removeClass('cat_selected');
	linkActivo.addClass('cat_selected');
	$('#sub-categoria').attr('value', categoria);
	$('#lable_cat_act').html(htmlActual);
	$('#categorias').val(htmlActual);

	return false;
})

Para el escogido múltiple:

//para categorias multiples
$('#categ_container a').click(function(){
	var linkActivo = $(this);
	var categoria = '';
	var htmlActual = '';

	linkActivo.toggleClass('cat_selected');

	$('#categ_container a.cat_selected').each(function(){
		var enlace = $(this);
		var coma = ', ';
		htmlActual += enlace.text() + coma;
		categoria += enlace.next().val() + ' ';

	});

	$('#sub-categoria').attr('value', categoria);
	$('#lable_cat_act').html(htmlActual.slice(0,-2));
	$('#categorias').val(htmlActual.slice(0,-2));

	htmlActual = '';
	categoria = '';

	return false;

})

Con este código puedes tener una de las dos opciones en una misma página. Para tener los dos a la vez puedes ver ejemplo que ofrezco en el demo.

jFileBrowser para TinyMCE . Sube y maneja archivos usando TinyMCE, PHP y MySQL

Viernes, marzo 5th, 2010

jFileBrowser_thumb

Desde hace tiempo tenía el deseo de compartir este plugin. Viene al caso decir que yo uso TinyMCE como editor web del C.M.S. costumizado que ofrezco a mis clientes. El editor es excelente, pero tiene un gran problema: El plugin para subir/editar archivos  no es gratis. Tanto MCImageManager como MCFileManager son soluciones de pago. Después de múltiples fracasos tratando de implementar soluciones gratis decidí tratar de hacer un plugin yo mismo. También me gustaba la idea de almacenar las rutas de las imágenes y otro tipo de información en una base de datos. De esta manera podría fácilmente agregar un buscador, o mayor organización a los archivos, algo que cuesta un poco más de trabajo (por lo menos para mí) al trabajar directamente con archivos del ftp.

Yo no estoy acostumbrado a trabajar con javascript pero, afortunadamente, TinyMCE posee excelente documentación sobre como crear un plugin. Debido a mi limitado conocimiento de javascript no pude hacer algunas cosas como usar ajax al mostrar contenido, pero aún así quedé bastante contento con el resultado.

Debo agradecer a okram por crear las librerías PHPPaging y PHPImagen, las cuales no sólo he usado en este pluging, sino también en muchos de mis proyectos.  Gracias también a Mark James por sus exelentes íconos.

Características del plugin:

  • Creación de directorios virtuales
  • Subir varios tipos de archivos
    • Imágenes (jpg, gif y png)
    • Documentos PDF
    • Documentos Word
    • Documentos Excel
    • Documentos PowerPoint
    • Documentos .txt
  • Creación automática de thumbnails para la organización (PHPImagen)
  • Uso de paginación de los directorios y archivos (PHPPaging)
  • Vistas de thumbnails y listado de los archivos
  • Búsqueda por nombre de archivo

Requerimientos:

  • PHP5 o más reciente
  • MySQL 4 o más reciente
  • Librería GD para PHPImagen

Lista de cosas a mejorar:

  • Cambiar navegación y la forma de mostrar contenido a Ajax
  • Poder subir múltiples archivos
  • Poder subir y crear thumbnails a videos

Instalación:

  1. Descomprimir el archivo zip en la carpeta de tiny_mce/plugin
  2. Crear las tablas en tu base de datos MySQL. Usa el archivo jFileBrowser.sql provisto en el zip.
  3. Encuenta el archivo include/config.inc.php y cambia las siguientes lineas por tu información de tu base de datos
    $sql_db = 'Base_de_datos';
    $sql_user = 'Usuario';
    $sql_password = 'Password';
    
  4. Agrega lo sigiente en tu tinyMCE.init():
    añade jfilebrowse a la lista de plugins

    plugins : "jfilebrowser"
    

    añade jfilebrowse a la lista de botones

    theme_advanced_buttons1 : "jfilebrowser"
    
  5. Cambiar los permisos de la carpeta:
    tiny_mce/plugins/jfilebrowser/archivos/

    a 777, osea, que se pueda leer y escribir.