lunes, 21 de diciembre de 2009

Aplicaciones de Escritorio con PHP - GTK 2


Se pueden realizar aplicaciones de escritorio con PHP, con ayuda de las liberarías GTK+ que son multiplataformas.

GTK+

Es un grupo de liberarías para el desarrollo de interfaces gráficas de usuario (GUI), principalmente para los entornos gráficos GNOME, XFCE y ROX de sistemas Linux.

Inicialmente creado para construir el programa gráfico GIMP, GTK+ es la abreviatura de GIMP toolkit (conjunto de rutinas para GIMP) y es muy usada por los programadores de sistemas Linux junto con Qt en el entorno KDE.
Características:
Es software libre (bajo la licencia LGPL).
Es multiplataforma (Linux, Windows, Macintosh, etc).
Se puede programar en diversos lenguajes como: C, C++, Ada, Perl, Python, PHP, etc...
Es parte importante del proyecto GNU.

Actualmente la última versión es GTK+ 2, con una cantidad importante de mejoras respecto a la primera versión, aunque sin embargo, no es compatible con su primera versión.

GTK+ se basa en tres librerías:
GLib es una librería de bajo nivel estructura básica de GTK+ y GNOME. Proporciona manejo de estructura de datos para C, portabilidad, interfaces para funcionalidades de tiempo de ejecución (runtime) como ciclos, hilos, carga dinámica o un sistema de objetos.
Pango es una librería para el diseño y renderizado de texto, hace hincapié especialmente en la internacionalización. Es el núcleo para manejar las fuentes y el texto de GTK+ 2.
ATK es una librería para crear interfaces con características de una gran accesibilidad muy importante para personas discapacitadas o minusválidas. Pueden usarse útiles como lupas de aumento, lectores de pantalla, o entradas de datos alternativas al clásico teclado o ratón de ordenador.

¿Qué es PHP-GTK?


PHP-GTK es una extensión del lenguaje de programación PHP que interactúa con la librería GTK+, proporcionando un interfaz orientado a objetos a las clases y funciones GTK+ que simplifica la escritura de aplicaciones cliente con interfaces de usuario.

GNOPE (GUI Development with PHP-GTK2 – User Interfaces)
Es un programa que instala todo lo necesario dejando listo para poder desarrollar aplicaciones en PHP-GTK2.


Descargar Gnope.
Descargamos la versión Release para Windows, www.gnope.org/downloads/GnopeSetup-1.0.exe

Lo ejecutamos y lo instalamos

Una vez instalada tendremos la siguiente estructura de archivos:



Listo, el Gnope trae un administrador de aplicaciones en la cual podemos instalar y desinstalar paquetes de PEAR, abrimos la siguiente ventana de aplicaciones y damos clic en el botón: Install/Unistall programs



Clases de GTK

GtkWindow
Es una clase para construir ventanas en una aplicación que va a contener a objetos como etiquetas, botones, cajas de texto, etc. Los cuales se agregan con una el método add.

Ej.
<?php
 
$window = new GtkWindow(); //Creamos un objecto
$window -> connect_object('destroy', array('gtk', 'main_quit'));
// Destroy es la señal que se liga al método  Gtk::main_quit se lanza al cerrar la ventana
 
$window -> set_title('Nuevo'); //El titulo de la ventana
$window -> set_position(Gtk::WIN_POS_CENTER); //Centra la venta en la pantalla
$window -> set_border_width(8); // Asignamos el borde de la ventana
$boton = new GtkButton('Aceptar'); // Creamos un objeto botón
$window -> add($boton);   //lo agregamos a la ventana
$window -> show_all();   //un método heredado que sirve para mostrar todos los elementos
Gtk::main();     //Entra al ciclo principal del programa
 
?>
 
Desde cualquier editor de texto plano, vamos introducir el siguiente código y lo guardamos con el nombre de apli1.phpw y al terminar simplemente damos doble clic, o desde línea de comandos ponemos: c:PHP-Gtk2php-win.exe apli1.phpw
Resultado del código anterior:


Para ver todos los métodos, señales y propiedades de la clase de ventana lo puedes consultar en la siguiente dirección: php-gtk2.de/manual/en/html/gtk/gtk.gtkwindow.html

Clase botón
En el ejemplo anterior utilizamos una clase GtkButton para crear un botón con etiqueta Aceptar..

Sintaxis:

GtkButton (string label, boolean use_underline)

En este siguiente ejemplo vamos a crear un botón de nombre Aceptar en el cual vamos a lanzar un dialogo de mensaje de “Hola mundo” al dar clic.

<?php
class_exists('gtk') or die('Falta habilitar la extensión php-gtk2 en el php.ini' . "");
 
class classButton extends GtkWindow
{ function __construct()
{ parent::__construct();
$this->connect_object('destroy', array('gtk', 'main_quit')); 
$this->set_title(__CLASS__);
$this->set_position(Gtk::WIN_POS_CENTER);
$this->set_default_size(-1, -1);
$this->set_border_width(8); 
$this->add($this->__create_button());
$this->show_all();
}
function __create_button()
{ $button = new GtkButton('Aceptar');
$button->connect('clicked', array($this, 'onClickedButton'), 'Hola mundo!!!');
return $button;
} 
function onClickedButton($button, $text)
{ $owntext = " ".$text." ";
$dialog = new GtkMessageDialog($this, Gtk::DIALOG_MODAL | Gtk::DIALOG_DESTROY_WITH_PARENT,
Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK,$text);
$dialog->run();
$dialog->destroy();
}
}
 
new classButton();
Gtk::main();
 
