Programador PHP freelance

11 May, 2011

Una galería de fotos enlazada con DropBox

Posted by: admin In: Desarrollo

Buscaba una solución para una galería de fotos, de rápida implantación y que permitiera una gestión intuitiva de las imágenes a los usuarios. Existen en Internet un montón de scripts de galerías realizados en PHP, entre ellos y de los más extendidos, Gallery Son bastante completos, e incluso vienen con pequeños programas cliente que te permiten agilizar la subida de imágenes desde el escritorio, pero siempre lo he visto como un acercamiento a la solución definitiva más que la propia solución.

Por otro lado, integrar un script de este tipo en un proyecto web más completo o complejo que una galería de fotos puede resultar costoso y farragoso. De hecho, muchas veces puede que el script de galería de fotos tenga más peso o entidad que la propia web que estás desarrollando, por lo que su integración no acaba de justificarse.

No puedo dejar de nombrar el caso del trabajo con CMS. En mi caso suelo realizar bastante programación con Drupal. En estos casos existen un sinfín de plugins para implementar una galería de fotos. Dependiendo del caso puede interesar realizar personalizada a partir de CCK i Views o tirar de plugins muy especializados que ya incorporan toda la funcionalidad. Lo último que he probado en este sentido ha sido la utilización del módulo Image FUpload para la subida masiva de ficheros de imágenes y la verdad es que el resultado es tan ágil, intuitivo y amigable que el usuario que debe de gestionar las galerías se adapta rápidamente a su uso.

Volviendo al tema del post, la pura cuestión es que hará un par de semanas que estuve hurgando por Internet cuando me encontré con lo que prometía ser una joya: un script que permitía desplegar una galería de fotos a partir de las imágenes de una carpeta en DropBox: My PHP DropBox Gallery

No tuve tiempo en ese momento para testearlo, pero hoy, con la necesidad de encontrar una solución rápida e intuitiva para la web de un familiar, he encontrado los argumentos perfectos para acostarme un poco más tarde.

La instalación es rapidísima ya que sólo se necesita modificar el fichero de configuración añadiendo el email y la contraseña de la cuenta de DropBox. Aprovecho para comentar que existe otro parámetro (DB_PASSWORD_SALT) en la configuración que debe ser puesto como cadena vacía para que funcione.

Esto y dar permisos para que Apache pueda cachear en el directorio correspondiente y a funcionar. Ya tenemos nuestra galería en pantalla. Por defecto el script coge como raíz las imágenes que encuentre en el directorio Photos que viene creado por defecto con DropBox.

Al pie de la galería podemos encontrarnos con un enlace para acceder a la administración de la galería, a la cual se accede con el mismo email y password de DropBox y desde donde podremos acabar de configurar los parámetros de la misma. Para no extenderme más de lo necesario pongo un listado de las características más significativas:

  • Crea una árbol de álbumes con la estructura de directorios que encuentra en DropBox.
  • Permite configurar cual es el directorio raíz a partir del cual se genera la galería de fotos
  • Las fotos se visualizan con un efecto Lightbox con presentación (slideshow) incluido.
  • Permite configurar la caché de todos los tamaños de imágenes generados por la galería.
  • Incluye varios themes, incluido uno para Iphone.
  • Incluye también varios efectos de presentación de los álbumes.
  • Tiene una estética muy actual.

Bueno, lo recomiendo y estoy seguro que dará que hablar una vez se extienda.

Os dejo una captura de la implantación de pruebas que he hecho.

Galeria My PHP DropBox Gallery

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Habitualmente, en un servidor Linux, encontramos los logs del servidor de mail bajo /var/log/mail o /var/log/maillog .

En el caso de Plesk, el cual suele utilizar Qmail, los logs se encuentran bajo /usr/local/psa/var/log/maillogm .

Es una información breve pero que os puede evitar perder tiempo ;-)

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Estoy en pleno desarrollo de una tienda virtual con Prestashop para un cliente del sector de la ferretería. El cliente tiene su aplicación de gestión de productos en el servidor de la empresa y la base de datos de estos debe de ser sincronizada con el e-commerce de forma automática de modo que cualquier modificación en la misma se vea actualizada en la base de datos del Prestashop.

