Correos transaccionales para diferentes idiomas en Magento 1.5.0.1

carlosgarciafaria at gmail punto com

Correos transaccionales para diferentes idiomas en Magento 1.5.0.1

Tenemos un cliente en Logocomunica que tiene la web traducida a cuatro idiomas. Al ser una tienda online hecha en Magento, existe la posibilidad de crear los correos transaccionales de cada acción en la que hace falta informar a los clientes de la tienda en cada uno de los 4 idiomas. Una vez creados estos correos se configura en los diferentes idiomas para que, según en que idioma se esté visualizando la página, te mande los correos en el idioma correspondiente.

El caso es que nos dimos cuenta de que los correos enviados a usuarios al registrarse en español se mostraban en inglés. Al ver que estaban bien configurados nos pusimos a buscar por internet hasta encontrar que era un bug de la versión 1.5.0.1 de Magento.

En el archivo app\code\core\Mage\Customer\Model\Customer.php se encuentra este trozo de código en la función sendNewAccountEmail (alrededor de la línea 517):

 if (!$storeId) { $storeId = $this->_getWebsiteStoreId($this->getSendemailStoreId()); } 

Este código por lo visto no devuelve correctamente el id de la vista de la tienda.

También nos dimos cuenta de que también estaba esta otra línea (569) que hacía algo parecido, en la función sendPasswordReminderEmail:

    $storeId = $this->getStoreId();
    if (!$storeId) {
        $storeId = $this->_getWebsiteStoreId();
    }

Para resolver esto, copiamos el archivo Customer.php a app\code\local\Mage\Customer\Model\Customer.php y hay que volver hacia atrás unas cuantas releases y copiar el código del mismo fichero en la versión 1.4.1.1. donde si funcionaba correctamente. Con lo que para el primer trozo de código nos quedaría así:

    // Código de la 1.4.1.1 que si que funciona
    $storeId = ($storeId == '0')?$this->getSendemailStoreId():$storeId;
    if ($this->getWebsiteId() != '0' && $storeId == '0') {
        $storeIds = Mage::app()->getWebsite($this->getWebsiteId())->getStoreIds();
        reset($storeIds);
        $storeId = current($storeIds);
    }

y para el código de la línea 569 quedaría algo así:

    // Código de la 1.4.1.1 que si que funciona
    $storeId = $this->getStoreId();
    if ($this->getWebsiteId() != '0' && $storeId == '0') {
        $storeIds = Mage::app()->getWebsite($this->getWebsiteId())->getStoreIds();
        reset($storeIds);
        $storeId = current($storeIds);
    }

Y con esto ya nos llegarán los correos de registro y de recordatorio de contraseña en el idioma correcto.

+info: http://www.magentocommerce.com/boards/viewthread/77826/#t333947

Cambiar todos los archivos a UTF-8 en Eclipse

Tip tonto que me trae de cabeza cada vez que instalo Eclipse.

Cuando instalas Eclipse, no se por qué razón, viene por defecto la codificación de los archivos de texto en codificación ANSI, con lo que todos los archivos que tuvieras en UTF-8 se verán con caracteres raros sustituyendo a letras con acentos, eñes y demás caracteres usados en castellano.

Para hacer que todos los archivos de texto se vean con la codificación correcta hay que ir a Preferences / General / Content types, seleccionar Text en la lista de Content Types y en default enconding poner UTF-8.

Con hacer esto, todos nuestros archivos de texto tendrán UTF-8 y volverán nuestras preciadas tildes…

Slider en cabecera para tema twentyeleven en WordPress

Muchas veces he utilizado como tema base para crear un template para WordPress, el tema twentyeleven, que viene por defecto en la instalación de la última versión.

Siempre había querido hacer un slider con las imágenes que se muestran en la cabecera y que son configurables desde Apariencia / Cabecera. El caso es que el otro día tuve que hacerlo para un cliente y, antes de ponerme a hacerlo desde cero, busqué un poco por si alguien lo había hecho ya, no es cuestión de ir reinventando la rueda porque sí.

El caso es que encontré un plugin que añade una opción más a la ventana de configuración de la cabecera para que esta se muestre como un slider, utilizando para ello el plugin para jQuery Nivo Slider (qué casualidad, porque yo iba a poner ese).

El caso es que después de instalar el plugin y de realizar un par de ajustes ya me aparecían las imágenes de la cabecera pasando de una a otra.

Ahora solo me hacía falta configurar mis imágenes para que salieran estas en lugar de las que vienen por defecto en twentyeleven.