?> 
Este seria el resultado: 
Dentro de este ejemplo también hacemos referencia a una clase de nombre GtkMessageDialog, para lanzar un mensajes de dialogo. Sintaxis: GtkMessageDialog (GtkWindow parent, GtkDialogFlags flags, GtkMessage type, GtkButtonsType buttons, string message) Donde los parámetros son los siguientes: parent. Es el formulario padre donde se lanza el dialogo. flags. Son banderas que determinan las opciones para la construcción del dialogo: Valor Nombre 1 Gtk::DIALOG_MODAL 2 Gtk::DIALOG_DESTROY_WITH_PARENT 4 Gtk::DIALOG_NO_SEPARATOR Type. Esta constante define el tipo de dialogo. Valor Nombre Descripción 0 Gtk::MESSAGE_INFO Mensaje de información 1 Gtk::MESSAGE_WARNING Mensaje de peligro de error 2 Gtk::MESSAGE_QUESTION Mensaje de pregunta 3 Gtk::MESSAGE_ERROR Mensaje de error Buttons. Especifica los botones para el mensaje de dialogo. Valor Nombre Descripción 0 Gtk::BUTTONS_NONE No muestra ningún boton 1 Gtk::BUTTONS_OK Boton OK. 2 Gtk::BUTTONS_CLOSE Boton Close. 3 Gtk::BUTTONS_CANCEL Boton cancelar 4 Gtk::BUTTONS_YES_NO Botones de Yes y No. 5 Gtk::BUTTONS_OK_CANCEL Botones OK y Cancel. Caja de texto Modificamos el código anterior en el cual vamos agregar un objeto (GtkVBox) que va contener a la caja de texto(GtkEntry) y al botón, en el cual al dar clic va a mostrar el texto de la caja de texto en un mensaje de dialogo. GtkVBox. Es una caja para organizar los elementos en orden vertical. GtkEntry. Permite la entrada de texto, en otras palabras una caja de texto. Ej.
<?php
class_exists('gtk') or die('Falta habilitar la extension php-gtk2 en el php.ini' . "");
 
class classButton extends GtkWindow
{ function __construct()
{ parent::__construct();
$this->connect_object('destroy', array('gtk', 'main_quit')); 
$this->set_title(__CLASS__);
$this->set_position(Gtk::WIN_POS_CENTER);
$this->set_default_size(-1, -1);
$this->set_border_width(8); 
$this->add($this->__create_box());
$this->show_all();
}
function __create_box()
{ $vbox = new GtkVBox(false, 5);
$vbox->set_border_width(5);
 
$entry = new GtkEntry();
$vbox->pack_start($entry, false, false, 0); 
 
$button = new GtkButton('Aceptar');
$button->connect('clicked', array($this, 'onClickedButton'), $entry);
 
$vbox->pack_start($button, false, true);
 
return $vbox; 
} 
 
function onClickedButton($button, $entry)
{ $dialog = new GtkMessageDialog($this, Gtk::DIALOG_MODAL | Gtk::DIALOG_DESTROY_WITH_PARENT,
Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK,$entry->get_text());
$dialog->run();
$dialog->destroy();
}
}
 
new classButton();
Gtk::main();
 
?>
El resultado seria como la siguiente imagen..

Insertar múltiples datos mediante un checkbox

<form method="post" action="09.php">
<input type="checkbox" name="elec[]" value="eq_sonido" />Equipo de Sonido<br />
<input type="checkbox" name="elec[]" value="microondas" />Microondas<br />
<input type="checkbox" name="elec[]" value="aspiradora" />Aspiradora<br />
<input type="submit" value="submit" name="submit">
</form>
 Esto me manda al sgte codigo PHP