Inicialmente había pensado en la posibilidad de hacer un script que sincronizara las dos bases de datos conectando directamente con ellas pero visto que el Prestashop dispone de un módulo de importación a partir de ficheros CSV, he decidido utilizarlo.

En esta arquitectura existen dos partes, la parte del cliente situada en el servidor local de la empresa y la parte de la tienda virtual situada en un alojamiento web, que entre otras cosas requiere dar de alta reglas en el firewall para permitir conectar al Mysql desde una IP externa, cosa que finalmente no necesitaremos.

En la parte del cliente programaré un script que exporte en el formato CSV, esperado por Prestashop, tanto las categorías como los productos -en este caso lo único que necesito exportar- y que suba ambos ficheros al servidor donde está ubicada la tienda.

En la parte de la tienda virtual se requiere un script que sea capaz de lanzar el proceso de importación y es el que describiré a continuación.

Existía la posibilidad, en esta segunda parte, de simular la navegación utilizando CURL, haciendo el login y posterior proceso de importación, pero complica mucho más las cosas cuando lo que necesitamos es simplemente llamar a la clase AdminImport y utilizar su funcionalidad.

Aquí dejo el código del script que, situado en la parte de la tienda, lanza una importación de un fichero CSV productos (pro.csv) o categorías (cat.csv), según se le indique por GET['entity']

Los ficheros CSV a importar deben encontrarse en el directorio /admin/import mientras que nuestro script debe de estar situado en el directorio /admin del Prestashop.

Espero que le pueda (re)servir a alguien.

<?php 
 
define('PS_ADMIN_DIR', getcwd()); 
include(PS_ADMIN_DIR.'/../config/config.inc.php'); 
include(PS_ADMIN_DIR.'/functions.php'); 
include_once './tabs/AdminImport.php'; 
 
if (!isset($_GET['entity'])) die(); 
 
$import = New AdminImport(); 
switch ($_GET['entity']) { 
case 0: 
    loadCategoriesPost(); 
    $import->categoryImport(); 
    break;
 
  case 1:
    loadProductsPost();
    $import->productImport();
    break;
 
  default:
    die();
    break;
}
 
function loadCategoriesPost() {
  $_POST = array (
    'tab' => 'AdminImport',
    'skip' => '0',
    'csv' => 'cat.csv',
    'convert' => '',
    'entity' => '0',
    'separator' => ';',
    'multiple_value_separator' => ',',
    'import' => 'Importar datos CSV',
    'type_value' =>
    array (
      0 => 'id',
      1 => 'active',
      2 => 'name',
      3 => 'parent',
      4 => 'description',
      5 => 'meta_title',
      6 => 'meta_keywords',
      7 => 'meta_description',
      8 => 'link_rewrite',
      9 => 'image',
    ),
  );
}
 
function loadProductsPost() {
  $_POST = array (
    'tab' => 'AdminImport',
    'skip' => '0',
    'csv' => 'pro.csv',
    'convert' => '',
    'entity' => '1',
    'separator' => ';',
    'multiple_value_separator' => ',',
    'import' => 'Importar datos CSV',
    'type_value' =>
    array (
      0 => 'id',
      1 => 'active',
      2 => 'name',
      3 => 'category',
      4 => 'price_tex',
      5 => 'tax_rate',
      6 => 'wholesale_price',
      7 => 'on_sale',
      8 => 'reduction_price',
      9 => 'reduction_percent',
      10 => 'reduction_from',
      11 => 'reduction_to',
      12 => 'reference',
      13 => 'supplier_reference',
      14 => 'supplier',
      15 => 'manufacturer',
      16 => 'ean13',
      17 => 'ecotax',
      18 => 'weight',
      19 => 'quantity',
      20 => 'description_short',
      21 => 'description',
      22 => 'tags',
      23 => 'meta_title',
      24 => 'meta_keywords',
      25 => 'meta_description',
      26 => 'available_now',
      27 => 'available_later',
      28 => 'image',
      29 => 'no',
    ),
  );
}
?>
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Hoy ha sido un día normal. Lo suficientemente duro como para que no haya tenido tiempo de averiguar que se movía por la red.