Abrimos el archivo functions.php y al final del todo lo que haremos será:

  1. Deshabilitar las imágenes de la cabecera que vienen por defecto y…
  2. Habilitar nuestras imágenes habiendo subido previamente las nuevas al servidor via ftp

Para esto lo que habrá que hacer, como ya he dicho, es escribir el siguiente código al final de functions.php:

// BORRAR IMAGENES POR DEFECTO CABECERA TWENTY ELEVEN
function mitema_borrar_imagenes_header() {
    unregister_default_headers( array('wheel','shore','trolley','pine-cone','chessboard','lanterns','willow','hanoi')
    );
}
add_action( 'after_setup_theme', 'mitema_borrar_imagenes_header', 11 );

//NUEVAS IMAGENES PARA LA CABECERA
function mitema_nuevas_imagenes_header() {
    $dir = get_bloginfo('stylesheet_directory');
    register_default_headers( array (
        'image1' => array (
            'url' => "$dir/images/headers/imagen_01.jpg", //1000px x 288px
            'thumbnail_url' => "$dir/images/headers/imagen_01_thumb.jpg", // 230 x 66px
            'description' => __( 'Descripcion imagen', 'dominio' )
        ),
        'image2' => array (
            'url' => "$dir/images/headers/imagen_02.jpg", //1000px x 288px
            'thumbnail_url' => "$dir/images/headers/imagen_02_thumb.jpg", // 230 x 66px
            'description' => __( 'Descripcion imagen', 'dominio' )
        ),
        'image3' => array (
            'url' => "$dir/images/headers/imagen_03.jpg", //1000px x 288px
            'thumbnail_url' => "$dir/images/headers/imagen_03_thumb.jpg", // 230 x 66px
            'description' => __( 'Descripcion imagen', 'dominio' )
        ),         
        'image4' => array (
            'url' => "$dir/images/headers/imagen_04.jpg", //1000px x 288px
            'thumbnail_url' => "$dir/images/headers/imagen_04_thumb.jpg", // 230 x 66px
            'description' => __( 'Descripcion imagen', 'dominio' )
        ),         
        'image5' => array (
            'url' => "$dir/images/headers/imagen_05.jpg", //1000px x 288px
            'thumbnail_url' => "$dir/images/headers/imagen_05_thumb.jpg", // 230 x 66px
            'description' => __( 'Descripcion imagen', 'dominio' )
        )         
    ));
}
add_action( 'after_setup_theme', 'mitema_nuevas_imagenes_header' );

Con esto lo que hacemos es borrar las antiguas imágenes y poner cinco nuevas.

Mucha gente utiliza los child themes, o temas basados en otros, para crear modificaciones de estos. Yo no lo hago pero más que nada porque no me he puesto nunca. Simplemente me gusta enredarme con el código y crear un nuevo tema a partir del original, aunque igual lo de hacer un child theme sea mejor opción.

Espero que le sirva a alguien :D

Act: Suelo dejar para el final el tema de hacerlo todo compatible a versiones antiguas de IE. En este caso IE7 no carga las imágenes. Por lo visto el utilizar la opción auto insert del plugin no le gusta mucho al dichoso IE y no carga bien. La solución es cambiar el código de carga de las imágenes directamente en el archivo header.php. Donde pone esto:

<?php // Check to see if the header image has been removed
$header_image = get_header_image();
if ( ! empty( $header_image ) ) : ?>
<a href="<?php echo esc_url( home_url( '/' ) ); ?>">
<?php // The header image
 // Check if this is a post or page, if it has a thumbnail, and if it's a big one
 if ( is_singular() &&
 has_post_thumbnail( $post->ID ) &&
 ( /* $src, $width, $height */ $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), array( HEADER_IMAGE_WIDTH, HEADER_IMAGE_WIDTH ) ) ) &&
 $image[1] >= HEADER_IMAGE_WIDTH ) :
 // Houston, we have a new header image!
 echo get_the_post_thumbnail( $post->ID, 'post-thumbnail' );
 else : ?>
 <img src="<?php header_image(); ?>" width="<?php echo HEADER_IMAGE_WIDTH; ?>" height="<?php echo HEADER_IMAGE_HEIGHT; ?>" alt="" />
 <?php endif; // end check for featured image or standard header ?>
</a>
<?php endif; // end check for removed header image ?>

Por esta línea:

<?php boom_header_image(); ?>

Con esto ya cargará bien las imágenes en IE7 y nos podremos olvidar del tema…

+ info: http://wordpress.org/extend/plugins/header-image-slider/
http://wpti.ps/functions/replace-remove-header-image-twenty-eleven-theme/

Launch Effect por BarrelNY

Estaba esperando a escribir este post a que la gente de BarrelNY sacara la nueva versión de Launch Effect, y ya está aquí, la versión 1.0.3.

