Archivo de la categoría: php

Como crear un archivo Zip y forzar su descarga en PHP

Hola a todos:

Hoy vamos a ver c√≥mo podemos generar una archivo zip, a√Īadirle los archivos que queramos y forzar su descarga con¬†php.

Desde la versión 5.2.0 de PHP está disponible la clase  ZipArchive.

Para ilustrar su funcionamiento como siempre lo mejor es crear un peque√Īo ejemplo.

Vamos a crear un peque√Īo script que¬†genere un archivo zip con dos archivos de imagen png, aunque se puede hacer con cualquier tipo de archivo. Una imagen se crear√° en la raiz de la carpeta comprimida y la otra en un directorio que crearemos dentro de esta carpeta.

Vayamos por partes:

Primero creamos la carpeta donde alojaremos ¬†este peque√Īo ejemplo, por ejemplo podemos llamar prueba_zip a la carpeta.

Para este ejemplo vamos a descargar de internet (o copiar desde cualquier sitio) dos archivos, por ejemplo dos imagenes.

Copiamos los dos archivos en la carpeta prueba_zip, imaginemos que se llaman imagen1.png e imagen2.png.

Ahora debemos crear un archivo php que va a contener el código de ejemplo para crear un archivo.zip.

Vamos a llamarle index.php.

Editamos el archivo que acabamos de crear y copiamos en el el siguiente código:

<?php
// Creamos un instancia de la clase ZipArchive
 $zip = new ZipArchive();
// Creamos y abrimos un archivo zip temporal
 $zip->open("miarchivo.zip",ZipArchive::CREATE);
 // A√Īadimos un directorio
 $dir = 'miDirectorio';
 $zip->addEmptyDir($dir);
 // A√Īadimos un archivo en la raid del zip.
 $zip->addFile("imagen1.jpg","mi_imagen1.jpg");
 //A√Īadimos un archivo dentro del directorio que hemos creado
 $zip->addFile("imagen2.jpg",$dir."/mi_imagen2.jpg");
 // Una vez a√Īadido los archivos deseados cerramos el zip.
 $zip->close();
 // Creamos las cabezeras que forzaran la descarga del archivo como archivo zip.
 header("Content-type: application/octet-stream");
 header("Content-disposition: attachment; filename=miarchivo.zip");
 // leemos el archivo creado
 readfile('miarchivo.zip');
 // Por √ļltimo eliminamos el archivo temporal creado
 unlink('miarchivo.zip');//Destruye el archivo temporal
?>

Aunque en los comentarios del propio código se explican los pasos vamos a verlos más detenidamente:

Primero creamos una instancia de la clase ZipArchive:

$zip = new ZipArchive();

Después creamos un archivo zip temporal que llamamos miarchivo.zip y que eliminaremos después de descargarlo.

$zip->open("miarchivo.zip",ZipArchive::CREATE);

Para indicarle que tiene que crearlo ya que no existe utilizamos el valor ZipArchive::CREATE.

Conviene recordar que tenemos que tener permisos de escritura en la carpeta para poder crear el archivo.

En este ejemplo vamos a crear dentro del archivo comprimido una carpeta a la que hemos llamado miDirectorio.

$zip->addEmptyDir('miDirectorio');

Como podemos observar con el método addEmptyDir creamos un directorio vacío dentro del archivo zip que acabamos de crear.

Despu√©s a√Īadimos el archivo imagen1.jpg que hemos copiado en nuestra carpeta. Para ello utilizamos el m√©todo addFile.

El m√©todo addFile recibe como primer par√°metro¬†la ruta donde se encuentra el archivo que vamos a a√Īadir, en este caso como se encuentra en la misma carpeta solo es necesario especificar el nombre del archivo.
El segundo parámetro es opcional y es la ruta final dentro del archivo zip y el nombre final que tendrá el archivo al comprimirlo, si no se especifica se creará en la raíz del archivo zip con el mismo nombre.

En este caso lo colocamos en la raíz del archivo zip por lo que solo especificamos su nombre final que en este caos es mi_imagen1.jpg.

$zip->addFile("imagen1.jpg","mi_imagen1.jpg");

Ahora vamos a√Īadimos otro archivo, pero esta vez en lugar de crearlo en la ra√≠z del zip le decimos que lo a√Īada a la carpeta miDirectorio¬†que hemos creado anteriormente:

 $zip->addFile("imagen2.jpg",$dir."/mi_imagen2.jpg");

Ahora solo nos queda cerrar el archivo zip que hemos creado:

 $zip->close();

Y forzar su descarga:

 header("Content-type: application/octet-stream");
 header("Content-disposition: attachment; filename=miarchivo.zip");
 // leemos el archivo creado
 readfile('comprimido.zip');

Para forzar su descarga creamos las cabeceras necesarias indicando que es un archivo de tipo zip y especificando su nombre, en este caso le hemos llamado miarchivo.zip, pero podéis poner el nombre que queráis.

Como √ļltimo paso eliminamos el archivo zip temporal que hemos creado:

unlink('miarchivo.zip');//Destruye el archivo temporal

Y esto es todo.

Espero que os sirva de ayuda.

Ordenar un array asociativo o de objetos por un campo en php

 

Hola a todos:

Hoy  os traigo una función en php que puede ser de gran utilidad a la hora de ordenar un array asociativo o un array con objetos.

Por ejemplo vamos a imaginar que tenemos un array de usuarios donde tenemos un campo con el id de usuario, otro con el nombre y otro que contiene la profesión del usuario.

Por ejemplo vamos a crear un   array con este formato:

$arrUsuarios=array
(
 array (
     "id" => 1,
     "nombre" => "Eduardo",
     "profesion" => "Programador"
 ),
 array (
     "id" => 2,
     "nombre" => "Manuel",
     "profesion" => "Dentista"
 ),
 array (
     "id" => 3,
     "nombre" => "Fernando",
     "profesion" => "Fontanero"
 ),
 array (
    "id" => 4,
    "nombre" => "Antonio",
    "profesion" => "Abogado"
 ),
 array (
    "id" => 5,
    "nombre" => "Pascual",
    "profesion" => "Frutero"
 ),
);

Si mostranos el contenido del array  con <?php print_r($arrUsuarios) ?> obtendremos algo parecido a esto:

Array
(
    [0] => Array
        (
            [id] => 1
            [nombre] => Eduardo
            [profesion] => Programador
        )

    [1] => Array
        (
            [id] => 2
            [nombre] => Manuel
            [profesion] => Dentista
        )

    [2] => Array
        (
            [id] => 3
            [nombre] => Fernando
            [profesion] => Fontanero
        )

    [3] => Array
        (
            [id] => 4
            [nombre] => Antonio
            [profesion] => Abogado
        )

    [4] => Array
        (
            [id] => 5
            [nombre] => Pascual
            [profesion] => Frutero
        )

)

Ahora vamos a imaginar que nos interesa ordenar este array por el nombre del usuario en orden alfabético.

Para conseguir esto vamos a crear una peque√Īa funci√≥n que nos ayudar√° a conseguir este prop√≥sito:

function array_sort_by(&$arrIni, $col, $order = SORT_ASC)
{
    $arrAux = array();
    foreach ($arrIni as $key=> $row)
    {
        $arrAux[$key] = is_object($row) ? $arrAux[$key] = $row->$col : $row[$col];
        $arrAux[$key] = strtolower($arrAux[$key]);
    }
    array_multisort($arrAux, $order, $arrIni);
}

El primer par√°metro el es el array que queremos ordenar.

El segundo par√°metro es el campo por el cual queremos ordenar el array.

El tercer par√°metro es opcional e indica si se ordenara en orden ascendente o descendente, por defecto ascendente.

Ahora vamos a aplicar esta función a nuestro array y mostrar el resultado.

<?php
array_sort_by($arrUsuarios, 'nombre', $order = SORT_ASC);
?>
<pre><?php print_r($arrUsuarios); ?></pre>

Como podemos observar ahora obtenemos el array ordenado alfabéticamente por el nombre del usuario:

