Rutas de plantilla en administrador Magento

magento_logo

Se que esto es algo que no todo el mundo busca, pero cuando te dedicas a la creación de módulos en Magento puede servir de mucha ayuda.

Si tienes formularios de configuración que sacar o bloques que renderizan algo en el administrador, sacar las rutas en el administrador si no sabes donde está el bloque que se renderiza puede ser de mucha utilidad.

Por defecto el administrador de Magento solo deja sacar las rutas para frontend, no para backend. Para que el editor te permita poner las rutas en backend hay que modificar el siguiente archivo de configuración:

/app/code/core/Mage/Core/etc/system.xml

Y hay que poner a valor 1 los siguiente parámetros, que se encuentran alrededor de las líneas 553 y 562 en Magento 1.9.1.0:

Después de hacer esto, si accedéis a System / Configuration / Developer con el Configuration Scope en Default Config en lugar de saliros algo así:

rutas-en-administrador-magento-1

os debería salir algo así:

rutas-en-administrador-magento-2

y ya podréis activar las rutas en el administrador.

Al ser un archivo del core, lo ideal es dejar las cosas como están una vez hemos terminado.

+info: http://stackoverflow.com/questions/4373481/enable-template-path-hint-in-admin-pages-magento

Esta entrada va dedicada a mi querido amigo Diego Mestre, que debería tener esto grabado a fuego hace ya mucho tiempo.

Maquetar success.phtml en Magento 1.8.1.0

magento_logo

Maquetar la thankyou page puede ser un engorro importante si cada vez que tenemos que probar los cambios tenemos que hacer un pedido. Lo mejor es que impidamos el limpiado de la sesión para que cuando refresquemos nos siga mostrando la información del pedido.

Para hacer esto nos vamos al archivo:

/app/code/core/Mage/Checkout/controllers/OnepageController.php

y comentamos temporalmente la línea 291 donde pone:

la función es successAction por si en próximas versiones cambiara el número de línea.

Info extraída de: http://www.impulsis.com/nc/blog/blog-post/how-to-style-success-page-in-magento/comment/1/30.html

Class ‘Mage_Googlecheckout_Helper_Data’ not found

magento_logo

El otro día actualicé un Magento de la versión 1.8.0.0 a la 1.8.1.0. Al entrar al administrador me salía la típica ventana de Magento en blanco total que no te informa de absolutamente nada (White Screen Of Death), menos mal que a veces el fichero de errores de apache dice alguna cosa útil.

El problema estaba en la clase Mage_Googlecheckout_Helper_Data. Algo han hecho en la última versión ya que en la propia info de de lanzamiento ponen que hay que eliminar todos los archivos menos config.xml de la ruta

/magento-install-dir/app/code/core/Mage/GoogleCheckout/etc

Más info en:

http://www.magentocommerce.com/knowledge-base/entry/ce-18-later-release-notes#11810-changes-upgrade-issue
http://stackoverflow.com/questions/20569358/class-mage-googlecheckout-helper-data-not-found

Cantidad no se actualiza en carrito Magento 1.8.0.0

magento_logo

Estos fallos en versiones de Magento que ya tienen su solera me tocan las narices. Resulta que ahora a no ser que uses el archivo template/checkout/cart.phtml directamente de base no te incluye en el formulario una key con lo que no se actualizan las cantidades.

Si ponemos las rutas cargando el cart.phtml del base vemos que carga un bloque (frontend/base/default/template/core/formkey.phtml) con una variable input type=”hidden” llamada form_key. Este bloque no lo carga si usamos un cart.phtml propio en nuestro template.

La solución es poner en nuestro cart.phtml un input type=”hidden” como este:

act: También se puede utilizar esta otra línea que parece más limpia ya que carga el código bloque correspondiente según el layout core.xml

+info
http://www.magentocommerce.com/boards/viewthread/767323/

Listar productos destacados por fecha en Magento 1.8.0.0

magento_logo

Supongo que esto será igual para versiones anteriores, pero como digo en el título yo he hecho la prueba en la versión CE 1.8.0.0

Para sacar el listado de productos según un atributo personalizado fecha deberemos de hacer una serie de pasos:

  1. Creación de los atributos y asignación de estos a un conjunto.
  2. Creación de un fichero .phtml que cargaremos a través de una llamada desde la página CMS
  3. Llamada desde la página Home para cargar el phtml.

Ok, vamos a ello:

1. Como queremos realizar un listado de productos destacados por fecha, vamos a crear dos atributos de nombre featured_from_date y featured_to_date de tipo Fecha y los adjuntamos a los conjuntos de atributos que queramos (Default o los personalizados que tengamos).

2. Una vez hecho esto habrá que crear un fichero de nombre featured.phtml en /app/design/frontend/paquete/tema/template/catalog/product/ siendo paquete el nombre del paquete utilizado y tema el nombre del tema, con el siguiente contenido:

3. Una vez creado el fichero habrá que hacer la llamada desde la home con este código:

Ahora solo tienes que cambiar las fechas del atributo featured_from_date y featured_to_date de cualquier producto para asegurarnos de que se muestra en el bloque de la home. Ten en cuenta que este código solo muestra producto que son visibles, es decir, si el producto está deshabilitado no será mostrado por mucho que tengas el código correcto.

Borrar pedidos de prueba y resetear contadores en Magento 1.7.0.0

magento_logo