Al margen de esa inopia, en una mis breves incursiones por Twitter he detectado movimientos interesantes entre la comunidad. En concreto se ha promovido un manifiesto que, como bien dice @suenosdelarazon en su blog, atiende al más puro sentido común. La industria de la ‘cultura’ saca sus garras, el gobierno mueve ficha y ahora la comunidad, de forma espontánea e improvisada, se pone las pilas y decide forjar un arma a modo de manifiesto que contrarreste tanta sinrazón.

Y como no, me veo moralmente obligado a secundarlo y espero además que sirva para hacer despertar del letargo este blog, dicho sea de paso ;-)

Ahí va el manifiesto… y si lo consideráis oportuno re-publícadlo donde queráis.

Ante la inclusión en el Anteproyecto de Ley de Economía Sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que…

  1. Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.
  2. La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.
  3. La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.
  4. La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.
  5. Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.
  6. Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.
  7. Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.
  8. Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.
  9. Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.
  10. En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

18 Feb, 2009

Revivir el 23-F. Una experiencia Twitter

Posted by: admin In: Desarrollo

Unos amigos y yo hemos decidido experimentar sobre las posibilidades de Twitter para ver hasta donde llega y hemos creado un experimento basado en el inminente 23-F.

Aquí tenéis el enlace para engancharse al evento.

Sigue el 23-F minuto a minuto en Twitter

La idea es retransmitir por Twitter el próximo 23-F como si aún estuviéramos en 1981. De hecho, como si en 1981 hubiéramos tenido Twitter. Minuto a minuto. Dando todos los detalles de lo que ocurrió justo en el mismo momento del día en que ocurrió y crear así una experiencia colectiva. Nuestra intención no es para nada abrir debate político sino que la experiencia sirva como plataforma para compartir un momento pasado colectivo a partir de vivencias individuales. Particularmente solo recuerdo que mi madre tenia miedo y que yo no entendía pq no iba al colegio. Cada cual tendrá sus recuerdos y todos pueden ser puestos en común utilizando Twitter.

Creemos que puede ser algo interesante y solo lamentamos no haber tenido más tiempo para su desarrollo (tuvimos la idea este domingo y disponemos de poco tiempo libre)

Cualquier consejo, apoyo o movimiento a favor será recompensado con gratitud, que para la gente de bien, es el mejor de los premios. [ No descartamos invitar a un café a los colaboradores ;-) ]

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

26 Dec, 2008

Un nuevo año que entra

Posted by: admin In: Desarrollo

Ya se acaba este año y ha sido muy divertido y gratificante. Otro año más he tenido la oportunidad de crecer profesional y personalmente.

Hemos tenido de todo. Proyectos complejos, proyectos graciosos, proyectos apasionantes, etc… pero la nota común siempre ha sido el sentimiento de emoción en cada uno de ellos.

Solo por esto ya ha valido la pena pasar este año… y como nada me dice que el año que viene va a ser diferente…

felicitacion 2009

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

08 Oct, 2008

Longitud máxima del title, description y keywords

Posted by: admin In: SEO

El tema ha ido evolucionando bastante y cada vez los crawlers se ponen más duros y restrictivos con sus requisitos. Por eso posteo aquí cuales son las longitudes máximas recomendables para caerles bien a nuestros amigos los buscadores y conseguir mejor posicionamiento.

La longitud máxima del title no debería ser superior a 80 carácteres.

Por otro lado, la longitud máxima del description no debería ser superior a 250 carácteres.

Y para terminar, la longitud máxima de keywords debería de ser de 25 palabras o 500 carácteres.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]
Tags: , ,

Me he visto en la tesitura de intentar cambiar en dinámico el tipo de un input de tipo text a tipo password y viceversa.

Algo tan sencillo como hacer lo siguiente:

obj = document. getElementById('campo_password');
obj.type = 'text';

Todo funciona perfectamente con Firefox pero cuando lo he probado con Internet Explorer 7 el navegador me devuelve un error con el objeto y no hay manera.

He probado a realizar el cambio desde jquery para que el framework se encargara de realizar la modificación pero tampoco ha funcionado. Internet Explorer devuelve el mismo error. Grrrrrrrrrrr

