PHP Twitter es una clase PHP que permite trabajar con la API de Twitter. Requiere PHP 5.2 y el módulo lib_curl. Está desarrollada para trabajar con datos en JSON pero también puede trabajar con formatos XML, RSS o Atom.
Su uso es muy sencillo. Por ejemplo, el siguiente código mostraría nuestro timeline público.
A raiz de la publicación del post The
Perishable Press 4G Blacklist me surgió la idea de publicar una de
las clases en PHP que utilizo para controlar la seguridad de los sitios web desarrollados en este lenguaje. Toda prevención
es poca y hay veces que no tenemos acceso al fichero .htaccess, no conocemos lo suficiente su funcionamiento, el servidor
no es Apache, etc. En ese caso utilizar una clase como la siguiente nos puede ser útil para evitar ataques CSRF o
XSS mediante parámetros GET.
La clase testea cada uno de los parámetros recibidos y:
1.- Se asegura que no esté en la lista de palabras baneadas
2.- Se asegura de que no tenga una longitud superior a la especificada
3.- Comprueba que sólo contenga caracteres alfanuméricos
Si se detecta un parámetro no válido se redirige a la $url especificada.
NOTA: Esta clase únicamente controla los parámetros recibidos por $_GET. Fácilmente
se podría adaptar o modificar la clase para la información recibida por $_POST o que incluso se ocupase de
ambas cosas pero quería mostrar un uso muy sencillo. Lo ideal es combinar esta clase con otras clases o funciones
que comprueben el contenido recibido a través
de los formularios, utilizar tokens en los formularios, establecer los permisos apropiados
a las carpetas del sitio web, utilizar .htaccess, recurrir a filter_input si
la versión de PHP instalada es
reciente, etc. En estas cosas más vale que sobre que falte.
mPDF es una clase de PHP que genera archivos PDF a partir de HTML codificado en UTF-8. Se basa en FPDF, HTML2FPDF, y UFPDF, con una serie de mejoras. La gran mejora aportada respecto a las anteriormente mencionadas librerías, es que permite generar archivos PDF "al vuelo", a partir de HTML, con soporte a estilos CSS.
Existen varias formas de exportar a Excel mediante PHP. En este post vamos a servirnos de la clase Excel Writer. La clase
es muy sencilla de utilizar y nos puede permitir realizar el proceso de exportación de una tabla de nuestra base de
datos sin grandes complicaciones. Primero veamos un ejemplo básico muy ilustrativo del funcionamiento de la clase.
<php
include("excelwriter.inc.php");
$excel=new ExcelWriter("FicheroExcel.xls");
if($excel==false) {
echo $excel->error;
}
// PRIMERA FORMA DE ESCRITURA DE FILAS
$myArr=array("CeldaA1","CeldaB1","CeldaC1","CeldaD1");
$excel->writeLine($myArr);
$myArr=array("CeldaA2","CeldaB2","CeldaC2","CeldaD2");
$excel->writeLine($myArr);
//SEGUNDA FORMA DE ESCRITURA DE FILAS
$excel->writeRow();
$excel->writeCol("CeldaA3");
$excel->writeCol("CeldaB3");
$excel->writeCol("CeldaC3");
$excel->writeCol("CeldaD3");
$excel->writeRow();
$excel->writeCol("CeldaA4");
$excel->writeCol("CeldaB4");
$excel->writeCol("CeldaC4");
$excel->writeCol("CeldaD4");
$excel->close();
echo "Los datos se han grabado con éxito.";
?>
Supongamos ahora que tenemos una tabla con una serie de comercios y deseamos poder exportarla, para uso propio o porque
el cliente nos lo ha pedido, a una hoja de cálculo Excel. Un ejemplo de utilización de la clase Excel Writer
para exportar datos de una tabla de una base de datos MySQL sería:
<?php
include("includes/excelwriter.inc.php");
$excel=new ExcelWriter("galeria_comercial.xls");
if($excel==false) {
echo $excel->error;
}
//Escribimos la primera fila con las cabeceras
$myArr=array("Nombre Comercial","Direccion","CP","Localidad","Telefono","Email");
$excel->writeLine($myArr);
//REALIZAMOS LA CONSULTA
$dbhost = "localhost";
$dbuser = "usuario";
$dbpassword = "password";
$dbname = "base_de_datos";
$db2 = mysql_connect($dbhost, $dbuser, $dbpassword) or die("Connection Error: " . mysql_error());
mysql_select_db($dbname) or die("Error al conectar a la base de datos.");
$sql2 = "SELECT * FROM ComerciosGaleria";
$sql2 .= " ORDER BY NombreComercial ASC ";
$result2 = mysql_query( $sql2) or die("No se puede ejecutar la consulta: ".mysql_error());
//Escribimos todos los registros de la base de datos
//en el fichero EXCEL
while($Rs2 = mysql_fetch_array($result2)) {
$myArr=array(
$Rs2['Nombre_Comercial'],
$Rs2['Direccion'],
$Rs2['CodigoPostal'],
$Rs2['Localidad'],
$Rs2['Telefono'],
$Rs2['Email']
);
$excel->writeLine($myArr);
//Otra forma es
//$excel->writeLine($Rs2);
//De este modo volcariamos todos los registros seleccionados
//Sin necesidad de colocarlos/filtrar previamente en $myArr
}
$excel->close();
//Abrimos el fichero excel que acabamos de crear
header("location:galeria_comercial.xls");
?>
Easy Google Maps es una clase para PHP que, como su nombre indica facilita la inclusión de mapas a través de Google Maps en un sitio web. Lo primero que deberemos hacer, para poder utilizar la API de Google Maps es obtener una key o clave para el dominio en el que pensemos utilizar la API.
Una vez tenemos una key podemos invocar un mapa de un modo tan sencillo como:
<?php
require'EasyGoogleMap.class.php';
$key ="XXXXXXXXXX";
$gm = & new EasyGoogleMap($key);
$gm->SetMapZoom(15);
$gm->SetAddress("Colon 22, Valencia");
$gm->SetInfoWindowText("Esta es la primera dirección");
$gm->SetAddress("Periodista Azzati 7, Valencia");
$gm->SetInfoWindowText("Esta es la segunda dirección");
?>
<html>
<head>
<title>EasyGoogleMap</title>
<?php echo $gm->GmapsKey(); ?>
</head>
<body>
<?php echo $gm->MapHolder(); ?>
<?php echo $gm->InitJs(); ?>
<?php echo $gm->UnloadMap(); ?>
</body>
</html>
Algunas de las propiedades que podemos establecer son las siguientes:
//Para habilitar/deshabilitar el zoom progresivo.
// De modo predeterminado deshabilitado (FALSE)
$gm->mContinuousZoom = FALSE;
//Para habilitar/deshabilitar La escala del mapa.
// De modo predeterminado habilitado (TRUE)
$gm->mScale = TRUE;
//Para habilitar/deshabilitar el mapa interno.
// De modo predeterminado deshabilitado (FALSE)
$gm->mInset = FALSE;
//Para habilitar/deshabilitar el tipo de mapa.
// De modo predeterminado deshabilitado (FALSE)
$gm->mMapType = FALSE; # default
//Para establecer las dimensiones del mapa
//De modo predeterminado 300px x 300px
$gm->SetMapWidth(500);
$gm->SetMapHeight(500);
//Para establecer el zoom
//De modo predeterminado 13
$gm->SetMapZoom(10);
//Para establecer el tipo de puntero
// De modo predeterminado se utiliza GT_FLAT
$gm->SetMarkerIconStyle('FLAG');
$gm->SetMarkerIconStyle('GT_FLAT');
$gm->SetMarkerIconStyle('GT_PILLOW');
$gm->SetMarkerIconStyle('HOUSE');
$gm->SetMarkerIconStyle('PIN');
$gm->SetMarkerIconStyle('PUSH_PIN');
$gm->SetMarkerIconStyle('STAR');
//Para establecer el color del puntero
// De modo predeterminado se utiliza PACIFICA
$gm->SetMarkerIconColor('PACIFICA');
$gm->SetMarkerIconColor('YOSEMITE');
$gm->SetMarkerIconColor('MOAB');
$gm->SetMarkerIconColor('GRANITE_PINE');
$gm->SetMarkerIconColor('DESERT_SPICE');
$gm->SetMarkerIconColor('CABO_SUNSET');
$gm->SetMarkerIconColor('TAHITI_SEA');
$gm->SetMarkerIconColor('POPPY');
$gm->SetMarkerIconColor('NAUTICA');
$gm->SetMarkerIconColor('DEEP_JUNGLE');
$gm->SetMarkerIconColor('SLATE');
//Establecer el texto del bocadillo informativo
$gm->SetInfoWindowText("Este es el punto uno")
El uso es realmente sencillo. Lo unico que no me acababa de gustar es que apareciese el bocadillo de la primera dirección. Prefiero que aparezcan los bocadillos cuando el usuario hace click. Simplemente cogiendo la clase y comentando estas dos líneas ya lo tendremos,
if ($i===0) $ret .= "marker.openInfoWindowHtml(address_$i.infowindowtext);\n";
PHP dispone de una función denominada get_declared_clases() que permite obtener una lista de todas las clases disponibles tanto por la propia instalación de PHP como las definidas por nosotros mismos o incluidas en bibliotecas de terceros. Con el siguiente ejemplo obtendríamos un listado alfabético de todas las clases disponibles para tu aplicación:
Interesante biblioteca de clases. Muy útil por ejemplo para dar salida a informes creados por aplicaciones web en entornos abiertos.
PHP DocWriter es conjunto de clases escritas en PHP capaz de generar documentos en formato OpenOffice.org XML (es decir, documentos StarOffice/OpenOffice.org). Tambíen es capaz de comunicarse con la aplicación OpenOffice.org con el objetivo de que esta pueda convertir los documentos OpenOffice.org XML generados a cualquier otro formato soportado por la aplicación OpenOffice.org de forma autómatica y transparente. Esta librería esta todavia bajo desarrollo pero es completamente usable en este momento. Hasta ahora, soporta las siguientes características: Cabecera y pie de página, Cuadros de texto, Imágenes, Tablas, Dibujos, Meta-información de los documentos, Conversión automática de los documentos creados a otros formatos, etc.
Esta es la primera clase que hago en PHP. Ya había hecho alguna en Actionscript pero ésta es la primera que hago para PHP. Ocurre que PHP es un lenguaje con una comunidad tan grande que ya hay clases para todo lo que uno pueda imaginar. Clases para enviar correos deben haber bastantes y con bastantes más funcionalidades, pero ésta es sencilla y funciona correctamente. La clase es:
class correo{
var $destinatario;
var $remitente;
var $asunto;
var $mensaje;
function enviar() {
$headers = "From: ".$this->remitente."\r\nReply-To: ". $this->remitente;
ob_start();
$message = ob_get_clean();
$mail_sent = @mail( $this->destinatario, $this->asunto, $this->mensaje, $headers );
echo $destinatario;
echo $mail_sent ? "Correo Enviado" : "No se ha podido enviar el correo";
}
}
Para hacer uso de ella (Un servicio SMTP debe estar disponible para PHP en el servidor):
$g = new correo();
$g->destinatario = 'direccion@correo.com';
$g->remitente = 'remitente@correo.com';
$g->asunto = 'Este es el asunto del mensaje';
$g->mensaje = 'Este es el cuerpo del mensaje.';
$g->enviar();
Esta clase permite separar la Capa de Datos y de Programación (API) de un reproductor de MP3, con respecto a la Interfaz Grafica (GUI).
Lo bueno de esto es que permite una versatilidad en el diseño de la GUI, sin tener que preocuparse por la API.
La clase es muy sencilla, pero como siempre dejo algunos detalles que se pueden mejorar y así hacer un poco más entretenida la tarea de implementar o mejorar la clase.
De apoco iré armando un miniFrameWork (mFW), para que aquellas ávidas mentes que quieran incursionar en la programación de flash, no tengan que romperse la cabeza con mounstrosos FrameWork que jamás se llegan a comprender o a utilizar del todo.
Sigo sosteniendo que este mFW esta orientado a personas que no poseen grandes capacidades de programación o bien están inicializando sus pasos en ella, dentro de lo que es ActionScript 2. Una vez finalizado en AS2 migraremos a AS3, reescribiendo el mFW en dicha versión del lenguaje.
Por ultimo, el lema que pretendo implementar en la elaboración de mFW es: A grandes problemas, soluciones simples.
NOTA: Aquellos que este usando la Clase FileLoad, les recomiendo bajar las fuentes de este tutorial y actualizar la clase ya que la modifiqué para adaptarla al mFW, jejeje!
Otra cosa, por el momento seguiré armando los ejemplos (example) de las clases en AS1, pero tengo la intención de que el armado de las estructuras lógicas de las GUI, sean también hecho en clases.
Estructura de la clase:
AsLib
SoundPlayer
SoundDataLayer
Detalles de las clases:
SoundDataLayer: Administra las funcionalidades en la reproducción de archivos de audio, en este caso MP3.
Eventos:
OnChanged(), OnLoad(), OnProgress() Uso de la clase:
La forma de utilizar la clase es muy sencilla:
// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();
// Definimos que hacer con el cambio de track
player.OnChanged = function():Void {
var _data:Object = this.GetDataTrack();
for( var a:String in _data ){
trace( a + ": " + _data[a] );
}
}
// Cargamos nuestra lista
player.load( "playList.xml", "_music/playList/" );
Utilizando algunos métodos y propiedades:
// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();
// Definimos que hacer con el cambio de track
player.OnChanged = function():Void {
var _data:Object = this.GetDataTrack();
for( var a:String in _data ){
trace( a + ": " + _data[a] );
}
}
// coeficiente de volumen
player.coefficientVolume = 2;
// inicio del volumen
player.initialVolume = 70;
// Cargamos nuestra lista
player.load( "playList.xml", "_music/playList/" );
///////////////////////////////////////////////////////////////
// Siguiente Track
player.NextTrack();
// Track Anterior
player.NextTrack();
// Play Track
player.PLayTrack();
// Stop Track
player.StopTrack();
// más volument
player.maxVolume();
// menos volument
player.minVolume();
// etc...
La clase posee dos modos de reproducción por:
STREAMING (default):
// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();
// Cargamos nuestra lista
player.load( "playList.xml", "_music/playList/" );
NO STREAMING:
// Creamos una instancia a la clase
// una de las opciones es setearlo en el constructor
// new SoundDataLayer( false );
var player:SoundDataLayer = new SoundDataLayer();
// o bien como propiedad
player.streming = false;
// medimos el progreso de la carga
player.OnProgress = function( _value:Number ):Void {
trace( "CARGA: " + _value + " %..." )
}
// Cargamos nuestra lista
player.load( "playList.xml", "_music/playList/" );
La clase posee tres eventos:
OnLoad: este se ejecuta una vez finalizada la carga total del archivo.
// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();
// Definimos el evento
player.OnLoad = function():Void {}
OnChanged: este se ejecuta una vez finalizada la reproducción y cambio del track, o bien cuando el cambio es manual.
// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();
// Definimos el evento
player.OnChanged = function():Void {}
OnProgress: este se ejecuta mientras se efectúa la carga, y retorna el progreso de la misma. El valor devuelto es el porcentaje de carga que posee en ese momento el archivo.>
// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();
// Definimos el evento
player.OnProgress = function( _value:Number ):Void {
trace( "CARGA: " + _value + " %..." )
}
NOTA: Si el constructor es creado e inicializado dentro del ámbito de una función, lo que deben utilizar es el método delegate de la clase Utils. Ya que la clase no maneja el dentro de ella el ámbito donde se ejecuta la dicha instancia.
EJ1:
import AsLib.Utils;
var PLAYER:SoundDataLayer;
var ViewTitle:Function = function ():Void {
trace("ON_CHANGED!!!");
}
var init:Function = function ( _playlist:String, _folder:String ):Void {
PLAYER = new SoundDataLayer();
PLAYER.load( _playlist, _folder );
PLAYER.OnChanged = Utils.delegate( this, ViewTitle );
}
EJ2:
var PLAYER:SoundDataLayer = new SoundDataLayer();
PLAYER.load( _playlist, _folder );
PLAYER.OnChanged = function():Void {
trace("ON_CHANGED!!!");
}
SIN MAS?
Espero que les sea de utilidad, y que puedan experimentar en su estructura para modificarla a sus necesidades.