¿Debo usar un CMS para montar una web? ¿O más bien debo programar desde cero? La gran pregunta a la hora de hacer una web. Leo en algunos sitios que no hay que «reinventar la rueda», que ya tenemos disponibles unos CMS (gestores de contenido), que los ponemos online con un bonito diseño, rellenamos el contenido y ya tenemos lista una web. Pero ¿qué pasa a la larga con esa web si nos piden algo extraño?
Por otro lado podemos empezar desde cero, pero al final llegaremos tarde o temprano a usar herramientas que nos ahorrarán código como por ejemplo para enviar emails, generar PDFs o lo que sea que necesitemos. Al final podemos llegar a reunir tal conjunto de utilidades creando nuestro propio framework. Pudiera ser el caso de que disponemos de mucho tiempo, y llegásemos a desarrollar algunas de éstas utilidades nosotros mismos. Pero al final acabaríamos creando un CMS propio, con lo que estamos en el mismo punto en el que ya está Joomla! entonces pues lanzo la pregunta, ¿porqué no aprender y usar ya Joomla! y la Joomla!Platform?
Joomla y su Platform tienen detrás una gran comunidad que los mantiene. Algo bastante importante a tener en cuenta a la hora de elegir un framework. Casi toda la documentación que vengo encontrando está en inglés, así que manos a la obra me pongo a hacer mi versión en castellano, y la dejo aquí para el que le sea útil.
¿Hacia dónde va la Joomla!Platform?
Desde el 5 de Julio del 2011, el Joomla Framework se ha dividido del proyecto Joomla!, inagurando con su versión 11.1 de manera que ahora se llama Joomla!Platform y da pie a que su futuro no dependa directamente del desarrollo del CMS. Ya no sólo se va a usar para desarrollar el Joomla! Dará soporte al desarrollo del CMS pero también puede proporcionar utilidades que tal vez no se usen directamente en Joomla!.
Básicamente se trata de un conjunto de utilidades o librerías de programación, que podemos usar a la hora de crear un sitio. Se puede desarrollar una web completa, desde cero, pero dando saltos de gigante cada vez que uses las librerías del framework.
Materiales
Como mínimo necesitamos lo siguiente:
Archivo comprimido con el J!Platform. Hacemos click en el botón que pone Download y nos los descargamos donde vayamos a construir nuestro sitio de pruebas.
Un servidor de páginas web: Xampp para varias plataformas o Uniform Server para Windows, portable y sin instalador.
Un entorno de desarrollo, Eclipse, Notepad++, o cualquier otro para PHP o edición de webs.
Supongo que nos manejamos bien con PHP, sabemos usar el editor que tengamos instalado y sabemos lo que es un servidor de páginas web, configurarlo y poner en marcha un sitio local para hacer nuestras pruebas. En un post anterior sobre montar un servidor propio con Joomla! y Uniform Server expliqué todo ésto para Windows, así que me remito a él para más información. Si estás en Linux o Mac, las ideas principales son las mismas, cambiarás el editor y el servidor web pero el J!Platform es el mismo y su uso será igual.
Primera aplicación Hola Mundo
Al descomprimir el fichero del framework veremos que tenemos los siguientes directorio:
build/ Contiene información relevante para crear informes de la plataforma, puede haber procesos que guarden datos en éste directorio.
docs/ Documentación.
libraries/ Todas las libreriras PHP de la plataforma.
media/ Archivos que se usan en la parte cliente de la plataforma, es decir, se usan en el navegador del visitante.
tests/ Tests unitarios.
…y otros archivos sobre la plataforma.
PHP se puede usar en línea de comandos con la salida estandar o en una web que viene a ser el caso más usual. Me voy a centrar pues en su uso en web.
Entonces creamos un fichero en el directorio principal de nuesta web, habiendo descomprimido el framework en dicho directorio tambien. Una primera aplicación podría ser creando un fichero con extensión .php como el siguiente:
<?php
// punto de entrada seguro a la Joomla! Platform
//define('_JEXEC', 1);
require "libraries/import.php";
// la clase que va a implementar el sitio web
class HolaMundo extends JApplicationWeb
{
protected function doExecute()
{
$this->setBody("<!DOCTYPE html>
<html>
<head>
<title>Título de la página</title>
</head>
<body>
<h1>Hola Mundo!</h1>
</body>
</html>");
}
}
// crea el objeto si no se ha creado antes
$app = JApplicationWeb::getInstance('HolaMundo');
// ejecuta y muestra por la salida la página
$app->execute();
Puedes descargar aquí el código. Y usarlo en tu servidor web para ver el funcionamiento. Al ejecutar en el navegador ésta pequeña aplicación debemos ver algo tal que así:
Hola Mundo!
Se puede ver que simplemente descomprimiendo el fichero e importando las librerias con el require ya podemos usar J!Platform en nuestra aplicación.
Tenemos de todo, para enviar emails, manejar bases de datos, manejo de sesiones, las galletas, para manejar ficheros, etcétera… no tenemos más que crear objetos de las clases proporcionadas y a usarlos en nuestras aplicaciones.
Más información
Para más información hay muchas páginas de Internet que hablan de todo ésto, pero recomiendo además de las anteriores:
Siguiendo los minitutoriales de la serie Swing, he desarrollado éste post sobre tablas para aprender a usar un poco más las tablas. Vamos al grano. Introducción
Es necesario:
Entorno de Desarrollo.
El JDK o JRE, yo he usado el JDK 1.7, pero ya Swing no sigue en desarrollo así que no tiene mucha importancia la versión que uses.
Trato de explicar cómo poner cajas seleccionables (checkbox), listas desplegables (combobox) y cajas de texto formateado, en una tabla. En el ejemplo he puesto una caja que sólo admite un número de 3 dígitos. Más adelante lo vemos.
Para manejar los datos puedes usar directamente el modelo de datos que autogenera un JTable, puedes usar un AbstractTableModel como aparece en muchos de los tutoriales que he encontrado por Internet, o puedes usar una implementación de DefaultTableModel, que internamente usa un vector con el que te permite añadir o borrar filas de forma dinámica. Yo he usado un DefaultTableModel que me ha parecido más interesante porque muchas veces necesitamos añadir o borrar datos de una tabla.
getContentPane().setLayout(null); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 11, 810, 271);
getContentPane().add(scrollPane);
// usa mi modelo de datos modelo = new MiModelo(); // crea la tabla con mi modelo tabla = new JTable(modelo);
// scrollPane.setViewportView(tabla);
// EDITORES PERSONALIZADOS EN LA TABLA // la caja seleccionable, el checkbox lo pone sólo // con la función getColumnClass TableCellEditor editor;
// configura el combo JComboBox comboBox = new JComboBox(); comboBox.addItem("Opción A"); comboBox.addItem("Opción B"); comboBox.addItem("Opción C");
// configura el campo de texto JFormattedTextField campoTexto = null; try { // sólo admite 3 números campoTexto = new JFormattedTextField(new MaskFormatter("###")); } catch (Exception e) { System.out.println(e.getMessage()); }
// combo a la columna 3 editor = new DefaultCellEditor(comboBox); tabla.getColumnModel().getColumn(3).setCellEditor(editor);
editor = new DefaultCellEditor(campoTexto); tabla.getColumnModel().getColumn(4).setCellEditor(editor);
// capturador de eventos del ratón en la tabla // autogenerado con Eclipse tabla.addMouseListener(new MouseListener() {
@Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub
}
@Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub
}
@Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub
}
@Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub
}
@Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub
int fila = tabla.rowAtPoint(e.getPoint()); int columna = tabla.columnAtPoint(e.getPoint());
JOptionPane.showMessageDialog(null, "Valor de la celda: " + tabla.getValueAt(fila, columna).toString()); } });
}
// modelo de datos, usa DefaultTableModel que internamente // tiene un vector que nos permite por ejemplo añadir una fila // fácilmente con addRow... private static class MiModelo extends DefaultTableModel {
// constructor de la clase, simplemente pone unos datos en el vector de // datos. public MiModelo() { super(nombresColumna, 0);
// carga unos datos iniciales... for (int i = 0; i < 10; i++) {
Object[] aux = { i, Math.random(), i % 2 == 0, "Opción A", "123" };
addRow(aux);
} }
@Override public Class getColumnClass(int columnIndex) { // necesario para que dibuje la tabla con los tipos de columna return tiposColumna[columnIndex]; }
}
}
También he añadido la captura de eventos del ratón. Al escribir tabla.addMouseListener(new Mouse… podemos usar la combinación de teclas Ctrl + espacio y Eclipse nos intentará autogenerar el código. Ésto mismo se puede usar en cualquier momento, si Eclipse detecta que estás escribiendo algo que conoce te lo pone en un listado o si sabe seguro lo que vas a escribir lo autogenera. Es un comportamiento muy útil.
Explicaciones
He usado un DefaultTableModel que internamente tiene un vector de filas, para poder usar la función addRow() y así simplificar todo un poco que para eso está la clase DefaultTableModel.
La historia de configurar la tabla está en la clase MiModelo, espero haber dejado lo bastante comentado el código como para no explicar de nuevo aquí lo que hace. De todas formas si queda duda, mensaje aquí abajo que lo contesto en cuanto pueda.
Podemos obtener el vector de datos de la forma:
Vector data = modelo.getDataVector();
Hay muchas funciones interesantes que nos permitirán hacer lo que necesitemos. Para hacerse una idea, en mi Eclipse pongo modelo. y se me despliega el listado de funciones que tengo disponibles:
Tenemos la que ya he dicho addRow para añadir una fila, getRowCount que devuelve el número de filas, y muchas más. Algunas funciones necesitan un post entero para explicarlas así que lo dejaré aquí.
Donde pone tabla.addMouseListener(… está todo lo relacionado con el ratón. Podemos programar acciones para cuando se hace click, cuando se aprieta el botón, cuando se libera, etcétera…
Sobre los editores personalizados en una tabla hay que decir que admite cajas chequeables, listas desplegables y campos de texto. Además se pueden crear nuevos editores, como por ejemplo el que cita en la documentación oficial de un editor de celda que nos permite elegir entre una tabla de colores.
Más información
Me remito como siempre a la documentación oficial:
De todas formas hay muy buena información en otras páginas web, espero que si has leido éste tutorial por lo menos te haya aclarado algo, o te sirva el código fuente.
Curioseando un programa que utilizo últimamente, el PDF24 Creator, además de en Windows he visto que tenía un Gadget para añadir en Blogger, es decir aquí. Así que lo he puesto en el menú para poder descargar una versión en PDF de lo que sea que esteis viendo en el blog. Lo teneis en la sección PDF para generar un fichero si es que te quieres guardar algo de lo que publico aquí.
Es un programa de Windows, 100% gratuito según reza en su página web donde lo teneis en descarga:
Funciona muy bien, te escanea documentos y los guarda a PDF de manera muy simple, puedes crear documentos de varias páginas, también instala una impresora virtual con la que puedes imprimir desde cualquier programa y te genera un documento. En fin, lo que he probado funciona muy bien y me ha sido muy útil. Todo un complemento digno de mención, y 100% gratis.
Lo único que le hecho en falta, aunque no lo he necesitado mucho la verdad, es un editor PDF con el que se puedan editar el contenido de un documento. Eso sí, a fecha de hoy lo que se puede hacer es mover las páginas de orden, de un documento a otro, pero no se puede editar una página en sí.
Buena herramienta de todas formas, seas programador o no. ¿He comentado que es 100% gratis?
Siguiendo con los minitutoriales de Swing, ha llegado la madre del cordero del manejo de datos. Tarde o temprano necesitamos visualizar, modificar, borrar o guardar datos. Podemos hacer formularios, recorrer tablas guardadas en variables ocultas, usar listas, al final la manera más simple de mostrar muchos de éstos datos es una tabla, que en Swing se llama JTable.
Para seguir éste tutorial hace falta, un entorno de desarrollo (por ejemplo Eclipse), el JDK o el JRE, y un poco de paciencia xD
Si eres un máquina entonces descárgate directamente el código y no te olvides de visitarme de vez en cuando, a ver si aumentan las visitas =)
A saber
Antes de empezar hay que saber que un JTable es un componente Swing, que va a visualizar unos datos que se almacenan internamente en una variable de tipo TableModel. No se recomienda usar directamente pero si no lo necesitamos para qué vamos a complicarnos más la vida en usar otros métodos. Lo he usado para no complicar el ejemplo.
En el ejemplo se va a usar un DefaultTableModel el cual va a guardar referencia del TableModel que tiene la tabla. Entonces cuando se modifica, en éste caso añadiendo más filas, automáticamente la tabla se redibuja y muestra los datos actualizados. Se recomienda usar un AbstractTableModel para manejar los datos pero eso es otro tema.
Comenzando
Gran parte del código se puede generar con Eclipse. Así que los pasos a seguir para emepezar son:
Crear un nuevo proyecto Java.
Añadir un JFrame que genere todo el esqueleto de la ventana.
En el Swing Designer en vista de diseño poner un Absolute Layer que nos permitirá posicionar los elementos donde queramos.
Poner un JScrollPane y dentro de él el JTable, de esta manera si la tabla crece más que lo que vemos apareceran barras de scroll como las de la imagen anterior.
El botón de abajo que meterá contenido en la tabla.
Hecho ésto hago doble click en el botón y me muestra todo el código recién generado listo para seguir implementando.
El código
A continuación el código lo más legible que he podido poner:
// versión private static final long serialVersionUID = 1L;
// la tabla private JTable table;
// el modelo de tabla, aquí van a estar los datos. private DefaultTableModel model;
// función principal public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JavaSwing9JTable frame = new JavaSwing9JTable(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }
// constructor del frame que contruye toda la ventana... public JavaSwing9JTable() { //título setTitle("Java Swing 9 El JTable"); // cuando cerramos la ventana se cierra la aplicación por completo setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // dimensiones y posición setBounds(100, 100, 596, 331); // establece una capa absoluta para posicionar los elementos donde queramos getContentPane().setLayout(null);
// el panel con barras de scroll automáticas JScrollPane scrollPane = new JScrollPane(); // dimensiones y posición del panel de scroll scrollPane.setBounds(10, 11, 560, 227);
// se añade el panel de scroll a la ventana getContentPane().add(scrollPane);
// nombre de las columnas String[] columnNames = { "ID", "Un dato", "Otro dato" };
// creo un modelo de datos, sin datos por eso 'null' y establezco los // nombres de columna model = new DefaultTableModel(null, columnNames); // creo la tabla con el modelo de datos creado table = new JTable(model);
// se pone la tabla en el scroll scrollPane.setViewportView(table);
// código del botón JButton btnAadirLnea = new JButton("Meter contenido"); btnAadirLnea.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
// aquí se añaden datos a la tabla for (int i = 0; i < 100; i++) {
// creo un vector con una fila Object[] aux = { i, i * 34, Math.random() };
// añado la fila al modelo model.addRow(aux);
}
} }); // dimensiones y posición del botón btnAadirLnea.setBounds(10, 249, 267, 23); // pongo el botón en la ventana getContentPane().add(btnAadirLnea);
Ésta es la forma más simple que he encontrado de usar una tabla de Swing. El paso siguiente es usar un AbstractTableModel, crearnos una clase que la implemente, con la que podemos entonces hacer cosas como meter cajas seleccionables o cuadros desplegables en las filas.
Más información
Hay mucha información en Internet, me remito primero a la documentación oficial, está en inglés y es muy extensa:
Espero que sirva. En próximos posts espero ver cómo controlar los clicks del ratón, esos temas que citaba de la clase AbstractTableModel, formularios maestro-detalle, etcétera…