Launch Effect es un tema para WordPress que convierte una instalación nueva en una valiosa herramienta para marketing. Se trata de crear un anuncio viral de un evento próximo, una apertura de tienda, un concierto, lo que sea, pero con un diseño y un potencial extremos.

Solo hay que seguir los pasos de instalación indicados y ya podremos empezar a configurar la landing, imagen de fondo con supersized, textos, maquetación, etc… Una vez tenemos la landing a nuestro gusto empieza el tema viral. Corremos una primera voz como podamos.

Cada persona que introduzca el email en la lista recibirá una url para poder compartir con los amigos, cosa que puede hacerse mediante los botones adjuntos para publicar en redes sociales. Cuantos más amigos utilicen esa url más puntos tendrá, haciendo así que se pueda premiar al usuario que más corra la voz.

Después podremos ver todos los resultados y descargar un CSV con todas las direcciones de correo.

Una pasada de tema, tanto por la parte de código como por la parte visual, que va a dar mucho que hablar y le van a salir competidores por todos lados porque la idea es simplemente genial, aunque ser pionero tiene un grado.

Yo sin duda pagaría por un tema como este pero sin pensarlo un segundo.

PS: La página de la aplicación una maravilla en cuanto a diseño y programación. Inspiration First Class.

+info:
http://launcheffectapp.com/
Explicación de Launch Effect por la gente de Barrel

Rotación mediante CSS3 / Webkit

Hace un tiempo estuve viendo el proyecto Stampaxx, una buena colección de sellos para indicar de que va tu proyecto. Me pareció una idea genial, un diseño super cuidado y encima gratis. Me gustó tanto que decidí echar un vistazo a los autores: Thomas y Mike

La web de Thomas un sencillo carrousel con sus proyectos, sencilla y atractiva, genial. Pero lo que me llamó la atención fue algo que ví en la web de Mike. Yo navego siempre con Chrome y me impactó un montón cuando, al pasar el ratón por el logo de acceso a twitter, este giraba 180 grados. Me puse a investigar y vi que lo hacía mediante CSS, así que intenté hacerlo con mi logo…

Primero lo que hay que hacer es cargar el logo con un background en lugar de cargar la imagen desde html:

#logo { height: 100px; width: 100px; text-indent: -9999px;}
#logo a { background: url(images/logo.png); height: 100px; width: 100px; display:block; }

y luego indicarle a los navegadores webkit la rotación que tienen que hacer y cuando la tienen que hacer:

@-webkit-keyframes rotate {
  from { -webkit-transform: rotate(0deg) }
  to { -webkit-transform: rotate(360deg) }
}

#logo a:hover {
  -webkit-animation-name: rotate;
  -webkit-animation-duration: 0.7s;
  -webkit-animation-iteration-count: 1;
  -webkit-animation-timing-function: ease-in-out;
}

Esto funciona en mi caso teniendo el logo de esta forma en mi código html

<span id="logo">
	<a href="<?php echo home_url( '/' ); ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a>
</span>

Esto, evidentemente va contra todos mis principios de validación de código ya que esto solo vale para navegadores webkit, pero es que queda tan chulo…

Generador @font-face por fontSquirrel

Creo que ya he hablado de la magnífica fontSquirrel alguna vez, el servicio gratuito de tipografías online que compite directamente con Google Fonts y además, hinchando pecho, David contra Goliat. Pero lo que encontré hace unas semanas le da una vuelta de tuerca al servicio de los de la ardilla.

FontSquirrel tiene un generador de fuentes para web gratuíto que hace que se lleve el gato al agua. No se si Google Fonts u otros como DaFont lo tienen, pero sin lugar a dudas este se lleva la palma.

Sólo tienes que introducir tu tipografía y darle a generar, en unos segundos tendrás tu fuente lista para web, con todos los estilos y ejemplos posibles.

Creeeeeema.

http://www.fontsquirrel.com/fontface/generator

Deshabilitar Fooman Speedster en Magento… TERROR!

Fooman Speedster es un módulo para Magento que permite acelarar la carga de la web en un tanto por ciento bastante considerable. Para ello minimiza archivos, optimiza el código e implanta metas entre las etiquetas <head> y </head>.

Todo funciona de maravilla si tienes la web terminada y no la piensas tocar. Pero entonces surge el día en el que tienes que cambiar el css por alguna razón y te das cuenta de que los ficheros los ha minimizado permanentemente. Bueno, como tienes copia de seguridad no pasa nada, restauras la copia y deshabilitas el módulo…