<?
//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.
$link mysql_connect("localhost","root","zxy") or die ("Error: No se ha podido establecer la conexión con maquina local" mysql_error());
mysql_select_db("encuesta",$link) or die ("Error: No se ha podido seleccionar la BBDD de la maquina local" mysql_error());
$elec_array $_POST['elec'];
if (
$elec_array=='')
{
    
$query "INSERT INTO productos (elec) VALUES('')";
    
$result mysql_query($query);
}
else
{
    foreach (
$elec_array as $one_elec
    {
    
$source .= $one_elec.", ";
    }
    
$elec substr($source0, -2);
    echo 
$elec
    
$query "INSERT INTO productos (elec) VALUES('$elec')";
    
$result mysql_query($query);
}
?>

Inserción de Datos con Ajax y POO con PHP

Tenemos la tabla Empleado. También disponemos de la Clase DBManager, esta Clase la vamos a usar
para verificar y realizar la conexión a la Base de Datos.
La Clase cEmpleado se encuentra en el archivo cEmpleado.php, a esta Clase vamos agregarle un método para que guarde un nuevo registro en la tabla Empleado. A este método lo llamaremos crear() el cual tendrá como parámetros de entrada los datos que se requiere del empleado: Nombre, Departamento, Sueldo. Hay que tener en cuenta que el campo idempleado incrementa automáticamente, por ello no lo incluimos dentro de los parámetros.
Veamos como quedaría este método en el archivo cEmpleado.php:

<?php 
 include_once("DBManager.php");
 
 //implementamos la clase empleado
 class cEmpleado{
 
  //constructor 
  function cEmpleado(){
  }
 
  // consulta los empledos de la BD
  function consultar(){
   //creamos el objeto $con a partir de la clase DBManager
   $con = new DBManager;
   //usamos el metodo conectar para realizar la conexion
   if($con->conectar()==true){
    $query = "select * from empleados order by nombres";
    $result = @mysql_query($query);
    if (!$result)
     return false;
    else
     return $result;
   }
  }
 
  //* inserta un nuevo empleado en la base de datos *//
  function crear($nom,$dep,$suel){
   $con = new DBManager;
   if($con->conectar()==true){
    $query = "INSERT INTO empleados (nombres, departamento, sueldo) 
    VALUES ('$nom','$dep',$suel)";
    $result = mysql_query($query);
    if (!$result)
     return false;
    else
     return true;
   }
  }
 
 }
?>

Ya tenemos la Clase cEmpleado con su nuevo método listo para ser usado en cualquier momento. Ahora continuando con el desarrollo vamos a listar todos los empleados de la tabla Empleados. A este archivo lo llamamos consulta.php y va usar las clase cEmpleado. Esta vez vamos a listar los resultados en una tabla HTML. Veamos:

<?php
 include_once("cEmpleado.php");
 
 //creamos el objeto $objempleados de la clase cEmpleado
 $objempleados=new cEmpleado;
 
 //la variable $lista consulta todos los empleados
 $lista= $objempleados->consultar();
?>
<table style="border:1px solid #FF0000; color:#000099;width:400px;">
<tr style="background:#99CCCC;">
<td>Nombres</td>
<td>Departamento</td>
<td>Sueldo</td>
</tr>
<?php
 while($row = mysql_fetch_array($lista)){
  echo "<tr>";
  echo "<td>".$row['nombres']."</td>";
  echo "<td>".$row['departamento']."</td>";
  echo "<td>".$row['sueldo']."</td>";
  echo "</tr>";
 }
?>
</table>

Veamos ahora, el proceso de guardado o inserción de los datos en la tabla Empleado, vamos a llamar a este archivo registro.php y notemos que se crea un objeto de la clase cEmpleado y usamos el método crear() donde especificamos los parámetros requeridos. Al final hace un include al archivo consulta.php para listar los nuevos datos.

<?php
 include_once("cEmpleado.php");
 
 //variables POST
 $nom=$_POST['nombres'];
 $dep=$_POST['departamento'];
 $suel=$_POST['sueldo'];
 sleep(2);
 
 //creamos el objeto $objempleados
 //y usamos su método crear
 $objempleados=new cEmpleado;
 if ($objempleados->crear($nom,$dep,$suel)==true){
  echo "Registro grabado correctamente";
 }else{
  echo "Error de grabacion";
 }
 include('consulta.php');
?>

Ahora las funciones en JavaScript, creamos 3 funciones: 1) para crear el objeto XMLHttpRequest, 2) para enviar y recibir los datos del empleado para que sean guardados en la tabla Empleado y 3) para limpiar las cajas de texto del formulario. El archivo ajax.js va así:

function objetoAjax(){
 var xmlhttp=false;
 try {
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 } catch (e) {
  try {
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (E) {
   xmlhttp = false;
  }
 }
 if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  xmlhttp = new XMLHttpRequest();
 }
 return xmlhttp;
}
 
function enviarDatosEmpleado(){
 //donde se mostrará lo resultados
 divResultado = document.getElementById('resultado');
 divResultado.innerHTML= '<img src="anim.gif">';
 
 //valores de las cajas de texto 
 nom=document.nuevo_empleado.nombres.value;
 dep=document.nuevo_empleado.departamento.value;
 suel=document.nuevo_empleado.sueldo.value;
 
 //instanciamos el objetoAjax
 ajax=objetoAjax();
 
 //uso del medoto POST 
 //archivo que realizará la operacion
 //registro.php
 ajax.open("POST", "registro.php",true);
 ajax.onreadystatechange=function() {
  if (ajax.readyState==4) {
   //mostrar resultados en esta capa
   divResultado.innerHTML = ajax.responseText
 
   //llamar a funcion para limpiar los inputs
   LimpiarCampos();
  }
 }
 ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
 
 //enviando los valores
 ajax.send("nombres="+nom+"&departamento="+dep+"&sueldo="+suel)
}
 
//limpiando las cajas de texto
function LimpiarCampos(){
 document.nuevo_empleado.nombres.value="";
 document.nuevo_empleado.departamento.value="";
 document.nuevo_empleado.sueldo.value="";
 document.nuevo_empleado.nombres.focus();
}

Finalmente, el archivo index.php que contendrá un formulario con caja de texto para escribir los datos del empleado y una lista de los empleados registrado. Una vez que pulsamos el botón Grabar, los datos se guardarán en la tabla Empleado y la lista se actualizará automaticamente. Dentro de las etiquetas <head></head> hacemos referencia al archivo ajax.js, en el atributo onsubmit de la etiqueta <form> especificamos la función enviarDatosEmpleado() y en la dentro de las etiquetas <div id="resultado"></div> en la parte final hacemos un include al archivo consulta.php. El archivo quedaría así:

<html>
<head>
<title>Registro con AJAX</title>
<script language="JavaScript" type="text/javascript" src="ajax.js"></script>
</head>
<body>
<form name="nuevo_empleado" action="" onSubmit="enviarDatosEmpleado(); return false">
<h2>Nuevo empleado</h2>
<p>Nombres 
<label>
<input name="nombres" type="text" />
</label>
</p>
<p>Departamento 
<label>
<select name="departamento">
<option value="Informatica">Informatica</option>
<option value="Contabilidad">Contabilidad</option>
<option value="Administracion">Administracion</option>
<option value="Logistica">Logistica</option>
</select>
</label>
</p>
<p>Sueldo <strong>S/.</strong>
<label>
<input name="sueldo" type="text" />
</label>
</p>
<p>
<label>
<input type="submit" name="Submit" value="Grabar" />
</label>
</p>
</form>
<div id="resultado"><?php include('consulta.php');?></div>
</body>
</html>

Se habrá dado cuenta que hemos incluido un método a la clase cEmpleado y ello sin alterar el método anterior. Incluso hemos usado el método consultar() que ya estaba allí. Esto nos hace ver que si programamos Orientando a Objetos, nuestro código se hace flexible y reutilizable.

