Entradas con la etiqueta ‘codigo’

Generar códigos de barras con PHP y PEAR:Image_Barcode. (Y, sobretodo, como cambiar la altura del código de barras)

Miércoles, 3 de Septiembre de 2008

Ante la necesidad de generar códigos de barras mediante PHP, he encontrado el paquete de PEAR Image_Barcode.

La instalación no puede ser más sencilla en Ubuntu 8.04. Image_Barcode se encuentra en los repositorios en forma de módulo de PHP (php-image-barcode). Ha instalado Pear y Gd como dependencias y ya está.

Con un:

sudo apt-get install php-image-barcode

Ya tenemos instalado todo lo necesario

En caso de no tener hasta ahora Gd, se hace necesario reiniciar apache:

sudo /etc/init.d/apache2 restart

Bien, ahora ya podemos ejecutar el ejemplo que nos dan en la documentación:

PHP:
  1. require_once 'Image/Barcode.php';
  2. Image_Barcode::draw('1234', 'int25', 'png');

Nos generará la siguiente imagen:  

En nuestro caso necesitamos generar códigos con letras y descripciones, por esta razón utilizamos el tipo de código "code128", quedando el ejemplo de la siguiente manera:

PHP:
  1. require_once 'Image/Barcode.php';
  2. Image_Barcode::draw('ControlZeta', 'code128', 'png');

Se nos genera esta otra imagen:

Código de barras alfanumérico con Control Zeta

Hasta aquí todo perfecto, pero... Estos códigos son demasiado altos para el uso que se les va a dar, así que necesitamos disminuir el alto del código. Una opción seria modificar directamente la altura de la imagen, pero esto "achataría" el texto inferior. No nos interesa.

Evidentemente hemos ido a la documentación oficial: http://pear.php.net/package/Image_Barcode/docs

Tras no ser capaz de encontrar ningún método para modificar la altura de códigos de barras code128 (cualquier ayuda será bienvenida) he ido directamente a la clase para ver como podía modificar esta altura. Mi sorpresa ha sido no encontrar ningún método que hiciera lo que necesitaba, pero en cambio, me encontrado con esta simple porción de código nada más empezar a leer:

