Entradas con la etiqueta ‘PHP-GTK’

Personalizar texto de los Labels en PHP-GTK2

Miércoles, 17 de Diciembre de 2008

Una de las pocas cosas que no hace el editor de archivos Glade para crear aplicaciones en PHP-GTK2 es que los labels no pueden ser editados en cuanto a sus propiedades.

El editor te deja poner texto, pero no negrita, tipo de fuente, color…

Solución

Aquí pongo un ejemplo de como editarlo desde el codigo PHP, en tiempo de ejecucción:

$title = $glade->get_widget(’label38′);
$title->modify_font(new PangoFontDescription(”Verdana Bold 11″));
$title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse(”#ff0000″));
$title->set_size_request(-1, 40);

Estas propiedades no son del label nativamente sino que lo proporciona el ‘padre’ del objeto Label, uno de ellos es GTKWidget. De ahí provienen estas propiedades editables. http://gtk.php.net/manual/en/gtk.gtkwidget.php

Ejemplos de impresión en impresora de tickets y PHP-GTK 2

Miércoles, 13 de Agosto de 2008

Siguiendo con el trabajo utilizando PHP-GTK, y después de explicar como imprimir con impresora de tickets, ahora toca aprender algo de comandos hacia la impresora Epson TM-U200, aunque supongo que los comandos funcionarán, si no en todas las epson, en la gama TM.

Vamos a crear un ‘buffer’ de contenido a partir de un fichero PRN.

$handle = fopen(”PRN”, “w”); // note 1

A partir de ahora escribiremos sobre $handler nuestro ticket, para a posteriori imprimir ese fichero.

Comandos útiles:

fwrite($handle,chr(27). chr(64));  //->Reinicializa la impresion, esto hay que hacerlo siempre al inicio.

Alineación:
fwrite($handle, chr(27). chr(97). chr(0)); //->Izquierda
fwrite($handle, chr(27). chr(97). chr(1)); //->Centro
fwrite($handle, chr(27). chr(97). chr(2)); //->Derecha

Este comando es bastante importante, ya que por ejemplo, en las alineaciones de múltiples palabras en una misma linea, por ejemplo para hacer una columna en centro y otra en derecha, si no hay un limpiado de buffer no funciona.

fwrite($handle, chr(27). chr(100). chr(N)); //-> Limpia el buffer, y salta N lineas, poner numero de saltos en la ‘N’, admite un 0.

chr(238) -> es la numeración para escribir un símbolo parecido al Euro. (fwrite($handle, chr(238)))

Para cerrar el ‘PRN’ y imprimirlo, como explicamos en anteriores entradas:

fclose($handle); // cierra el fichero PRN
$salida = shell_exec(’lpr PRN’); //lpr->puerto impresora, imprimir archivo PRN

Básicamente con la combinación de estos comandos y sabiendo que “fwrite($handle, ‘Hola’);” es válido para escribir una frase en el ticket,creo que ya no tendréis problemas con ello.

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…

Imprimir por impresora desde PHP-GTK

Jueves, 24 de Julio de 2008

En esta ocasión vamos a ver como imprimir algo desde un programa en PHP-GTK con nuestra impresora, usaremos además el terminal de Linux.

En nuestro caso necesitamos imprimir datos para generar ‘tickets’, con lo que la copia debe tener algo de estilo. Esto nos traerá algún problema, puesto que no es imprimir sólo texto. Además, es previsible que estos tickets sean consultados vía web remotamente.

Para empezar hay que comentar que en Linux no tiene la libreria printer_php.dll, con lo que hay que imprimir desde terminal, al hacerlo nos damos cuenta que la solución es multiplataforma, así que en Windows debería funcionar bien lo que vamos a explicar.
Para desarrollar la idea hemos creado un programa con el Glade 2, que tiene una caja de texto(textview) y un botón, al botón le asignamos un evento al ser clickado, que llamara a la función ‘Conecta’ y le advertimos que coja como fuente de datos el textView.

Ahora generamos el blade y vamos al archivo PHP.
Vamos a hacer un ejemplo simple ya que para generar los pdf podeis visitar su web oficial.

function conecta($textView){
$textBuffer = new GtkTextBuffer();
$salida = shell_exec(’ls -l /home’); //en caso de windows shell_exec(’dir c:’);, por ejemplo
$textBuffer->set_text($salida);
$textView->set_buffer($textBuffer);

}

Con este pequeño ejemplo, al pulsar el boton el terminal ejecutara un listado de directorios del sistema, y colocara la salida en la caja de texto.

Como véis, el comando a utilizar en php es shell_exec, que envia al modo consola del servidor (tu maquina si estas en local, que es nuestro caso), una orden y la devuelve a la variable $salida.

Para imprimir en modo consola tanto en linux como en Windows con la impresora el comando es ‘lpr NOMBRE_ARCHIVO’, con eso le envias el archivo especificado a la cola de impresión de la impresora.

function conecta($textView){

$salida=shell_exec(’ls -l /home’);
$textBuffer = new GtkTextBuffer();
$pdf=new FPDF(’P',’cm’);
//aquí iria toda la generación del PDF con FPDF, poniendo el contenido de $salida como texto de     pagina
$pdf->Output(’prueba.pdf’); //genera el archivo prueba.pdf
$textBuffer->set_text($salida);
$textView->set_buffer($textBuffer);
shell_exec(’pdf2ps Calefaccio.pdf prova.ps’); //convertir de PDF a PS
shell_exec(’lpr prova.ps’);

}

¿Qué hace exactamente este nuevo código?

Primero de todo coje como $salida la respuesta al listado de directorio, genera un PDF con el texto que deseemos, puede ser por ejemplo la $salida que por eso la hemos hecho en este caso, al generar el PDF crea el archivo en el mismo directorio.

shell_exec(’pdf2ps Calefaccio.pdf prova.ps’); //convertir de PDF a PS
shell_exec(’lpr prova.ps’);

Esta es la parte interesante del asunto, si provais de imprimir directamente el archivo PDF desde el modo consola tendreis problemas y vereis como salen impresas unas cosas muy raras, ya que la consola de windows o el terminal de linux no sabe imprimir PDF, lo que hay que hacer es convertir de PDF a PS el archivo, en este caso en modo consola de linux con la funcion pdf2ps, y darle a imprimir ese mismo archivo PS.

Haciendo pruebas ha procesado la creación y conversión de 72 paginas en unos 2 segundos aproximadamente, osea que realmente no va mal ;-)

En windows previamente habria que crear un puerto tcp/ip para la impresora, ya que la funcion ‘lpr’ es imprimir remotamente, ‘lp’ es impresión normal.

Aunque tambien puede usarse printer en php si se funciona sobre Windows y quiere imprimir.

Instalación de PHP-GTK2 en Linux Ubuntu 8.04

Miércoles, 23 de Julio de 2008

Seguimos el tutorial oficial de instalación que se encuentra en esta página.

Aunque Ubuntu lleva el php5 instalado, vamos a hacer un update de versión para asegurar de que todo se hace bien:

cvs -d :pserver:cvsread@cvs.php.net:/repository login
cvs -d :pserver:cvsread@cvs.php.net:/repository co -r PHP_5_2 php-src

Si no teneis el CVS instalado: sudo apt-get install cvs

Ahora que ya esta actualizada/comprobada la version de php, procedemos a compilar su instalación, para ello es necesario seguir los siguientes pasos, (atención a posibles fallos, comento dos más abajo):

cd php-src
./buildconf
./configure --prefix=/opt/php5_2 --disable-cgi
make
su
make install
echo extension=php_gtk2.so >> /opt/php5_2/lib/php.ini
/opt/php5_2/bin/php-config --extension-dir | xargs echo 'extension_dir=' >> /opt/php5_2/lib/php.ini

A mi me ha dado dos errores el paso de ‘./configure…’, éstos han sido:

1. configure: error: Found invalid flex version: 2.5.34. Supported flex versions are: 2.5.4

En Ubuntu 8.04 viene instalada la versión de flex 2.5.34 y la soportada es la flex 2.5.4, que ubuntu la tiene en sus repositorios como flex-old. Si vuestro caso es el mismo teneis que ir al gestor de paquetes synaptic, buscar ‘flex’ y de la lista que sale buscar el paquete flex instalado, marcar para eliminar completamente y un poco más abajo marcar ‘flex-old’.

2. configure: error: xml2-config not found. Please check your libxml2 installation.

Si ocurre esto, hay que ir de nuevo al gestor de paquetes synaptic, buscar ‘libxml2′ y en la lista que nos mostrará, marcar para instalar la fila que pone ‘libxml2-dev’.

El tercer paso, make, es el que se encarga de compilar. Si en este paso os dice ‘failed to open stream’ es porque el paso anterior se ha hecho mal, vuelve a lanzarlo y comprueba que la ultima linea no ponga algo de error. Si este paso se ejecuta con todo correcto tarda un poco en completarse y saca mucho texto por pantalla ya que compila todas las librerias que no són pocas.

Según la guía oficial de php-gtk2 hay que hacer un su, y posteriormente un make install, así pues esto sirve para acabar de instalar los paquetes con derechos de root(su), por tanto:

sudo su (os pedira contraseña)

make install

Si hasta aquí todo ha ido bien, los dos últimos pasos no darán problemas, asi que soo hay que hacer copiar y pegar de esos pasos:

echo extension=php_gtk2.so >> /opt/php5_2/lib/php.ini
/opt/php5_2/bin/php-config --extension-dir | xargs echo 'extension_dir=' >> /opt/php5_2/lib/php.ini

Ahora toca compilar todo el tema del PHP-GTK2:

cd ..
cvs -d :pserver:cvsread@cvs.php.net:/repository co php-gtk
cd php-gtk
./buildconf --with-phpize=/opt/php5_2/bin/phpize
./configure --with-php-config=/opt/php5_2/bin/php-config --with-libglade
make
make install

Y aquí, en el paso del ‘./configure…’ he vuelto a tener problemas con las versiones de mis instalaciones:

1. configure: error: PHP-GTK 2.x requires GLib 2.6.0 or higher

Se queja de que no tiene la libreria Glib adecuada, es necesario instalar ‘libglib2.0-dev’ para solventar este problema, así que ya sabeis, a buscarlo en el gestor de paquetes synaptic.

2. configure: error: PHP-GTK 2.x requires GTK+ 2.6.0 or higher

Más o menos lo mismo que el anterior, error de versión, en esta ocasión toca buscar en el gestor de paquetes synaptic ‘libgtk2.0-dev’.

Una vez solventados estos dos problemas, que recuerdo, pueden ser distintos o no tener errores directamente en tu caso, ya que puede ser que tengas los modulos previamente instalados correctamente, sólo hay que hacer un par de instrucciones mas que no darán problemas:

make

sudo make install

El ultimo paso es hacer un enlace a la instalacion del nuevo PHP que hemos hecho:

ln -s /opt/php5_2/bin/php /usr/bin/php-gtk