Para empezar una tienda de cero y ponerla en producción nunca está de más borrar todos los pedidos que se han hecho de prueba y resetear los contadores para que el primer pedido y la primera factura empiecen con el número 1. Esto es importante si vas a utilizar el envío de facturas a clientes por ejemplo.

Antes de nada, hacer una copia de seguridad de la base de datos.

Mi versión de Magento, como ya digo en el título, es la 1.7.0.0

Creamos un archivo en el raiz de Magento (al mismo nivel que el archivo index.php y el directorio app) un archivo borrar_pedidos.php con este código de Dejan Radic de Inchoo que quita todos los pedidos, facturas, envíos, etc.

Una vez creado lo ejecutamos accediendo a él directamente (http://dominio.com/borrar_pedidos.php).

Que no se te olvide borrar este archivo una vez hayas terminado.

Una vez quitados los pedidos el señor Fooman nos muestra como resetear los números de pedidos, facturas y envíos.

With a tool like phpmyadmin look at your database. In the table eav_entity_type you will find all entity types listed. The one of interest to change where the order number starts is order sales/order. Remember the entity_type_id (in my install it is 11). Next go to the table eav_entity_store. Look up the entity_type_id. Now you can change the value of increment_prefix and increment_last_id. If you wanted to have your next orderId to be 15000 set increment_last_id to 14999

Lo que quiere decir es que tenemos que ir a la tabla eav_entity_type, miramos entonces cual es el registro cuya columna entity_model es sales/order y nos quedamos con el campo entity_type_id. Ese será el identificador de los pedidos. Haremos lo mismo con las facturas (sales/invoice) y con los envíos (sales/shipment). Una vez tenemos estos códigos nos vamos a la tabla eav_entity_store y comparamos el campo entity_type_id con los valores que acabamos de obtener. Solo falta cambiar en esta tabla los valores del campo increment_last_id y le pondremos el valor anterior al que queremos que tenga el primer pedido/factura/envio. Es decir, si queremos que sea 100000001 como viene por defecto en Magento, pondremos como valor de increment_last_id 100000000.

Por último, una cosa más que a mi me daba error es la siguiente: Una vez seguidos todos los pasos anteriores al realizar un pedido para ver que todo estaba correcto y entrar al administrador para ver dicho pedido me salía un error como que el pedido con ese identificador ya existía(). Yo uso un módulo llamado OneStepCheckout para juntar todo el proceso de compra en una misma página que crea una tabla de pedidos llamada mw_onestepcheckout. Esa tabla también tendrá que ser vaciada por completo (TRUNCATE) y ya no nos dará el problema al entrar en la zona de pedidos del administrador de Magento.

Espero ahorrarle tiempo a alguien (o a mi mismo en un futuro :D)

 

Please specify product option(s) al añadir bundle desde el listado de productos en Magento

Ya estoy terminando mi primera tienda online propia. En ella, para controlar el stock, tengo una serie de packs compuestos por bundles con simples relacionados. Al hacer pruebas de inclusión de los productos en el carrito desde el listado de productos me encuentro con el siguiente problema en Magento v 1.7.0.0.

Tengo una categoría en la que todos los productos son paquetes de productos (bundle), los productos asociados a estos son simples, introducidos como diferentes opciones checkbox en una opción del paquete de artículos, marcados por defecto y la opción configurada como Se requiere = NO. Algo así:

El problema viene al intentar añadir el producto al carrito desde el listado. Al darle al botón, en vez de añadirlo al carrito el sistema te lleva directamente a la ficha de producto mostrando el siguiente error:

Please specify product option(s)

y te deja en la ficha de producto con ese mensaje. Lo bueno es que desde la propia ficha de producto y sin tocar nada, le damos al botón de añadir el producto al carrito y funciona perfectamente.

Lo que yo quiero es, ya que las opciones no son obligatorias que vaya directamente al carrito sin pasar por la ficha de producto. Para ello he hecho un pequeño cambio en el botón del listado de productos.

En el template del listado, archivo /app/design/frontend/default/nombre-de-tema/template/catalog/product/list.phtml haremos el siguiente cambio (no especifico línea porque según qué plantilla estéis utilizando será una u otra):

Donde pone:

ponemos esto otro:

Con esto lo que hacemos es utilizar un formulario para productos tipo bundle y para el resto de productos (simples, configurables, etc..) el botón que viene por defecto. Lo que hacemos en el caso de que el tipo de producto sea bundle es hacer un bucle por todas las opciones y ponerlas como ocultas en un formulario, con otro campo oculto para poner la cantidad por defecto de cada opción simple. A la vez controlamos el stock de cada una de las opciones y si no hay stock de alguna de ellas no  El botón enviará ese nuevo formulario sin tener que pasar por la ficha de producto.

Código sacado de aquí, pero me costó encontrarlo un montón así que por eso esta entrada: http://stackoverflow.com/questions/5911738/add-bundle-product-to-cart-without-having-to-specify-the-options/13663949#13663949

Off Topic: Con esta entrada vuelvo a retomar mi blog. A ver si publico un sinfín de entradas relacionadas con Magento que he ido acumulando durante más de un año trabajando en Kuombo.

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:

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!!

Actualización2: Otra opción es modificar el código que anula los console.logs excepto para Firebug en Firefox. Habría que comentar las siguientes líneas del archivo magento/js/varien/js.js alrededor de la línea 500 en Magento 1.5.2 para luego volverlas a descomentar en servidor de producción:

 

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):

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:

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í:

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

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

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:

a

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/