Importar datos de archivo CSV (Excel) a Mysql mediante PHP

<?php 
//require("config.php") se refiere al archivo de conexion a la BD
require("config.php"); 
$row = 0

$fp fopen ("prueba.csv","r"); 
//el valor mil indica la cantidad de bytes del archivo

//si el archivo es un poco grande es mejor dejarlo en 0
//en algunos casos el ";" no es aceptado usa ","
while (
$data fgetcsv ($fp1000";")) 

$num count ($data); 
print 
" <br>"
$row++; 
echo 
"$row- ".$data[0].$data[1].$data[2].$data[3].$data[4].$data[5]; 
$insertar="INSERT INTO tutabla () VALUES ('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]')"
mysql_query($insertar); 

fclose ($fp); 

?>

Hacer backup de Mysql desde codigo PHP

<?php
 
// Añade tu codigo de autentificación aquí, etc.
// ¿ Donde se almacena la copia? Debe ser escribible por el servidor web
// y estar fuera del directorio raiz de la web, para que nadie pueda 
// bajarse tu BD desde su navegador
define('BACKUPDIR', '/var/www/privatedata/');
 
// para crear enlaces a esta pagina ( accion del formulario, etc.)
define('THISPAGE', $_SERVER['PHP_SELF']);
 
/**** ALGUNAS FUNCIONES ****/
function doHeader($title) {
  // crea una encabezado de página sencillo.
  ?><html><head><title>
        <?php echo $title;?></title></head><body><?php
}
 
function doFooter() {
 // crea un pie de página sencillo
 ?></body></html><?php
}
 
// si la variable filename en POST no está vacia, es que se ha enviado 
// el formulario
if (!empty($_POST['filename'])) { 
   // ahora validaremos y verificaremos las entradas 
 // para saber lo que tenemos y abortar si hay algo mal
 $errors = array();
 $n = 0;
 /* pondremos cualquier error dentro de este array, y al final 
    los listaremos todos para que los vea el usuario 
           y pueda corregirlos */
  if (empty($_POST['filename'])) { // no hay nombre de fichero
   $errors[$n] = "Debe introducir un nombre de fichero.";
  $n++;
  }
 
 if (empty($_POST['mysqluser'])) { // no hay usuario MySQL 
   $errors[$n] = "Debe introducir un nombre de usuario MySQL.";
   $n++;
 }
 
 if (empty($_POST['mysqlpass'])) { // no hay password MySQL 
   $errors[$n] = "Debe introducir un password MySQL .";
   $n++;
 }
 
        // Ha seleccionado copiar una BD, pero no han dicho cual
 if ($_POST['backupall'] == 'false' AND 
            empty($_POST['backupwhichdb'])) { 
        $errors[$n] = "Has selecciona copiar una base de datos, ".
                            "pero no especificaste cual.";
       $n++; 
 }
 
 if ($n > 0) { // Si hubo errores en la fase de validacion...
   // muestra una pagina de error
    doHeader('Remote Database Backup');
 
  ?><h1>Remote Database Backup</h1>
  <h2>No se pudo realizar la copia.</h2>
  <ul>
                        // recorre los errores 
   <?php foreach ($errors as $err) { 
     ?><li>
                          <?php echo $err; // y muestra su texto ?>
                          </li><?php
   }
   ?>
  </ul>
 
  <a href="<?php echo THISPAGE;?>">
                      Volver al formulario de Backup</a>
  <?php
 
  doFooter();

  die(); // sale del script 
 }
 
 // Si estamos aqui, es que se ha acabado bien la validación 
 // hacemos "escape shell" a los argumentos para evitar 
        // la inyección de código
 // recuerda que esto es solo seguridad basica, se deberian 
        // añadir mas capas para mayor seguridad
 $_POST['filename'] = escapeshellcmd($_POST['filename']);
 $_POST['mysqluser'] = escapeshellarg($_POST['mysqluser']);
 $_POST['mysqlpass'] = escapeshellcmd($_POST['mysqlpass']);
 $_POST['backupwhichdb']=escapeshellarg($_POST['backupwhichdb']);
 
 // Queremos copiar todas las bases de datos?
 $backupall = ($_POST['backupall'] == 'false') ? false : true;
 
 // Si queremos copiar todas, ponemos esto con -A en el comando, 
        // sino, lo ponemos con el nombre de la base de datos a copiar
 $dbarg = $backupall ? '-A' : $_POST['backupwhichdb'];
 
 // formamos el comando a ejecutar
 $command = "mysqldump ".$dbarg." -u ".$_POST['mysqluser'].
         " -p".$_POST['mysqlpass']." -r \"".BACKUPDIR.$_POST['filename'].
         "\" 2>&1";
 
 // creamos una cabecera y mostramos el progreso al usuario
        // Podria tomar su tiempo
 doHeader('Remote Database Backup');
 
 ?><h1>Ejecutando el backup, por favor espere...</h1><?php
 
 // execute the command we just set up
 system($command);
 
 // si eligieron comprimir con bzip, entonces se hace
 if ($_POST['bzip'] == 'true') {
  system('bzip2 "'.BACKUPDIR.$_POST['filename'].'"');
 }
 
 // OK, terminamos. Digale al usuario lo que ha pasado. 
        // Si ocurrio algun error, se muestran en la llamada a system()
 ?><h2>Comando ejecutado. 
              Si hubo errores, Se mostrarán arriba.</h2>
 <a href="<?php echo THISPAGE;?>">
        Volver al formulario de Backup</a>
        <?php
 
 // pretty footer
 doFooter();
 
 // y salidos, hemos terminado!
 die();
}
 
