Cuida tu tienda online al detalle

carlosgarciafaria at gmail punto com

carlos_faria_cuida_detalles_tienda_online

Cuida tu tienda online al detalle

He escrito un nuevo post para genteecommerce sobre cuidar el detalle en nuestras tiendas online para generar confianza.

Si queréis verlo podéis hacerlo aquí:

http://www.genteecommerce.com/consejos-ecommerce-cuida-tu-tienda-online-al-detalle/

 

Console.log en Magento

El viernes pasado empecé una maquetación de la ficha de producto de una tienda online que estamos creando en Magento. Es una ficha un tanto complicada, ya que tiene multitud de efectos con javascript: cloud zoom, tooltips, sliders, etc…

Como ya conozco jQuery nunca me he querido meter a aprender Prototype que es el framework javascript que utiliza Magento.

El caso es que para comprobar si selecciono bien los objetos y hacer un poco de debug en el navegador hace tiempo que uso Google Chrome usando la consola. Así que voy insertando llamadas a console.log para sacar información del estado de los scripts.

Cuando ya llevaba un rato programando me encontré con un error, del que ya hablaré otro día. Para hacer debug e intentar solucionarlo, empecé a poner llamadas a console.log en todo el código. Cuál fue mi sorpresa cuando vi que no se mostraba nada en la consola de Chrome.

Después de un largo rato y cuando ya estaba pensando en volver a los antiguos alerts se me ocurrió que el problema podría estar en Magento, y… piensa mal y acertarás.

Encontré una forma de solucionarlo gracias a astorm en gitHubhttps://gist.github.com/992233

Lo que hay que hacer es poner el siguiente código en un archivo .xml de layout, en local.xml por ejemplo:

<default>
<reference name="content">
<block type="core/text" name="fix.console" as="fix.console">
<action method="setText">
<text><![CDATA[<script type="text/javascript">
iframe = document.createElement('iframe');
iframe.style.display = 'none';
document.getElementsByTagName('body')[0].appendChild(iframe);
window.console = iframe.contentWindow.console;
console.firebug = "faketrue";
</script>]]></text>
</action>
</block>
</reference>
</default>

Con esto y habiendo refrescado la caché ya podemos usar console.log sin ningún tipo de problema. Hasta podemos usarlo en las funciones Prototype sin tener que ensuciarnos mucho las manos.

Algún día hablaré sobre las ventajas de utilizar jQuery en lugar de Prototype, pero eso ya es otra historia.

Actualización: Una vez utilizados los console.log para propósitos de debug es recomendable quitarlos ya que nuestro querido internet explorer explota en su subuniverso cuando se encuentra con una de estas sentencias… kill ie!!

Corrigiendo bug z-index en ie7 con jQuery

Hace poco, terminé de maquetar el boceto de una tienda online que estamos montando en Logocomunica. El boceto requería un mini carrito en el header que se mostrara cuando el usuario pasara por encima el ratón. Todo funciona perfectamente en todos los navegadores, excepto, claro está, en internet explorer 7.

En esta ocasión, este maravilloso software decidió que el carrito debía mostrarse siempre por debajo de las capas con el atributo z-index inferior, saltándose a la torera lo que le indicaba:

Después de unas tres horas creyendo que el problema estaría en mi código CSS y cambiando y volviendo a cambiar positions, z-index y demás atributos, se me ocurrió que el problema podía ser iE7. Y efectivamente iE7 tiene un bug cuando trata los índices de capas asignados mediante z-index. + info iE7 bug z-index

Tras perder tanto tiempo en este problema opté por una solución rápida proporcionada por Vance Lucas en la que recorre todo el dom de arriba a abajo asignando a cada div un z-index, empezando por 1000 y restandole 10 a cada div interno, con lo que los div superiores tendrán un z-index superior a los inferiores.

$(function() {
	var zIndexNumber = 1000;
	$('div').each(function() {
		$(this).css('zIndex', zIndexNumber);
		zIndexNumber -= 10;
	});
});

Solución no ideal, pero efectiva. El carrito ahora queda como en todos los navegadores modernos:

Dios salve a jQuery! Mi consejo, recomienda a todo el mundo que actualice su navegador y que si eso se cambien a un navegador que no me mate por dentro cada día…

nota mental: siempre pensar que el fallo es de iE7 antes de romperme los cuernos

+info: http://www.vancelucas.com/blog/fixing-ie7-z-index-issues-with-jquery/

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/