Archivo de la etiqueta: 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.

Instalar facilmente servidor LAMP en Ubuntu y derivados.

Hola a todos:

Hoy vamos a ver como crear nuestro entorno de desarrollo LAMP fácilmente en nuestro PC.

LAMP viene de linux, apache , mysql y php, y es exactamente todo lo que necesitamos para desarrollar web utilizando php con el servidor apache, es lo que necesitamos por ejemplo si vamos a desarrollar bajo wordpress.

Estos pasos que os voy a mostrar a continuación han sido probado en un viejo portatil con Lubuntu 13.10 instalado, en principio debería funcionar con cualquier derivado de Ubuntu.

El primer requisito lógicamente es tener instalada nuestra distribución de Linux.

Después abrimos el terminal y escribimos lo siguiente para actualizar los repositorios:

sudo apt-get update

Acto seguido instalamos el lamp-server:

sudo apt-get install lamp-server^

Ahora añadimos algunos extras que nos pueden ser útiles como php5-gd para el tratamiento de imágenes y php5-curl:

sudo apt-get install php5-gd php5-curl

Activamos el mod_rewrite que es un modulo de Apache que nos permite modificar la forma en que se muestran las direcciones en la barra de direcciones:

sudo a2enmod rewrite

Por ultimo vamos a instalar phpmyadmin para gestionar nuestra base de datos mysql:

sudo apt-get install phpmyadmin -y 

Al instalar nos preguntará para que servidor web configurar, elegimos apache2 y le damos a continuar.

Después nos preguntará si queremos configurar la base de datos con dbconfig-common, le decimos que no y terminará la instalación.

Para finalizar debemos crear un enlace simbólico desde /usr/share/phpmyadmin hacia la carpeta donde guardamos nuestros archivos web.

En versiones de apache anteriores a 2.4.7 el directorio raiz para guardar los archivos web era /var/www por lo cual crearemos el enlace simbólico de la siguiente manera:

 sudo ln -s /usr/share/phpmyadmin /var/www/

Sin embargo de la versión 2.4.7 en adelante el directorio raiz es /var/www/html/ así que en versiones actuales tenemos  que crear el siguiente enlace simbólico

sudo ln -s /usr/share/phpmyadmin /var/www/html/

De esta manera siescribimos http://localhost/phpmyadmin en la barra del navegador nos abrirá el gestor de mysql phpmyadmin.

Para saber que versión de apache tenemos instalada desde consola escribimos:

 apache2ctl -v

Para finalizar solo comentaros que si necesitáis además mandar emails desde php aquí os explico Como instalar y configurar un servidor de correo SMTP para enviar emails desde localhost con php.

Espero que os sirva de ayuda.

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.

Como instalar y configurar un servidor de correo SMTP para enviar emails desde localhost con php. (Linux)

 

Hola a todos.

Si estas programando en tu entorno local “localhost” y quieres  mandar mails desde php necesitas tener instalado un servidor de correo  SMTP .

En entornos linux uno de los mas utilizado es  Postfix. Sin embargo si lo que queremos es simplemente poder enviar email desde nuestro entorno de puebas podemos optar por opciones mas livianas y simples.

Una opción ligera es instalar el paquete ssmtp.

En mi caso estoy trabajando desde un viejo portatil con lubuntu instalado, para otras distribuciones no derivadas de ubuntu el proceso de instalación puede ser diferente.

Para instalar el paquete  ssmtp abrimos un terminal y escribimos:

sudo apt-get install ssmtp

Ahora debemos editar el archivo ssmtp.conf:

sudo nano /etc/ssmtp/ssmtp.conf

Descomentamos o añadimos si no existen las siguientes lineas:

mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
AuthUser=<YOUR-EMAIL>@gmail.com
AuthPass=<YOUR-PASSWORD>

Debemos sustituir lo que se encuentra entre “<” y “>”  por nuestros valores.

En este caso vamos a utilizar nuestra cuenta de gmail para enviar el correo así que en AuthUser pondremos nuestra dirección de mail de gmail y enAuthPass la contraseña que utilizamos para acceder a nuestra cuenta de gmail.

Si lo dejamos así en el from del los mails delante de la dirección de correo desde donde se envía aparecerá “www-data”, para poder cambiar el from desde php tenemos que añadir tambien la siguiente linea en  ssmtp.conf:

FromLineOverride=YES

Ahora guardamos el archivo (Ctrl+O si lo editas con nano) y salimos (Ctrl+X).

Ahora tenemos que editar el archivo php.ini para asignar la variable sendmail_path:

sudo nano /etc/php5/apache2/php.ini

Buscamos la linea sendmail_path (Ctrl + W para buscar desde nano).

y la dejamos de la siguiente manera:

sendmail_path = /usr/sbin/ssmtp -t