Array
(
    [0] => Array
        (
            [id] => 4
            [nombre] => Antonio
            [profesion] => Abogado
        )

    [1] => Array
        (
            [id] => 1
            [nombre] => Eduardo
            [profesion] => Programador
        )

    [2] => Array
        (
            [id] => 3
            [nombre] => Fernando
            [profesion] => Fontanero
        )

    [3] => Array
        (
            [id] => 2
            [nombre] => Manuel
            [profesion] => Dentista
        )

    [4] => Array
        (
            [id] => 5
            [nombre] => Pascual
            [profesion] => Frutero
        )

)

Esta función en válida también para ordenar array de objetos extraidos por ejemplo de la base de datos.

Espero que os sea √ļtil. ūüôā

Sumar o restar d√≠as, semanas, meses o a√Īos a una fecha con PHP

Hola a todos:

Hoy os traigo una funci√≥n que aunque sencilla puede ser muy √ļtil cuando trabajamos con fechas en PHP.

En ocasiones necesitamos sumar o restar días a la fecha actual o a una fecha dada.

Vamos a crear una peque√Īa funci√≥n que nos permite sumar o restar d√≠as, semanas, meses o a√Īos a una fecha:

<?php
function sumaFechas ($suma,$fechaInicial = false)
{
  $fecha = !empty($fechaInicial) ? $fechaInicial : date('Y-m-d');
  $nuevaFecha = strtotime ($suma , strtotime ( $fecha ) ) ;
  $nuevaFecha = date ( 'Y-m-d' , $nuevaFecha );
  return $nuevaFecha;
}
?>

La funci√≥n recibe dos par√°metros, el primero es la cantidad de d√≠as, semanas, meses o a√Īos que vamos a sumar o restar y el segundo es la fecha a la que se los vamos a sumar.

Si no se pasa el parámetro fechaInicial la función tomará la fecha actual.

Para sumar 3 días al 15 de junio del 2014 llamamos a la función de esta manera:

echo sumaFechas('3 day', '2014-06-15');

Para sumar 3 semanas:

echo sumaFechas('3 week', '2014-06-15');

Recordad que tambi√©n podemos restar poniendo el n√ļmero en negativo:

echo sumaFechas('-4 month', '2014-06-15');

Veamos un ejemplo completo con varias posibilidades que podéis probar y que cubren todas las posibilidades que podéis necesitar:

<?php
function sumaFechas ($suma,$fechaInicial = false)
{
  $fecha = !empty($fechaInicial) ? $fechaInicial : date('Y-m-d');
  $nuevaFecha = strtotime ($suma , strtotime ( $fecha ) ) ;
  $nuevaFecha = date ( 'Y-m-d' , $nuevaFecha );
  return $nuevaFecha;
}
// Suma 5 días a la fecha 2014-06-15
echo sumaFechas('5 day', '2014-06-15').'<br/>';
// Suma 5 días a la fecha actual
echo sumaFechas('5 day').'<br/>';
// Resta una semana a la fecha '2014-06-15'
echo sumaFechas('-1 week', '2014-06-15').'<br/>';
// Suma 3 semanas a la fecha '2014-06-15'
echo sumaFechas('3 week', '2014-06-15').'<br/>';
// Suma 4 meses a la fecha '2014-06-15'
echo sumaFechas('4 month', '2014-06-15').'<br/>';
// Suma 2 a√Īos a la fecha '2014-06-15'
echo sumaFechas('2 year', '2014-06-15').'<br/>';
?>

Y eso es todo por hoy, espero que os sirva de ayuda. ¬†ūüėČ

No dudéis en dejar en los comentario cualquier duda que os surja.

Insertar un bot√≥n en tu web para a√Īadir un evento a Google Calendar.

 

Hola a todos:

Si mostramos eventos en una p√°gina web puede ser interesante a√Īadir un bot√≥n para que el visitante pueda pinchando en el a√Īadir el evento a su calendario en google calendar.

He creado una función en php que nos permite de forma sencilla crear la url necesaria para crear el enlace que nos cree el evento en google calendar:

<?php
/********************************************************************
* Función getGCalendar (Eduardo Revilla Vaquero)                    *
* Genera url para la creación de un evento en google calendar.      *
*********************************************************************/

