Joomla! Platform 0: Introducción

2013-05-18 - Categorías: PHP

Joomla sí, Joomla no

¿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:
  1. 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.
  2. Un servidor de páginas web: Xampp para varias plataformas o Uniform Server para Windows, portable y sin instalador.
  3. 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.

Árbol de clases del Framework

Podemos ver el árbol de clases disponibles de la Joomla! Platform en http://api.joomla.org/classtrees_Joomla-Platform.html
Para hacernos una idea de los tipos de utilidades disponibles podemos ver la organización de éstos en la documentación oficial:
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:
http://www.joomlaspanish.org/ <- Comunidad de Joomleros de habla castellana.
http://www.joomla.org/ <- La web principal de la comunidad Joomla.
http://joomla.github.io/joomla-platform/ <- Manual de la plataforma en Gihub.
http://docs.joomla.org/Portal:Platform <- Documentación oficial.
http://api.joomla.org/ <- Documentación de las API
Espero que haya dado una buena visión general de la Joomla!Platform.
Saludos!

Java Swing 10: JTable segunda parte, un poco más sobre tablas

2013-05-07 - Categorías: Java / Java Swing

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.

El código fuente

Descargar

package swing;

import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.text.MaskFormatter;

public class JavaSwing10JTable2 extends JFrame {

private static final long serialVersionUID = 1L;
private JTable tabla;
private static MiModelo modelo;

// el main...
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JavaSwing10JTable2 frame = new JavaSwing10JTable2();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

// constructor de la ventana, aquí hace todo
public JavaSwing10JTable2() {

setTitle("Java Swing 9 El JTable 2");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 846, 331);

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 {

private static final long serialVersionUID = 1L;

private static final String[] nombresColumna = { "ID", "Un decimal",
"Caja seleccionable", "Lista desplegable",
"Campo texto formateado" };

Class[] tiposColumna = { Integer.class, Double.class, Boolean.class,
JComboBox.class, JFormattedTextField.class };

// 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:

http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

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.

No dudes en dejar un mensaje.

Saludos.


¡Adelante gadgeto PDF!

2013-05-03 - Categorías: General

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:

http://es.pdf24.org/

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?

Saludos.


Java Swing 9: La madre del cordero, el JTable

2013-05-02 - Categorías: Java / Java Swing

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:

  1. Crear un nuevo proyecto Java.
  2. Añadir un JFrame que genere todo el esqueleto de la ventana.
  3. En el Swing Designer en vista de diseño poner un Absolute Layer que nos permitirá posicionar los elementos donde queramos.
  4. 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.
  5. 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:

package swing;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class JavaSwing9JTable extends JFrame {

// 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);

}
}

Descarga del código aquí.

Aclaraciones

É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:

http://docs.oracle.com/javase/6/docs/api/javax/swing/JTable.htmlhttp://docs.oracle.com/javase/tutorial/uiswing/components/table.html

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…

Saludos!

© 2024 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.