Al final he encontrado este código por Internet que soluciona el problema. Hace más cosas pero seguro que un programador espabilado sabrá aislar la funcionalidad que necesite ;-)

Llamandolo así convertireís el campo a tipo text donde thisInput es el objeto input

changeInputType(thisInput,'text',txtLabel,false,true);
function changeInputType(
  oldElm, // a reference to the input element
  iType, // value of the type property: 'text' or 'password'
  iValue, // the default value, set to 'password' in the demo
  blankValue, // true if the value should be empty, false otherwise
  noFocus) {  // set to true if the element should not be given focus
 
  if(!oldElm || !oldElm.parentNode || (iType.length<4) || 
    !document.getElementById || !document.createElement) return;
  var newElm = document.createElement('input');
  newElm.type = iType;
  if(oldElm.name) newElm.name = oldElm.name;
  if(oldElm.id) newElm.id = oldElm.id;
  if(oldElm.className) newElm.className = oldElm.className;
  if(oldElm.size) newElm.size = oldElm.size;
  if(oldElm.tabIndex) newElm.tabIndex = oldElm.tabIndex;
  if(oldElm.accessKey) newElm.accessKey = oldElm.accessKey;
  newElm.onfocus = function(){return function(){
    if(this.hasFocus) return;
    var newElm = changeInputType(this,'password',iValue,
      (this.value.toLowerCase()==iValue.toLowerCase())?true:false);
    if(newElm) newElm.hasFocus=true;
  }}();
  newElm.onblur = function(){return function(){
    if(this.hasFocus)
    if(this.value=='' || (this.value.toLowerCase()==iValue.toLowerCase())) {
      changeInputType(this,'text',iValue,false,true);
    }
  }}();
 // hasFocus is to prevent a loop where onfocus is triggered over and over again
  newElm.hasFocus=false;
  oldElm.parentNode.replaceChild(newElm,oldElm);
  if(!blankValue) newElm.value = iValue;
  if(!noFocus || typeof(noFocus)=='undefined') {
    window.tempElm = newElm;
    setTimeout("tempElm.hasFocus=true;tempElm.focus();",1);
  }
  return newElm;
}
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

04 Oct, 2008

Configurar el servidor MySQL con UTF8

Posted by: admin In: Desarrollo| Sistemas

Siguiendo con los bricoconsejos para trabajar con MySQL y UTF8, dejo aquí los parámetros que hay que modificar en el fichero de configuración my.cnf para que todo se ejecute por defecto en UTF8.

[mysqld]
character-set-filesystem=UTF8
character-set-server=UTF8
default-collation=UTF8_general_ci
default-character-set=UTF8

[client]
default-character-set=UTF8

[mysqldump]
default-character-set=UTF8
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]
Tags: ,

04 Oct, 2008

Pasar parámetros por defecto en Javascript

Posted by: admin In: Desarrollo

Es una lástima pero Javascript, al contrario que otros lenguajes, no permite pasar parámetros por defecto en sus funciones.

Esto tiene solución mediante un pequeño truco en el código.

Imaginad que tenemos esto:

1
2
3
4
function test(arg) {
  arg = arg || 23;
  return arg;
}

Si llamamos a test() sin parametro nos va a devolver 23. Problema resuelto de forma sencilla ;-)

Pero seamos más puristas.

Si por ejemplo la llamamos pasándole el valor NULL nos vamos a encontrar con que también nos devolverá 23 y en algunos casos nos puede interesar manejar el valor NULL de forma diferente

Si quisieramos corregirlo tendríamos que utilizar esto:

function test(arg) {
  arg = (typeof arg == ‘undefined’) ? 23 : arg;
  return arg;
}

Con esta opción si llamamos a test() sin parámetro nos devuelve 23 pero si llamamos a test(null) nos devolvería null con lo que podriamos manejar el caso de forma diferente.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

About

ProgramadorPHP.es es el blog profesional de Vicent González i Castells, programador freelance especializado en desarrollo de aplicaciones web. vigoncas@programadorphp.es

CURRÍCULUM

Tags