ARG!!!! HORROR!!!! El módulo sigue en funcionamiento pero no pone nada entre las etiquetas <head> y </head>. Pero lo peor no es eso, lo peor es que hace lo mismo tanto en el frontend como en el backend!! Ahora como deshabilitas el módulo?????

Que no cunda el pánico. Resulta que Magento da prioridad a la configuración de los módulos por xml con lo que sólo hay que ir a la configuración del módulo, /app/etc/modules/Fooman_Speedster.xml y poner el campo:

<active>true</active>

a

<active>false</active>

Después de esto, si tienes la caché activada igual sería buena idea hacer un buen flush.

Hace poco tuvimos un momento de pánico en la empresa por este tema y lo solucionamos rápido porque nos pusimos a buscar la solución como locos y la encontramos, pero por si acaso alguien no dispone de mucha gente para operar…

+ info en este thread: http://www.magentocommerce.com/boards/viewthread/48669/

Streaming de ficheros zip en php

En Uhuru Labs tenemos varias secciones con archivos descargables. Algunos de ellos son ficheros comprimidos en .zip como MMP, la extensión para VLC que creamos hace ya un año.

El caso es que subimos la versión y no nos dimos cuenta durante bastante tiempo de que teníamos un error grave a la hora de descargar los ficheros comprimidos. Resulta que sí que descargaba un fichero .zip, pero al descomprimirlo este se convertía en un fichero .cpgz y al descomprimir este volvía a aparecer el fichero .zip. Era un bucle infinito de descompresiones!!

El error lo teníamos en la descarga del archivo, ya que utilizamos un script php que, aparte de proporcionar el archivo comprimido según el proyecto y la versión de este, nos avisa por correo de la descarga realizada. En este script ponemos los datos del header y luego vamos leyendo el archivo requerido y mandandolo mediante la orden flush().

Para corregir el error, una vez creados los datos de la cabecera hay que hacer un ob_clean(), limpiando así el buffer de salida antes de empezar a mandar nada.

El código quedaría así:

    $fname = basename($file_path);
    // file size in bytes
    $fsize = filesize($file_path);
    $fext = strtolower(substr(strrchr($file_path,"."),1));

    $mtype = $fichero[0]['post_mime_type'];    

    // Browser will try to save file with this filename, regardless original filename.
    // You can override it if needed.
    $asfname = $fname;

    // set headers
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Type: $mtype");
    header("Content-Disposition: attachment; filename=\"$asfname\"");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . $fsize);

	ob_clean(); 

    // download
    // @readfile($file_path);
    $file = @fopen($file_path,"rb");
    if ($file) {
      while(!feof($file)) {
        print(fread($file, 1024*8));
        flush();
        if (connection_status()!=0) {
          @fclose($file);
          die();
        }
      }
      @fclose($file);
    }

Cómo bajar las fuentes de Google en OSX

Siguiendo los pasos indicados en la página inicial del proyecto Google Fonts en Google Code me bajé todas las fuentes para poder utilizarlas en mis diseños.

Estos son los pasos:

  1. Bajar e instalar Mercurial según la versión de OSX (Lion – 10.7, Snow Leopard – 10.6, etc…)
  2. Abrir el Terminal (Aplicaciones/Utilidades/Terminal) y poner la siguiente orden:
    hg clone https://googlefontdirectory.googlecode.com/hg/ destino

    Donde destino es el nombre del directorio donde se guardarán las fuentes

Con estos dos simples pasos empezará a descargarse toda la base de datos de fuentes del proyecto. Una vez finalizada si sale una nueva fuente en Google Fonts solo con utilizar la siguiente orden en el Terminal estando dentro del directorio destino se actualizará el proyecto bajando solo las nuevas fuentes:

hg pull

+info: http://code.google.com/p/googlefontdirectory/

Cambiar entre tiendas en Magento

Tenemos un cliente en Logocomunica que tiene dos tiendas en la misma instalación de Magento. Quería que hubiese una forma de pasar de una a otra tienda mediante un switcher o algo por el estilo.

Buscando por internet he encontrado un snippet que saca un combo para cambiar de una tienda a otra.

Snippet for switching between websites por la gente de Inchoo

Lo que he hecho ha sido coger ese snippet, meterlo en una carpeta llamada selectarea dentro de la carpeta template de mi tema y luego en el archivo de layout page.xml, dentro del bloque header he incluído esta línea justo encima de la línea que indica el bloque del buscador (se puede incluir en el sitio que queramos de todas formas):

<block type="core/template" name="select.area" as="selectArea" template="selectarea/select.area.phtml"/>

Luego tuve que cambiar el nombre del los websites para que pusiera lo que yo quería, pero eso es tema aparte.