// Si el formulario no se envió, entonces se muestra al usuario 
// por primera vez con su cabecera
doHeader('Remote Database Backup');
 
?><h1>Remote Database Backup</h1>
<p><em><strong>Por favor:</strong> una vez pulse Crear, 
la copia podría durar unos 15 seg. para que se cree. 
La página no se cargará inmediatamente, ten paciencia.</em></p>
 
<form name="dbbackup" method="post" action="<?php echo THISPAGE;?>">
Nombre del fichero: <strong><?php echo BACKUPDIR;?></strong>
<input type="text" name="filename" 
  value="<?php echo date('dMY_H.i.s').'.sql';?>" /><br />
<input type="checkbox" name="bzip" value="true" id="bzipTick" />
<label for="bzipTick">Usar Bzip2 para compresion</label><br /><br />
Nombre de usuario MySQL: 
<input type="text" name="mysqluser" value="" /><br />
Password MySQL: 
<input type="password" name="mysqlpass" value="" /><br /><br />
Backup ¿ de que ?<br />
<input type="radio" name="backupall" 
       value="true" id="backupallTrue" />
<label for="backupallTrue">Todas las bases de datos</label><br />
<input type="radio" name="backupall" 
       value="false" id="backupallFalse" />
<label for="backupallFalse">Una en especifico</label> 
<input type="text" name="backupwhichdb" value="" /><br />
<br /><br />
<input type="submit" value="Crear" />
</form>
 
<?php
 
// el pie de página
doFooter();

?>

Habilitar y deshabilitar

<html>