PHP:
  1. class Image_Barcode_code128 extends Image_Barcode
  2. {
  3. var $_type = 'code128';
  4. var $_barcodeheight = 60;
  5. var $_font = 2;
  6. var $_barwidth = 1;
  7. var $code;
  8.  
  9. ...

Evidentemente, he cambiado el valor $_barcodeheight y todo ha funcionado a la perfección, pero estoy seguro que hay algún motivo para que este valor sea fijo. ¿Alguien tiene alguna explicación al respecto?

Por cierto, el resultado final es este:

Crear, rellenar y recorrer Treeview con PHP-GTK

Martes, 29 de Julio de 2008

En este ejemplo veremos como crear un Treeview con Glade 2, para posteriormente recojerlo en modo ejecucción, rellenarlo y recorrerlo. Con este ejemplo aprenderas las nociones basicas para manejarte correctamente con esta herramienta de listado de datos.

Vamos a explicar con rasgos generales que és y que necesita un TreeView:

  • El treeview sólo es el contenedor de una lista.
  • Necesita una lista o un árbol para hacer el efecto que queremos.
  • Lo que necesita se llama ListStore y TreeStore, respectivamente.
  • Esos 'Store' tienen un modelo interno de funcionamiento, que en realidad es lo que necesita el TreeView.

Por lo que véis, para trabajar con treeview necesitaremos trabajar a tres niveles de interfície, con el view, el store y el model.

Voy a mostraros el código de mi programa, el cual, desde interfaz(archivo.glade) es necesario tener:

  • Un TreeView llamado 'arbolTickets'
  • Un Label llamado 'precioTotalTxt'

E aquí el código (es largo):

<?php
//Carga el archivo de la interfaz
$glade = new GladeXML(dirname(__FILE__) . '/main.glade');

//Ata los metodos con los evocadores de estos.
$glade->signal_autoconnect();

//el treeview tendrá 4 columnas
$cell_renderer = new GtkCellRendererText();

/*PRIMERA COLUMNA*/
$colA = new GtkTreeViewColumn('Fila#', $cell_renderer, 'text', 0);
$colA->set_sort_column_id(1);//1 o TRUE

/*SEGUNDA COLUMNA*/
$colB = new GtkTreeViewColumn('Descripción', $cell_renderer, 'text', 1);
$colB->set_sort_column_id(1);

/*TERCERA COLUMNA*/
$colC = new GtkTreeViewColumn('Cantidad', $cell_renderer, 'text', 2);
$colC->set_sort_column_id(1);

/*CUARTA COLUMNA*/
$colD = new GtkTreeViewColumn('Precio', $cell_renderer, 'text', 3);
$colD->set_sort_column_id(1);

$store = new GtkTreeStore(64,64,32,32);//64->string;32->long

//Agregamos las filas al treeview
for($i=0;$i<10;$i++)
$store->append(null, array('Fila #'.$i, 'Item de la fila#'.$i,$i,($i*$i)));

/*recuperacion de la pantalla interfaz*/
$vnt = $glade->get_widget('ventanaMain');

/*recuperación del treeview realizado con el programa glade 2*/
$arbol = $glade->get_widget('arbolTickets');

/*recuperación del label del precio total realizado con el programa glade 2*/
$lblPrecioTotal = $glade->get_widget('precioTotalTxt');

/*En teoria a un nuevo treview se le asigna el model por su constructor
como este lo hemos recuperado, le asignamos el model a mano.*/
$arbol->set_model($store);

$aux=$arbol->get_model();//recojemos el modelo del arbol

function echoRow($store, $path, $iter)
{
global $total;
$precio = $store->get_value($iter, 3);
$total+=$precio;
}
$total=0;
$aux->foreach('echoRow'); //dentro de la funcion $total esta en global, osea que rewcuperamos aqui el valor

//$lblPrecioTotal->set_text($total);
$lblPrecioTotal->set_markup('<b><span>'.$total.'</span></b>'); // parametro necesario->bool (funcion pone negrita)

/*
* NECESARIO para mostrar correctamente las columnas
si alguna se omite no se mostrará.
Aquí agregamos las columnas creadas más arriba
*/
$arbol->append_column($colA);
$arbol->append_column($colB);
$arbol->append_column($colC);
$arbol->append_column($colD);

/*En nuestro caso son todo padres con lo que no afecta
pero sirve para expandir el contenido del treeview
* */
$arbol->expand_all();

/*Estas dos lineas servirian si el treeview o la ventana han sido creadas en modo ejecucción y no
previamente con un programa glade.
En este caso se le asigna el arbol a la ventanba y le decimos posteriormente a la ventana que lo
muestre todo*/
//$vnt->add($arbol);
//$vnt->show_all();

//Start the main loop
Gtk::main();
?>

Vamos a explicar por encima lo más relevante.

Creamos un objeto del tipo GtkCellRendererText, el cual es el que se encarga de crear las columnas pertinentes, más que crearlas diremos que hace algo así como maquetarlas. Posteriormente creamos tantos objetos GtkTreeViewColumn como columnas deseamos en el treeview. A este objeto le hemos puesto (por orden) el titulo visible que tendrá, al objeto GtkCellRendererText al que pertenece, osea a la maqueta a la que pertenece, luego hemos colocado el atributo 'text' que es lo que va a ser y por último la posición que va a tener.

También vereis el método set_sort_column_id(bool) en esta maquetación de columnas, con esa instrucción no decimos nada más que queremos que la columna tenga la capacidad de ordenarse si se lo indicamos.

$store = new GtkTreeStore(64,64,32,32);//64->string;32->long

Aquí creamos el 'Store', que es básicamente el que tiene los datos del TreeView. Los parametros necesarios en su constructor són indicarle cuantas columnas y el tipo de valor que contendran dichas columnas, asi nosotros tenemos '64,64,32,32' o lo que es lo mismo, 4 columnas, las dos primeras de tipo texto y las siguientes del tipo long. Aquí encontrareis los tipos disponibles.

//Agregamos las filas al treeview
for($i=0;$i<10;$i++)
$store->append(null, array('Fila #'.$i, 'Item de la fila#'.$i,$i,($i*$i)));

Despues de crear el objeto $Store viene un bucle que es el que rellena las filas necesarias, en este ejmplo són 10, lo que tambien podriamos hacer con estos metodos y con el TreeStore es hacer un árbol, con padres, hijos, nietos... la única diferencia con el codigo mostrado aquí es que en vez de tener un null en la funcion append tendriamos la variable del padre, el cual tendriamos que recojer previamente. Algo así sería un ejemplo donde crearemos 10 padres con 1 hijo cada uno:

for($i=0;$i<10;$i++){

$padre=$store->append(null, array('Fila #'.$i, 'Item de la fila#'.$i,$i,($i*$i)));
$store->append($padre,array('hijo','hijo',0,0);

}

Fijaros en las pocas diferencias, es muy fácil.

$aux=$arbol->get_model();//recojemos el modelo del arbol

function echoRow($store, $path, $iter)
{
global $total;
$precio = $store->get_value($iter, 3);
$total+=$precio;
}
$total=0;
$aux->foreach('echoRow'); //dentro de la funcion $total esta en global, osea que rewcuperamos aqui el valor

//$lblPrecioTotal->set_text($total);
$lblPrecioTotal->set_markup('<b><span>'.$total.'</span></b>');

Esta parte es la que se corresponde al recorrer los valores de un determinado campo del treeview.

Primero de todo recuperamos el Model del Treeview, si que es cierto que en el ejemplo mostrado aquí es un paso bastante inutil ya que conocemos que Store es ese model, pero no siempre tenemos porque saberlo.
Una vez recuperado vamos a recorrero con el metodo foreach, que necesita de una funcion.

La función que os mostramos aquí es bastante simple, crea una variable global, para que se corresponda con la variable del mismo nombre de fuera de la funcion, y recorre todas las filas recuperando y sumando el valor que contiene la columna 3(es la columna del precio).

No creo que tengais problemas para entender el codigo y todo lo demas. Con todo esto ya he conseguido hacer una lista, recorrerla, cojer los parametros que yo quiero...