function getGCalendarUrl($event){ $titulo = urlencode($event['titulo']); $descripcion = urlencode($event['descripcion']); $localizacion = urlencode($event['localizacion']); $start=new DateTime($event['fecha_inicio'].' '.$event['hora_inicio'].' '.date_default_timezone_get()); $end=new DateTime($event['fecha_fin'].' '.$event['hora_fin'].' '.date_default_timezone_get()); $dates = urlencode($start->format("Ymd\THis")) . "/" . urlencode($end->format("Ymd\THis")); $name = urlencode($event['nombre']); $url = urlencode($event['url']); $gCalUrl = "http://www.google.com/calendar/event?action=TEMPLATE&amp;text=$titulo&amp;dates=$dates&amp;details=$descripcion&amp;location=$localizacion&amp;trp=false&amp;sprop=$url&amp;sprop=name:$name"; return ($gCalUrl); }

 

La función recibe como parámetro un array asociativo con los campos necesarios para crear el evento.

Un ejemplo del array sería este:

$evento = array(
 'titulo' => 'Mi evento de prueba',
 'descripcion' => 'Descripcion del evento de prueba',
 'localizacion' => 'Aqui ponemos la dirección donde se celebra el evento',
 'fecha_inicio' => '2014-04-10', // Fecha de inicio de evento en formato AAAA-MM-DD
 'hora_inicio'=>'17:30', // Hora Inicio del evento
 'fecha_fin'=>'2014-04-12', // Fecha de fin de evento en formato AAAA-MM-DD
 'hora_fin'=>'19:00', // Hora final del evento
 'nombre'=>'ReviBlog', // Nombre del sitio
 'url'=>'www.reviblog.net' // Url de la p√°gina
);

Ahora solo nos queda crear el link en html asignandole la url devuelta por la función getGCalendarUrl:

<a href="<?php echo getGCalendarUrl($evento); ?>"><img src="http://www.google.com/calendar/images/ext/gc_button6_es.gif" border="0"></a>

Para probarlo puedes crear un archivo php y pegar el siguiente código donde todo junto quedaria así:

<?php
/********************************************************************
* Función getGCalendar (Eduardo Revilla Vaquero)                    *
* Genera url para la creación de un evento en google calendar.      *
*********************************************************************/function getGCalendarUrl($event){
$titulo = urlencode($event['titulo']);
$descripcion = urlencode($event['descripcion']);
$localizacion = urlencode($event['localizacion']);
$start=new DateTime($event['fecha_inicio'].' '.$event['hora_inicio'].' '.date_default_timezone_get());
$end=new DateTime($event['fecha_fin'].' '.$event['hora_fin'].' '.date_default_timezone_get()); $dates = urlencode($start->format("Ymd\THis")) . "/" . urlencode($end->format("Ymd\THis"));
$name = urlencode($event['nombre']);
$url = urlencode($event['url']);
$gCalUrl = "http://www.google.com/calendar/event?action=TEMPLATE&amp;text=$titulo&amp;dates=$dates&amp;details=$descripcion&amp;location=$localizacion&amp;trp=false&amp;sprop=$url&amp;sprop=name:$name";
return ($gCalUrl);
}
// array asociativo con los parametros mecesarios.
$evento = array(
  'titulo' => 'Mi evento de prueba',
  'descripcion' => 'Descripcion del evento de prueba',
  'localizacion' => 'Aqui ponemos la dirección donde se celebra el evento',
  'fecha_inicio' => '2014-04-10', // Fecha de inicio de evento en formato AAAA-MM-DD
'hora_inicio'=>'17:30', // Hora Inicio del evento
'fecha_fin'=>'2014-04-12', // Fecha de fin de evento en formato AAAA-MM-DD
'hora_fin'=>'19:00', // Hora final del evento
'nombre'=>'ReviBlog', // Nombre del sitio
'url'=>'www.reviblog.net' // Url de la p√°gina
);
?>
<a href="<?php echo getGCalendarUrl($evento); ?>"><img src="http://www.google.com/calendar/images/ext/gc_button6_es.gif" border="0"></a>

Este código nos generará un botón como este:

 

Espero que sea de utilidad.