<
head>
<
script type="text/javascript">
function 
habilitar(obj) {

  var 
hab;
  
frm=obj.form;
  
num=obj.selectedIndex;
  if (
num==1hab=true;
  else if (
num==2hab=false;
  
frm.sueldo.disabled=hab;
  
frm.nombre.disabled=hab;
}

</script>

</head>
<body>
<form>

<select onchange="habilitar(this)">
<option>trabaja</option>
<option>no trabaja</option>
<option>independiente</option>
</select>
<input type="text" name="sueldo" />
<input type="text" name="nombre" />
</body>
</html> 

Formulario de Contacto

Código :
<HTML>
<HEAD>
<TITLE>CONTACTO</TITLE>
</HEAD>
<BODY>
   <form id="contacto" name="contacto" method="post" action="enviar.php">
      <p><label>Nombre<input name="nombre" type="text" id="nombre" size="30" /></label></p>
      <p><label>Empresa<input name="empresa" type="text" id="empresa" size="30" /></label></p>
      <p><label>Mail<input name="mail" type="text" id="mail" size="30" /></label></p>
      <p><label>Mensaje<br />
      <textarea name="mensaje" cols="40" rows="8" id="mensaje"></textarea></label></p>
      <p><input type="submit" name="Submit" value="Enviar" /></p>
</form>
</BODY>
</HTML>

Aqui el PHP:
Código :
<?php 
 
$nombre = $_POST['nombre'];
$mail = $_POST['mail'];
$empresa = $_POST['empresa'];
 
$header = 'From: ' . $mail . " \r\n";
$header .= "X-Mailer: PHP/" . phpversion() . " \r\n";
$header .= "Mime-Version: 1.0 \r\n";
$header .= "Content-Type: text/plain";
 
$mensaje = "Este mensaje fue enviado por " . $nombre . ", de la empresa " . $empresa . " \r\n";
$mensaje .= "Su e-mail es: " . $mail . " \r\n";
$mensaje .= "Mensaje: " . $_POST['mensaje'] . " \r\n";
$mensaje .= "Enviado el " . date('d/m/Y', time());
 
$para = 'jalbarracin@molca.com.ar';
$asunto = 'Consulta';
 
mail($para, $asunto, utf8_decode($mensaje), $header);
echo 'Su mensaje ha sido enviado.';
?>

Crear PDF Personalido con FPDF de PHP

El ejemplo básico de fpdf es el siguiente:
<?php
require(’fpdf.php’);
$pdf=new
FPDF();
$pdf->AddPage();
$pdf->SetFont(’Arial’,'B’,16);
$pdf->Cell(40,10,’¡Hola,
Mundo!’);
$pdf->Output();
?>
Si deseamos cambiar la orientación del papel, tamaño o unidad de medida solo tenemos que indicarlo en los parametros que se pasan al constructor.
FPDF([string orientation [, string unit [, mixed format]]])
Por defecto el constructor tiene los siguientes valores:
FPDF($orientation=’P',$unit=’mm’,$format=’A4′)
Si queremos generar un pdf en forma horizontal con una hoja tamaño legal y con dimensiones en centímetros tendríamos que pasar los siguientes parámetros:
$pdf=new
FPDF(’L',’cm’,'Legal’);

Orientación:
* P o Portrait (normal) por defecto
* L o Landscape (apaisado) Unidad
* pt: punto
* mm: milimetro por defecto
* cm: centimetro
* in: pulgada

Un punto es igual a 1/72 de pulgada, es decir cerca de 0.35 mm (siendo una pulgada 2.54 cm). Esta es una unidad muy común en tipografía; los tamaños de fuentes son expresados en esa unidad.
Formato (texto sensible a minúscula/mayúscula)
* A3
* A4
* A5
* Letter
* Legal
Un formato personalizado en la forma de un array de dos elementos conteniedo el ancho y el alto (expresado en la unidad dada por unit).
La clase tiene por defecto una serie de opciones, pero eso no es una limitante para ampliarlas =) Por ejemplo si quisieramos manejar un tamaño no contemplado en la clase tendremos que agregar la descripción y luego comparar el valor recibido.
La sección es Formato de Página:
//Page
format
if(is_string($format))
{
$format=strtolower($format);
if($format==’letter’)
$format=array(612,792);
elseif($format==’a4′)
$format=array(595.28,841.89);

elseif($format==’mcarta‘)
//media
carta
$format=array(311,396);

$this->fwPt=$format[0];//ancho
del formato de página en puntos
$this->fhPt=$format[1];//alto del
formato de página en puntos
}
Con eso debería bastar para tener otra formato de página, en el caso que se desee pasar un tamaño personalizado, el constructor tendría que alterarse un poco más.
Recibiendo los valores de ancho, alto de la página y válidando el formato con la cadena recibida como en el caso de arriba, asignado al Array los valores de ancho y alto.
FPDF($orientation=’P',$unit=’mm’,$format=’A4′, $wcustom=0, $hcustom=0)
elseif($format==’custom’)
//Personalizado
$format=array($wcustom,$hcustom);
y lo demás es historia je, je.. Por lo tanto el código al inicio del post solo cambiara en una línea:
$pdf=new
FPDF(’P',’cm’,'mcarta’);


P.D.  Obtención de medidas
Pulgada - 2.54 cm
Punto - 1/72 pulgada
Punto - 0.35 mm - 0.03527 7777
(valor tomado en los calculos)
Por defecto es mm
Ejemplo Tamaño Carta medidas w 21.59| h 27.94.
612 x 72 = 44064
792 x
72 = 57024
21.59 / 612 = 0.03527 7777
27.94 / 792 = 0.03527 7777
21.59 / 0.03527 7777 = 612.0000135
27.94 / 0.03527 7777 = 792.0000175
Tomando el valor en mm las medidas aumentan un poco, queda a criterio de cada uno
21.59 / 0.035 = 616.86
27.94 / 0.035 = 798.29
Media Carta
10.79 / 0.03527 7777 = 311 - 310.9606368
13.97 / 0.03527
7777 = 396

Exportar Mysql a CSV (Archivo de Excel)

function creaCSV()

{
$bd_base = "bdd";
$con = mysql_connect("localhost", "root", "contrasena");
mysql_select_db($bd_base, $con);

$consulta = "SELECT * FROM tblDatos";
$datosLinia=mysql_query($consulta,$con);


$nomFitchero = "c:\fichero.csv";

while($row =
mysql_fetch_array($datosLinia))
{

$linia = $row[1];
$linia .= ";".$row[2];
$linia .= ";".$row[3];
$linia .= ";".$row[4];
$linia .= ";".$row[5];
$linia .= ";".$row[6]."rn";

$p = fopen($nomFitchero,a);

if($p)fputs($p,$linia);
}
fclose($p);
// Ojo ! fitchero separado por ';'
// Si no te funciona prueba con ',' debido a las versiones de Excel.
}

Exportar CSV a Mysql

function exportarCSV_a_mySQL($fileCSV)
{
 $registros=0;
 
 $ruta=$fileCSV['tmp_name'];
 
 if(!file_exists($ruta))
 {return false;}
 
 $tabla=quitar_extension($fileCSV['name']);
 
 $borra_tabla="DROP TABLE `".$tabla."`";
 mysql_query($borra_tabla);
 $f=fopen($ruta,"r");
 if($f)
 {
  echo "<b>Guardando CSV en la BDD :</b><br />";
  $contenido=fread($f,filesize($ruta));
  fclose($f);
  $contenido=ereg_replace("\r\n", "\n" , $contenido); // convertimos windows a unix
  $lineas=explode("\n",$contenido);
  $titulo=explode(";",$lineas[0]);
  $NUM_CAMPOS=count($titulo);
  $sql_generado_para_eliminar="";
  $crear_tabla_campos="";
  for($i=0;$i<$NUM_CAMPOS;$i++)
  {
  $titulo[$i]=ereg_replace("\"", "" , $titulo[$i]); // kitamos comillas
  $sql_generado_para_eliminar.=" AND `".$titulo[$i]."` =''";
  $crear_tabla_campos.="`".$titulo[$i]."` varchar(60) NOT NULL";
   if($i+1!=$NUM_CAMPOS)// si no es el ultimo , ponemos coma
   {
   $crear_tabla_campos.=",";
   }
  }
  $crear_tabla="CREATE TABLE `".$tabla."` (".$crear_tabla_campos.") ENGINE=MyISAM DEFAULT CHARSET=latin1;";
  mysql_query($crear_tabla);
  $linea=1;
  do
  {
   $insertar_titulos="";
   $insertar_campos="";
   $campo=explode(";",$lineas[$linea]);
   for($i=0;$i<$NUM_CAMPOS;$i++)
   {
   $campo[$i]=ereg_replace("\"", "" , $campo[$i]);
   $insertar_titulos.=" `".$titulo[$i]."` ";
   $insertar_campos.=" '".$campo[$i]."' ";
    if($i+1!=$NUM_CAMPOS)// si no es el ultimo , ponemos coma
    {
    $insertar_titulos.=",";
    $insertar_campos.=",";
    }
   }
   $sql="INSERT INTO `".$tabla."` ( ".$insertar_titulos." ) VALUES ( ".$insertar_campos." );";
   if(mysql_query($sql))
   {
   echo ". ";
   $registros++;
   }
   else
   {echo "X ";return false;}
  $linea++;
  }while(next($lineas));
 
 $sql="DELETE FROM `".$tabla."` WHERE 1".$sql_generado_para_eliminar;mysql_query($sql);
 echo "<br />";
 return $tabla;
 }
 else
 {
 return false;
 }
}
 
function quitar_extension($archivo)
{
 $extension = strrchr($archivo,".");
 $pos=strpos($archivo,$extension);
 return substr($archivo,0,$pos);
}


Código ejemplo de llamada / Code exmple call :

$tabla = exportarCSV_a_mySQL($_FILES['archivo_csv']);
if($tabla)
{
echo "Export OK in mysql table : ".$tabla;
}
else
{
echo "Error in export ...";
}

Exportar BD Mysql a Excel con PHP

hola espero a alguien le ayude este ejemplo como exportar datos de mysql a excel primero hay que crear una tabla en html comun y corriente con una variable shtml. y despues el codigo entre comillas y despues vreal ya sea un ciclo for o un foreach para ingresar los datos enla tabla creada
ejemplo:
$shtml .= "<table width='718' cellpadding='1'
cellspacing='1'>";
$shtml .= "<tr>";
$shtml .= "<td
colspan=10 height='80'align='center'>";
$shtml .= "<font
size='11'><br>Instituto Nacional de Migracion Delegaci&oacute;n
Jalisco</br>"; // aca pone el titulo
$shtml .= "</td>";

$shtml .= "</tr>";
$stylo_1="width='100' height='18'
style='padding: 2' align='left'";
$stylo_2="width='100' bgcolor='#E1E1E1'
style='padding: 2' height='25' align='left'";
$shtml .= "<tr $stylo_1
font size='2' face='Arial' >";
$shtml .= "<td
bgcolor='#C0C0C0'><b>Nombre</b></div></td>";

$shtml .= "<td
bgcolor='#C0C0C0'><b>Nacionalidad</b></td>";
$shtml .=
"<td bgcolor='#C0C0C0'><b>Expediente Migratorio/b></td>";

$shtml .= "<td bgcolor='#C0C0C0'><b>Fecha
Internacion</b></td>";
$shtml .= "<td
bgcolor='#C0C0C0'><b>Lugar de Internacion</b></td>";

$shtml .= "<td bgcolor='#C0C0C0'><b>Sexo</b></td>";

$shtml .= "<td bgcolor='#C0C0C0'><b>Estado
Civil</b></td>";
$shtml .= "<td
bgcolor='#C0C0C0'><b>Fecha</b></td>";
$shtml .= "<td
bgcolor='#C0C0C0'><b>Lugar de Nacimiento</b></td>";

$shtml .= "<td bgcolor='#C0C0C0'><b>N&deg; de
forma</b></td>";
$shtml .= "<td
bgcolor='#C0C0C0'><b>Tipo de forma</b></td>";
$shtml .=
"</tr>";
esa es la tabla despues generamos el foreach del mismo tamaño que la tabla creada anteriormente.

foreach($Data->persona AS
$persona)
{
$shtml .= "<tr $stylo_2 font size='2' face='Arial'>";

$shtml .= "<td >{$persona[$nombre]}</td>";
$shtml .= "<td
>{$persona['nacionalidad']}</td>";
$shtml .= "<td
>{$persona['expediente_migratorio']}</td>";
$shtml .= "<td
>{$persona['fecha_internacion']}</td>";
$shtml .= "</td>";

$shtml .= "<td >{$persona['lugar_internacion']}</td>";

$shtml .= "<td >{$persona['sexo']}</td>";
$shtml .= "<td
>{$persona['edo_civil']}</td>";
$shtml .= "<td
>{$persona['fecha']}</td>";
$shtml .= "<td
>{$persona['lugar_nacimiento']}</td>";
$shtml .= "<td
>{$persona['numero_forma']}</td>";
$shtml .= "<td
>{$persona['tipo']}</td>";
$shtml .= "</tr>";
}
despues creamos el archivo donde guardaremos la tabla es el siguiente

$scarpeta=TO_ROOT .'/reportes/';
// echo $scarpeta;
//debe tener
permisos 775 por lo menos
$hoy=date('d-m-Y');
$hora=date('H-i-s');

$archivo=$tarea."_".$hoy."_".$hora;

$sfile=$scarpeta."".strftime($archivo).".xls"; //ruta del archivo a generara

$fp=fopen($sfile,"w");
fwrite($fp,$shtml);
fclose($fp);

echo
"<p align='center'>Nombre y Ruta Del archivo.</p>";
?>
<p align='center'><a href="<?php echo TO_ROOT
."/reportes/".$archivo.".xls"; ?>">Abrir el archivo </a></p>
<?php

el TO_ROOT indica la ruta del archivo y listo tambien le decimos donde queremos guardarlo en que carpeta
eso es todo gracias espero que les sirva atte Jorge

Eventos en JavaScript

En JavaScript, la interacción con el usuario se consigue mediante la captura de los eventos que éste produce. Un evento es una acción del usuario ante la cual puede realizarse algún proceso (por ejemplo, el cambio del valor de un formulario, o la pulsación de un enlace).
Los eventos se capturan mediante los manejadores de eventos. El proceso a realizar se programa mediante funciones JavaScript llamadas por los manejadores de eventos.
La siguiente tabla muestra los manejadores de eventos que pueden utilizarse en JavaScript, la versión a partir de la cual están soportados y su significado.



Manejador
Versión
Se produce cuando...
onAbort
1.1
El usuario interrumpe la carga de una
imagen
onBlur
1.0
Un elemento de formulario, una ventana o
un marco pierden el foco
onChange
1.0 (1.1 para FileUpload)
El valor de un campo de formulario
cambia
onClick
1.0
Se hace click en un objeto o
formulario
onDblClick
1.2 (no en Mac)
Se hace click doble en un objeto
o formulario
onDragDrop
1.2
El usuario arrastra y suelta un objeto en
la ventana
onError
1.1
La carga de un documento o imagen produce
un error
onFocus
1.1 (1.2 para Layer)
Una ventana, marco o elemento de
formulario recibe el foco
onKeyDown
1.2
El usuario pulsa una tecla
onKeyPress
1.2
El usuario mantiene pulsada una
tecla
onKeyUp
1.2
El usuario libera una tecla
onLoad
1.0 (1.1 para image)
El navegador termina la carga de una
ventana
onMouseDown
1.2
El usuario pulsa un botón del ratón
onMouseMove
1.2
El usuario mueve el puntero
onMouseOut
1.1
El puntero abando una área o enlace
onMouseOver
1.0 (1.1 para area)
El puntero entra en una área o
imagen
onMouseUp
1.2
El usuario libera un botón del
ratón
onMove
1.2
Se mueve una ventana o un marco
onReset
1.1
El usuario limpia un formulario
onResize
1.2
Se cambia el tamaño de una ventana o
marco
onSelect
1.0
Se selecciona el texto del campo texto o
área de texto de un formulario
onSubmit
1.0
El usuario envía un formulario
onUnload
1.0
El usuario abandona una
página



Ejemplo de evento:
<INPUT TYPE="text" onChange="CompruebaCampo(this)">
En este ejemplo, CompruebaCampo() es una función JavaScript definida en alguna parte del documento HTML (habitualmente en la cabecera del mismo). El identificador this es una palabra propia del lenguaje, y se refiere al objeto desde el cual se efectua la llamada a la función (en este caso, el campo del formulario).
La siguiente tabla muestra los eventos que pueden utilizarse con los objetos del modelo de objetos JavaScript del Navigator.



Manejador de evento
Objetos para los que está
definido
onAbort
Image
onBlur
Button, Checkbox, FileUpload, Layer,
Password, Radio, Reset, Select, Submit, Text, Textarea,
window

onChange
FileUpload, Select, Text,
Textarea

onClick
Button, document, Checkbox, Link,
Radio, Reset, Submit

onDblClick
document, Link
onDragDrop
window
onError
Image, window
onFocus
Button, Checkbox, FileUpload, Layer,
Password, Radio, Reset, Select, Submit, Text, Textarea,
window

onKeyDown
document, Image, Link,
Textarea

onKeyPress
document, Image, Link,
Textarea

onKeyUp
document, Image, Link,
Textarea

onLoad
Image, Layer, window
onMouseDown
Button, document, Link
onMouseMove
Ninguno (debe asociarse a uno)
onMouseOut
Layer, Link
onMouseOver
Layer, Link
onMouseUp
Button, document, Link
onMove
window
onReset
Form
onResize
window
onSelect
Text, Textarea
onSubmit
Form
onUnload
window



2. Métodos de evento disponibles en JavaScript

Los siguientes métodos de evento pueden utilizarse en JavaScript:



Métodos de evento
Función que realizan
blur()
Elimina el foco del objeto desde el que
se llame
click()
Simula la realización de un
click sobre el objeto desde el que se llame
focus()
Lleva el foco al objeto desde el que se
llame
select()
Selecciona el área de texto del campo
desde el que se llame
submit()
Realiza el envío del formulario desde el
que se llame



Ejemplo:
<HTML>
<HEAD><TITLE>Eventos</TITLE>
<SCRIPT>
<!--
function
Reacciona(campo) {
    alert("¡Introduzca un valor!")

    campo.focus()
}
//-->

</SCRIPT></HEAD>
<BODY> <FORM
METHOD=POST>
<INPUT TYPE=text NAME=campo
onFocus="Reacciona(this)">
</FORM> </BODY>
</HTML>

3. Eventos onLoad y onUnload

Se usan como atributos del tag <BODY> de HTML.
Ejemplo:
<BODY onLoad="Hola()" onUnload="Adios()">
La función Hola() se ejecutará antes de que se cargue la página y la función Adios() al abandonarla.
Ejemplo:
<HTML>
<HEAD>
<TITLE>Ejemplo onLoad
y onUnload</TITLE>
</HEAD>
<BODY
onLoad="alert('¡Bienvenido a mi página!')" onUnload="alert('¡Vuelva
pronto!')">
...
</BODY>
</HTML>
En este otro ejemplo se utilizan funciones:
<HTML>
<HEAD>
<TITLE>Ejemplo con
funciones</TITLE>
<SCRIPT
LANGUAGE="JavaScript">
<!--
var name = ""
function Hola()
{
    nombre = prompt('Introduzca su
nombre:','')
    alert('¡Hola ' + nombre +
'!')
}

function Adios() {
    alert('¡Adios
' + nombre +
'!')
}
//-->
</SCRIPT>
</HEAD>
<BODY
onLoad="Hola()"
onUnload="Adios()">
...
</BODY>
</HTML>

4. Ejemplo de aplicación en formularios

Vamos a ver un ejemplo para un campo de texto:
<INPUT TYPE=text NAME="test" onBlur="alert('¡Gracias!')"
onChange="Comprueba(this)">
En este ejemplo, simulamos una calculadora interactiva:
<HTML>
<HEAD><TITLE>Calculadora
interactiva</TITLE>
<SCRIPT
LANGUAGE="JavaScript">
<!--
function Calcula(form)
{
    form.resultados.value =
eval(form.entrada.value)
}

function CogeExpresion(form)
{
    form.entrada.blur()
   
form.entrada.value = prompt("Introduce una expresión matemática válida
en JavaScript","")
    Calcula(form)
}
//-->
</SCRIPT></HEAD> <BODY> <FORM
METHOD=POST>
Calculadora interactiva:
<INPUT TYPE=text
NAME="entrada" VALUE=""
onFocus="CogeExpresion(this.form)">
<BR>El resultado
es:<INPUT TYPE=text NAME="resultados" VALUE=""
onFocus="this.blur()">
</FORM> </BODY> </HTML>