La ventaja de hacer la interfaz gráfica desde
GLADE es generar el
XML que posteriormente vamos cargar desde
PHP para utilizar el entorno grafico solo hay que darle la funcionalidad a la aplicación y programar unas cuantas señales de los widgets.
Este articulo consiste en realizar un explorador de bases de datos para
mySql, el cual se va a conectar por medio de las funciones básicas de php (
mysql_connect), posteriormente vamos realizaremos una consulta para traernos todas las bases de datos que estén dentro del servidor que vamos a cargar dentro de widget
GtkComboBox que al seleccionarlo se va alanzar una señal para consultar sus tablas de la base de datos seccionada…
Primero hay que instalar el
PHP-GTK2 si es que no esta instalado dentro de nuestro equipo...
Puedes al artículo donde se explica como instalar el
PHP-GTK2 con
GNOPE:
www.mygnet.com/articulos/php%2Dgtk/398/
Una vez que ya esta instalado hay que configurar algunas cosas para que habilitar la extensión de mysql ya que no vienen con la distribución de
PHP-GTK2
Hay que saber que versión se instalo con
php-gtk2, en mi caso yo tengo la versión 5.1.1 así que voy a la pagina de
php.net y descargo la versión:
php-5.1.1-Win32.zip la cual contienen la extensión y librerías compiladas compatibles con la versión que instalo el
GNOPE.
Descomprimimos y copiamos los siguientes archivos:
libmysql.dll dentro de php-gtk2/
ext/php_pdo.dll dentro de php-gtk2/ext/
ext/php_pdo_mysql.dll dentro de php-gtk2/ext/
y modificamos el php.ini de nuestro php-gtk2 para agregar la extensión:
extension = php_pdo.dll
extension = php_mysql.dll
Listo ya quedo nuestra configuración para que soporte base de datos en
MYSQL.
De igual forma puedes agregar todas las funciones que requieras para
PHP..
Empezamos hacer el diseño en
GLADE y generamos el archivo xml .glade
Creamos un formulario dentro de este formulario agregamos un widget (
GtkVBox) para dividir en vertical 4 divisiones. En la primera posición agregamos un barra de menú
GtkMenuBar , el la segunda posición agregamos una barra de herramientas (
GtkToolBar), en la 3 posición agregamos un WidGet
GtkNoteBook y en la ultima posición agregamos una barra de estado(
GtkStatusBar).
En la barra de Menús agregamos dos opciones Archivo y Ayuda.
Con los nombres:
menu_conectar
menu_desconectar
menu_salir
Menú Ayuda con el nombre para el acerca:
menu_about
La barra de herramientas agregamos dos botones:
De nombre:
menu_about
menu_about
Dentro del
GtkNoteBook en la pestaña de nombre Conexión agregamos un widget
GtkFixed y dentro de este podemos agregar los controles en cualquier posposición estilo como Visual Basic.
Agregamos los siguientes elementos que se muestran en la pantalla:
Los nombres para los widget son:
1 GtkEntry: text_host
2 GtkEntry: text_user
3 GtkEntry: text_pass
4 GtkEntry: text_puerto
GtkComboBoxEntry: list_db
1 GtkButton: btn_bases
2 GtkButton: btn_conectar
3 GtkButton: btn_desconectar
Dentro de la pestaña
Datos agregamos los siguientes widgets:
Un
GtkVBox de 2 posiciones en la primera posición agregamos el control
GtkComboBox qye se va a llamar list_table y en la segunda posición de la caja agregamos una caja vertical
GtkVBox de nombre vbox_table.
Una vez que ya tenemos echa nuestra interfaz gráfica solo resta por realizar la clase de programación que va cargar el
XML que se genera al guardarlo con
GLADE.
Vamos a construir una clase de nombre
myExplorer.
Propiedades:
protected $menu = array();
Un arreglo que va a contener los widget del la barra del menu.
protected $tool = array();
Un arreglo que va contener los botones de la barra de herramientas.
protected $btn = array();
Arreglo que va contener los widgets de tipo botón de la aplicación.
protected $gld = NULL;
Esta propiedad es un objeto de tipo GladeXML que contienen todos los elementos gráficos cargados desde el XML.
protected $host = NULL;
Widget de tipo GtkEntry para el nombre del Host donde se encuentra el servidor.
protected $user = NULL;
Widget de tipo GtkEntry para el nombre del usuario de mysql.
protected $pass = NULL;
Widget de tipo GtkEntry para la contraseña del usuario.
protected $port = NULL;
Widget de tipo GtkEntry el puerto en el que esta escuchando el Mysql.
protected $tables = NULL;
Widget de tipo GtkComboBox que va contener el listado de tablas de la base de datos seleccionada.
protected $dbases = NULL;
Widget de tipo GtkComboBoxEntry que va contener el listado base de datos del servidor con la posibilidad de poder introducir el nombre de la base de datos.
protected $vbox = NULL;
Widget que se encuentra en el GtkNoteBook en la pestaña de Datos en la segunda posición de la caja que va cargar los datos de la tabla seccionada.
protected $status = NULL;
Esta propiedad contiene el wodget de tipo GtkStstusBar
protected $win = NULL;
Este es el widget de la venta GtkWindow.
protected $Ndb = 0;
Numero de bases de datos dentro del servidor mysql.
protected $Ntables = 0;
Nuymero de tables de la base de datos seleccionada.
protected $conn = NULL;
Puntero de conexión de mysql.
public $titulo = 'myExplorer';
Titulo para la ventana que va aparecer en la barra de titulo.
public $version = '1.0';
Versión de la aplicación
public $logo = 'img/logo.png';
Imagen que se va utilizar como logotipo.
public $ico = 'img/ico.png';
Imagen que se va utilizar como icono de la aplicación
Métodos:
public function status_message($str)
Este método muestra un mensaje del proceso en ejecución y realiza una llamada al método gtk::main_iteration(); para que no se quede pasmada durante la ejecución del proceso.
public function Message($str)
Se crea un mensaje un mensaje de alerta.
public function onShowdb()
Establece la conexión para cargar las bases de datos en el GtkComboBoxEntry.
public function onTables()
Carga los datos en GtkVBox de la tabla seleccionada.
public function onConnect()
Realiza una conexión a la base de datos seleccionada y carga todas la tablas de esta.
public function onDisconnect()
Desconexión del servidor.
public function onAbout()
Muestra el acerca de…
public function onSalir()
Salida del la aplicación.
Constructor de la clase.
Dentro del constructor vamos a recuperar el control de algunos widgets para realizar la programación de las acciones de algunos de ellos.
public function __construct($xml)
{
$this->gld = new GladeXML($xml);
$this->menu['on']=$this->gld->get_widget('menu_conectar');
$this->menu['off']=$this->gld->get_widget('menu_desconectar');
$this->menu['quit']=$this->gld->get_widget('menu_salir');
$this->menu['acer']=$this->gld->get_widget('menu_about');
$this->tool['on']=$this->gld->get_widget('tool_conectar');
$this->tool['off']=$this->gld->get_widget('tool_desconectar');
//Formulario
$this->host=$this->gld->get_widget('text_host');
$this->user=$this->gld->get_widget('text_usuario');
$this->pass=$this->gld->get_widget('text_pass');
$this->port=$this->gld->get_widget('text_puerto');
$this->dbases=$this->gld->get_widget('list_db');
//Botones
$this->btn['on']=$this->gld->get_widget('btn_conectar');
$this->btn['off']=$this->gld->get_widget('btn_desconectar');
$this->btn['db']=$this->gld->get_widget('btn_bases');
//Datos
$this->tables=$this->gld->get_widget('list_table');
$this->vbox=$this->gld->get_widget('vbox_table');
$this->status=$this->gld->get_widget('status_bar');
$this->win=$this->gld->get_widget('windb');
//Asignamos las señales de los widgetes,
//para los botones del menú, barra de
//herramientas y demás.ales
$this->menu['on']->connect_simple('activate',array($this,'onConnect'));
$this->menu['off']->connect_simple('activate',array($this,'onDisconnect'));
$this->menu['quit']->connect_simple('activate',array($this,'onSalir'));
$this->menu['acer']->connect_simple('activate',array($this,'onAbout'));
$this->tool['on']->connect_simple('clicked',array($this,'onConnect'));
$this->tool['off']->connect_simple('clicked',array($this,'onDisconnect'));
$this->btn['on']->connect_simple('clicked',array($this,'onConnect'));
$this->btn['off']->connect_simple('clicked',array($this,'onDisconnect'));
$this->btn['db']->connect_simple('clicked',array($this,'onShowdb'));
$this->dbases->connect_simple('changed',array($this,'onBases'));
$this->tables->connect_simple('changed',array($this,'onTables'));
$this->win->connect_simple('destroy', array('gtk', 'main_quit'));
}
Método status_message.
public function status_message($str)
{ $pcontext = $this->status->get_context_id($str);
$this->status->pop($pcontext);
$this->status->push($pcontext, $str);
while (gtk::events_pending()) gtk::main_iteration();
}
while (gtk::events_pending()) gtk::main_iteration();
Esto para el caso de procesos muy largos o pesados no se pierda la iteración con la aplicación.
Método Message.
public function Message($str)
{$dialog = new GtkMessageDialog(null,0,Gtk::MESSAGE_WARNING,Gtk::BUTTONS_CLOSE,$str);
$answer = $dialog->run();
$dialog->destroy();
}
Metodo onShowdb.
public function onShowdb()
{$this->status_message('Realizando conexión con '.$this->host->get_text());
$this->conn=mysql_connect($this->host->get_text().':'.$this->port->get_text(),
$this->user->get_text(),
$this->pass->get_text());
if($this->conn)
{$this->status_message('Cargando la base de datos del servidor: '.$this->host->get_text());
$result=mysql_query('SHOW DATABASES',$this->conn);
if($result)
{ if($this->Ndb)for($i=0;$iNdb;$i++)$this->dbases->remove_text(0);
$this->Ndb=0;
while($row=mysql_fetch_array($result))
{ $this->dbases->append_text($row[0]);
$this->Ndb++;
}
$this->dbases->set_active(0);
}
}
else { $this->Message("Error al intenetar la conexión:n".mysql_error()); }
}
Nota para el combo que esta contruido desde
XML generado por el
GLADE se debe agregar al código fuente en
XML la siguiente propiedad para los widget de tipo
GtkComboBoxEntry y
GtkComboBox esto es para que se puedan agregar elementos.
Método onConnect.
public function onConnect()
{if(!$this->conn)
{$this->status_message('Realizando la conexión con el servidor mysql...');
$this->conn=mysql_connect($this->host->get_text().':'.$this->port->get_text(),
$this->user->get_text(),
$this->pass->get_text));
}
if($this->conn)
{ $db=$this->dbases->get_active_text();
$this->status_message('Seleccionado la base de datos: '.$db);
if(mysql_select_db($db,$this->conn))
{$this->status_message('Cargando todas la tablas de : '.$db);
$result=mysql_query('SHOW TABLES',$this->conn);
if($result)
{$this->tables->set_sensitive(true);//activar las tablas
if($this->Ntables)for($i=0;$iNtables;$i++)$this->tables->remove_text(0);
$this->Ntables=0;
while($row=mysql_fetch_array($result))
{$this->tables->append_text($row[0]);
$this->Ntables++;
}
}
$this->tables->set_active(0);
$this->menu['off']->set_sensitive(true);
$this->tool['off']->set_sensitive(true);
$this->btn['off']->set_sensitive(true);
$this->menu['on']->set_sensitive(false);
$this->tool['on']->set_sensitive(false);
$this->btn['on']->set_sensitive(false);
$this->dbases->set_sensitive(false);
}else{ $this->Message('Error al seccionar la base de datos: '.$this->dbases->get_active_text()."n".mysql_error()); }
}
else { $this->Message("Error al intenetar la conexión:n".mysql_error()); }
}
Método onTables.
public function onTables()
{$table=$this->tables->get_active_text();
$this->status_message('Cargando los datos de la tabla seleccionada...');
$result=mysql_query('SELECT * FROM '.$table,$this->conn);
$resulc=$result;
if($result)
{$ncol=mysql_num_fields($result);
$colum=array();
$str='';
$children = $this->vbox->get_children();
if (!empty($children))
{ $this->vbox->remove($children[0]);
}
for($i=0; $iset_sort_column_id(0, Gtk::SORT_ASCENDING);
$treeview = new GtkTreeView($store);
$cell_renderer = new GtkCellRendererText();
for($i=0; $iset_resizable(true);
$item->set_sort_column_id($i);
$treeview->append_column($item);
}
$scrwnd = new GtkScrolledWindow();
$scrwnd->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
$scrwnd->add($treeview);
$this->vbox->pack_start($scrwnd,true,true);
$this->win->show_all();
}
else
{ $this->Message('Error al ejecutar la consulta: '.mysql_error());
}
}
Método onDisconnect.
public function onDisconnect()
{ $this->status_message('Desconectando de la base de datos: ');
if($this->conn)
{ mysql_close($this->conn);
$this->conn = NULL;
}
$children = $this->vbox->get_children();
if (!empty($children)) {
$this->vbox->remove($children[0]);
}
if($this->Ntables)for($i=0;$iNtables;$i++)$this->tables->remove_text(0);
$this->Ntables=0;
if($this->Ndb)for($i=0;$iNdb;$i++)$this->dbases->remove_text(0);
$this->Ndb=0;
$this->menu['off']->set_sensitive(false);
$this->tool['off']->set_sensitive(false);
$this->btn['off']->set_sensitive(false);
$this->menu['on']->set_sensitive(true);
$this->tool['on']->set_sensitive(true);
$this->btn['on']->set_sensitive(true);
$this->tables->set_sensitive(false);
$this->dbases->set_sensitive(true);
}
Metodo onAbout.
public function onAbout()
{$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 Sotelonmartin@mygnet.com");
$dlg->run();
$dlg->destroy();
}
Metodo onSalir
public function onSalir()
{if($this->conn)mysql_close($conn);
Gtk::main_quit();
}
Para construir nuestro objeto de la clase que realizamos es de la siguiente manera:
new myExplorer('mysql.glade');
Gtk::main();
Donde le mandamos el archivo xml por parámetro al constructor de la clase myExplorer.
Si quieres el código fuente completo.
http://mygnet.net/it/descargas/codigos/explorador_de_base_de_datos_en_mysql.1481.zip
Un saludo.