Guardamos (Ctrl + O) y salimos (Ctrl + X).

Reiniciamos el servidor apache:

sudo /etc/init.d/apache2 restart

Y ya podemos enviar mails desde php utilizando la función mail() o wp_mail() si estais usando wordpress.

¿Necesitas un presupuesto para un desarrollo WordPress a medida?

¿Quieres un plugin a medida que realice una funcionalidad concreta que necesitas para tu WordPress?

Solicita un presupuesto sin compromiso:

WordPress – Acceder al idioma seleccionado y los idiomas activos de qTranslate desde javascript.

Hola a todos:

Hoy toca hablar de WordPress y de ese maravilloso plugin que nos permite utilizar varios idiomas en los sitios creados con WordPress llamado qTranslate.

A veces podemos necesitar saber cual es el idioma que está seleccionado para realizar una acción determinada en función a esté.

Para obtener el código iso del idioma actual escribimos esto:

<?php
    $global $q_config;
    $iso = qtrans_getLanguage();

    echo 'El idioma actual es: '.$iso;
?>

Por ejemplo si el idioma actual es el español  obtendríamos esto:

El idioma actual es:  es

Si queremos obtener el nombre del idioma en lugar de su iso escribimos esto:

<?php
    $global $q_config;
    $iso = qtrans_getLanguage(); // obtenemos el código iso.
    $idioma =  qtrans_getLanguageName($iso); // Obtenemos el idioma.
    echo 'El idioma actual es: '.$idioma;
?>

Y obtendríamos como resultado algo como esto:

El idioma actual es: Español

Y si queremos saber todos los idiomas activos podemos obtenerlos de esta manera:

<?php

global $q_config;
$activos = $q_config['enabled_languages'];
foreach ($activos as $l)
{
    echo  qtrans_getLanguageName($l).'<br />';
}

?>

Hasta aquí puede que le haya servido de ayuda a alguien pero en el titulo del post ponía ‘desde javascript’, no se me ha olvidado :-).

Puede que escribiendo tu propio plugin, o modificando el tema para darle alguna funcionalidad extra necesites acceder a las variables anteriores pero desde javascript (a mi me ha pasado por eso os cuento todo esto).

Podríamos crear variables globales escritas con php tipo algo así:

<?php  echo  "Idioma =".qtrans_getLanguage()."" ?>

Pero es un método  feo, poco elegante y una mala práctica.

Bien, imaginemos que estamos escribiendo un plugin, lo primero que tendríamos que hacer es añadir el archivo .js donde estarán nuestras funciones javascript.

para ello utilizamos la función de wordpress wp_enqueue_script.

wp_enqueue_script( 'mi_script',plugins_url( '/js/mi_script.js', __FILE__ ));

El primer parámetro es el nombre que le damos para identificar al script,  puede ser el que queramos.

El segundo parámetro es la url donde se encuentra el archivo, en esta ocasión se encuentra en la carpeta de nuestro plugin en una subcarpeta llamada js.

Para obtener la ruta de nuestro plugin utilizamos la función plugins_url();

Y ahora llega el momento mágico, para hacer que las variables php sean accesibles desde nuestro javascript escribimos lo siguiente:

// Obtenemos los idiomas y los pasamos a una variable javascript
global $q_config;
$arrLang = array();
$languages_iso = $q_config['enabled_languages'];
foreach ($languages_iso as $l)
{
  $arrLang[$l] = qtrans_getLanguageName($l);
}

wp_localize_script( 'mi_script', 'lang',array('languages' => $arrLang, 'iso' => qtrans_getLanguage()));

La función  wp_localize_script nos permitirá  acceder desde nuestro javascript a las variables que le pasemos siempre que antes hayamos definido nuestro script con wp_enqueue_script.

El primer parametro de wp_localize_script() debe ser el nombre que le hayamos dado a nuestro script al añadirlo con wp_enqueue_script.

El segundo parámetro es el nombre del objeto desde el cual accederemos desde javascript a los datos, y el tercero es un array que contiene las variables que despues utilizaremos desde javascript.

Ya solo nos queda la parte javascript.

En nuestro archivo mi_script.js cremos por ejemplo pla siguiente función:

function dime_el_idioma(){
    alert(lang.languages[lang.iso]);
}

Llamamos a esta función desde el html por ejemplo con un botón:

<input type="button" onclick="dime_el_idioma()" value="Idioma" />

Si probamos todo esto veremos que al pulsar el botón nos mostrará un alert con el nombre del idioma activo que ahora lo tenemos accesible desde javascript.

Y… eso es todo…

Espero que a alguien le sirva de ayuda.

¿Necesitas un presupuesto para un desarrollo WordPress a medida?

¿Quieres un plugin a medida que realice una funcionalidad concreta que necesitas para tu WordPress?

Solicita un presupuesto sin compromiso: