¿Que son los archivos CSV?
Son archivos de texto que no contienen características del programa que lo genera, como ejemplo un archivo de Excel que se desea grabar en formato texto para ser usado por otras aplicaciones o programas. Este tipo de formato es muy útil como"intermediario" entre programas o archivos de formato desconocido y programas estándar, como el Officce, y también para trabajar un archivo en una plantilla o procesador de texto y luego llevarlo a lenguajes de programación como Cobol, ya que graba en formato ASCII y separa las líneas (252 caracteres máximo)por una coma o punto y coma haciendo fácil su lectura.
Vamos a realizar unas clase para la Barra de menú, otra para la Barra de herramienta,otra para las funciones de carga de los archivo CSV y por ultimo una clase que contenga a todas estas clases, la ventana donde se van a mostrar los resultados.
hay que crear la siguiente estructura….
carpetas:
class Aquí vamos a guardar los archivos de clases
csv.class.php = Clase para leer archivos CSV
menu.class.php = Clases para manipulación de menus.
tool.class.php = Clase para la barra de herramieta.
img Guardar las imágenes a utilizar por la aplicación.
Clase principal.
Creamos un archivo de nombre csv.php que va contener una clase heredada de GtkWindow de nombre
classProgram.
Definimos la clase de la siguiente manera:
class classProgram extends GtkWindow
Agregamos e inicializamos las siguientes propiedades solo para uso de la clase de tipo protected.
Propiedad que contiene los elementos del menu.
protected $mmenu = array();
Propiedad que contiene los elementos de la barra de herramientas.
protected $mtool = array();
Propiedad que contiene la caja de tipo GtkVbox donde se van a mostrar los datos de los archivos CSV.
protected $boxcsv = NULL;
Agregamos las propiedades de tipo public.
Propiedad para definir el titulo de la aplicación
public $titulo = 'CSV en PHP-GTK2';
Propiedad para definir la version de la aplicación.
public $version = '1.0';
Propiedad que almacena la ruta y nombre de la imagen como logotipo.
public $logo = 'img/logo.png';
Propiedad que guarda la ruta y nombre del icono para la aplicación.
public $ico = 'img/ico.png';
Luego que establecimos las propiedades vamos a establecer los métodos a utilizar claro primero empezando por nuestro constructor de la clase.
public function __construct()
{ parent::__construct(); //Ejecutamos el contructor del parent
$this->set_default_size(800,600);
$this->set_title($this->titulo.' Ver '.$this->version);
$this->set_icon(GdkPixbuf::new_from_file($this->ico));
$this->connect_simple('destroy', array('gtk', 'main_quit'));
$this->set_position(Gtk::WIN_POS_CENTER); <strong>
}
Al crear un objeto de nuestra clase se lanza el constructor que inicia algunos elementos de la clase asi cono lanzar el constructor de la clase padre que en este caso es
GtkWindow.
Asignamos el titulo, como el tamaño de la ventana, fijamos el icono y creamos una señal para que ejecute el metodo main_quit del Gtk al cerrar la ventana.
Y centramos en la pantalla nuestra ventana con
$this->set_position(Gtk::WIN_POS_CENTER);
Tenemos otros métodos que en parte depende de las otras clases, a si antes pasar a las siguientes métodos vamos a construir nuestras clases.
classMenu
Creamos un archivo de nombre menu.class.php dentro de la carpeta class.
Esta clase recibe la herencia
deGtkMenuBar, contiene una propiedad $menuElem para uso exclusivo de la clase y dos métodos addItem y addMenu que a continuación explicamos su comportamiento.
addItem es un método que recibe como primer parámetro un arreglo o una cadena,y como segundo argumento recibe uno objeto de la ventana donde van hacer invocados en el caso de tener llamadas de teclas aceleradas como Ctrl +S.
Si el primer argumento es una cadena y es igual a ‘-’ un guión entonces se inserta un separador dentro del menú, pero si es una cadena diferente al guión se inserta un elemento del menú simple.
Si el argumento es un arreglo puede utilizar esta sintaxis para el arreglo.
$agr[0]='Nombre del menu';
$arg[1]='Ruta y nombre de la imagen puede ser una cadena vació si no queremos que tenga ninguna imagen',
$arg[2]= TRUE / FALSE Si queremos que tenga aceleración solo podremos TRUE
$arg[3]=un arreglo donde se especifica el nombre de la función o método a ejecutar así como la señal por la cuál será invocada.
Por ejemplo:
$menu= new classMenu();
$menu->addItem('_Archivo'); $menu->addItem(array('_Abrir','img/open.png',true,array('activate','onOpen')),$this); $menu->addItem('-');
El método addMenu sirva para definir los submenús y menús….
Por ejemplo:
$menu= new classMenu();
$file = $menu->addItem('_Archivo');
$menu->addItem(array('_Abrir','img/open.png',true,array('activate','onOpen')),$this);
$menu->addItem(array('_Guardar','img/save.png',true,array('activate','onSave')),$this);
$menu->addItem(array('G_uardar como...','',false,array('activate','onSaveas')),$this);
$menu->addItem('-');
$menu->addItem(array('_Salir','img/exit.png',true,array('activate','onExit')),$this);
$menu->addMenu($file);
Tendríamos algo así como el menú de Archivo.
classTool
Creamos un archive de nombre tool.class.php donde pondremos la clase como el siguiente código.
Esta clase recibe la herencia de
GtkToolBar, de manera similar a la clase para crear menús esta tienen un constructor y un método el cual se llama addItem …
addItem este método recibe dos parámetros el primero puede ser una cadena o un arreglo y el segundo es la ventana donde se van invocar.
Por ejemplo:
$tool= new classTool();
$tool->addItem(array('Abrir','img/open.png',array('clicked','onOpen')),$this);
$this->mtool['save'] =$tool->addItem(array('Guardar','img/save.png',
array('clicked','onSave')),$this);
$tool->addItem('|');
$tool->addItem(array('Acerca','img/ico.png',array('clicked','onAcerca')),$this);
Seria algo como esto…
classCsv.
Esta clase es para abrir los archive csv, contienen 3 propiedades y dos métodos...
este es el código de la clase:
character
El método character es invocado para definir el tipo de carácter separador del archivo csv, por lo regular es la coma.
get
este método devuelve una matriz ya sea en un arreglo asociativo o un arreglo indexado, dependiendo las propiedad $type.
Una vez que ya tenemos las clases que vamos a utilizar continuamos cono los método de la cae principal.
getMenu
Este método construye nuestro menú dentro de una caja flotante la cual se retorna como resultado.
public function getMenu($text)
{ $menu= new classMenu();
$this->mmenu['file']=
$menu->addItem('_Archivo');
$menu->addItem(array('_Abrir','img/open.png',true,
array('activate','onOpen')),$this);
$this->mmenu['file-save']=$menu->addItem(array('_Guardar','img/save.png',true,
array('activate','onSave')),$this);
$this->mmenu['file-saveas']=$menu->addItem(array('G_uardar como...','',false,
array('activate','onSaveas')),$this);
$menu->addItem('-');
$menu->addItem(array('_Salir','img/exit.png',true,
array('activate','onExit')),$this);
$menu->addMenu($this->mmenu['file']);
$help=$menu->addItem('Ay_uda');
$menu->addItem(array('Acerca myg-csv','',false,
array('activate','onAcerca')),$this);
$menu->addMenu($help);
$this->mmenu['file-save']->set_sensitive(false);
$this->mmenu['file-saveas']->set_sensitive(false);
$handlebox = new GtkHandleBox();
$handlebox->add($menu);
return $handlebox;
}
getTool
De igual manera que el método anterior con este método construimos la barra de herramientas con las funciones que van a ejecutar...
public function getTool($text)
{$tool= new classTool();
$tool->addItem(array('Abrir','img/open.png',
array('clicked','onOpen')),$this);
$this->mtool['save'] =$tool->addItem(array('Guardar','img/save.png',
array('clicked','onSave')),$this);
$tool->addItem('|');
$tool->addItem(array('Acerca','img/ico.png',
array('clicked','onAcerca')),$this);
$this->mtool['save']->set_sensitive(false);
$handlebox = new GtkHandleBox();
$handlebox->add($tool);
return $handlebox;
}
getCsv
Este método es el que se encarga de empaquetar todos los elementos que van intervenir dentro de la ventana.
public function getCsv()
{ $vbox= new GtkVBox();
$this->boxcsv = new GtkVBox();
$vbox->pack_start($this->getMenu($text),false,true);
$vbox->pack_start($this->getTool($text),false,true);
$vbox->pack_start($this->boxcsv,true,true);
$this->add($vbox);
$this->show_all();
}
Una vez que tenemos todo los métodos hay otros que van hacer llamados por señales ya sea des de el menú, barra de herramientas o de teclas deaceleración como Ctrl.+S para salir...
Tenemos el metodo
onOpen que es lanzado con laseñal 'activate' en el caso del menú o la señal 'clicked' desde la barra de herramientas.
public function onOpen()
{ $chFile = new GtkFileChooserDialog("Abrir archivo", NULL,
Gtk::FILE_CHOOSER_ACTION_OPEN,
array( Gtk::STOCK_CANCEL,
Gtk::RESPONSE_CANCEL,
Gtk::STOCK_OK,
Gtk::RESPONSE_OK
));
$chFile->set_icon(GdkPixbuf::new_from_file($this->ico));
$filter=new GtkFileFilter();
$filter->set_name("Archivos csv");
$filter->add_pattern("*.csv");
$chFile->add_filter($filter);
if($chFile->run()=="-5"){
$children = $this->boxcsv->get_children();
if (!empty($children)) {
$this->boxcsv->remove($children[0]);
}
$file=$chFile->get_filename();
$chFile->destroy();
$objcsv = new classCsv($file);
$arrCsv = $objcsv->get();
$this->set_title($file.' '.$this->titulo.' '.$this->version);
$NOT = count($arrCsv); //Total de registros
$NO = count($arrCsv[0]); //Total de columnas
$COLUMS = $arrCsv[0]; //nombre de las columnas
$str='';
for($i=0; $iset_sort_column_id($i);
$treeview->append_column($item);
}
$scrwnd = new GtkScrolledWindow();
$scrwnd->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
$scrwnd->add($treeview);
$this->boxcsv->pack_start($scrwnd,true,true);
$this->show_all();
}
}
Los demás métodos que son lanzados por las señales del menú o la barra de
herramientas.
public function onSave()
{
}
public function onSaveas()
{
}
public function onExit()
{ Gtk::main_quit();
}
public function onAcerca()
{ $dlg = new GtkAboutDialog();
$dlg->set_name($this->titulo);
$dlg->set_version($this->version);
$dlg->set_comments('Un saludo a todos los colaboradores de la
comunidad de mygnet');
$dlg->set_copyright('Copyright (C) 2005 myGnet');
$dlg->set_license(file_get_contents(dirname(__FILE__).'/creditos.txt'));
$dlg->set_logo(GdkPixbuf::new_from_file($this->logo));
$dlg->set_icon(GdkPixbuf::new_from_file($this->ico));
$dlg->set_website('http://www.mygnet.com');
$dlg->set_translator_credits("Martin Roberto Mondragon Sotelon
martin@mygnet.com");
$dlg->run();
$dlg->destroy();
}
};
include('class/csv.class.php');
include('class/menu.class.php');
include('class/tool.class.php');
$csv = &new classProgram();
$csv->getCsv();
Gtk::main();
?>
Esta es la aplicación
Abrir un archivo csv
Este es el acerca de...
Y con esto me despido...
Puedes descargar el código completo aquí….
http://www.mygnet.net/codigos/phpgtk/archivosydirectorios/leer_archivos_csv_desde_phpgtk2.1461