Category: Magento

Magento: Obtener los productos mas vendidos

Para poder obtener una colección de los productos mas vendidos, simplemente hacemos una clase como la siguiente:

<?php
class Mage_Catalog_Block_Product_Bestseller extends Mage_Catalog_Block_Product_Abstract
{
    public function __construct()
    {
    parent::__construct();

    $storeId = Mage::app()->getStore()->getId();

    $products = Mage::getResourceModel('reports/product_collection')
        ->addOrderedQty()
        //->addAttributeToSelect('*')
        ->addAttributeToSelect(array('name', 'price', 'small_image', 'short_description', 'description'))       
        ->setStoreId($storeId)
        ->addStoreFilter($storeId)
        ->setOrder('ordered_qty', 'desc'); //Los mas vendidos arriba

    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);

    $this->setProductCollection($products);

    }
}

Saludos.

Magento: Obtener nombre del método de Pago

Para obtener el método de pago actual, de una orden o de un quote, lo hacemos de la siguiente manera:

$payment = $order->getPayment()->getMethodInstance()->getTitle();

O si queremos obtener el código del método de pago:

$payment = $order->getPayment()->getMethodInstance()->getCode();

Aprendiendo Magento: Crear un módulo I

En esta sesión veremos como crear un módulo básico en Magento, esta plataforma se destaca por ser bastante escalable y flexible. Primero que nada, para poder comenzar a desarrollar un módulo en Magento hay que tener claros varios conceptos:

Magento es una plataforma modular: Esto nos facilita su escalabilidad, permitiendo agregar y quitar módulos como sistemas independientes.

Magento es una plataforma orientada a los eventos: El uso de eventos es algo bastante útil, ya que a través de los eventos, podemos extender la funcionalidad de nuestro sitio.

Magento es una plataforma MVC: Esta basada en un sistema Modelo – Vista – Controlador, la diferencia radica en la vista, ya que Magento divide la vista en 3 capas; Layouts, Bloques y templates. Ademas de cambia la lógica de la capa que interactua con el modelo de negocios, ya que en lugar de que el controller sea el encargado de obtener los datos de los modelos, en Magento lo hacen los Bloques.

La estructura de archivos:

  • app: Almacena la aplicación de Magento, dividiendolo en 3 áreas (Codepools) : Local, Community y Core:
    •     Local: Todos nuestros desarrollos serán almacenados en esta carpeta
    •     Community: Aquí se almacenaran los módulos que descarguemos de Magento Connect
    •     Core: En esta área encontraremos todo el código nativo de Magento, se recomienda nunca  modificar algún archivo de este codepool, ya que en el momento de que Magento lancé alguna actualización y nosotros la apliquemos, los cambios que nosotros hayamos hecho en esta carpeta, se verán sobreescritos, y por tanto, perderemos el trabajo realizado.
  • media: Los archivos que ingresemos desde el CMS del Backend serán almacenados en esta carpeta, como por ejemplo, las imagenes del catalogo de productos.
  • js: Aqui se almacenan todos las librerías javascript como prototype, que es la librería javascript nativa de Magento, aqui mismo podemos agregar jQuery y más plugins, tal como lo demostramos en: http://www.machakandocodigo.com/magento-incluir-javascript-y-css/
  • skin: En este directorio se almacenan los paquetes referentes a los temas de diseño que vamos a utilizar, es decir, todos nuestros .css se almacenarán en este lugar.
  • var: Almacena los logs, y todos los archivos temporales que necesitemos.

No olviden visitar la siguiente parte donde aprenderemos a crear un Hola mundo en Magento:

Magento: Borrar links del footer

Para eliminar los links del footer en Magento tenemos que editar o crear (si aun no lo tenemos) un archivo layout en nuestro tema actual.

/app/design/base/default/layout/local.xml

Dentro de este, ponemos el siguiente contenido:

<?xml version="1.0"?>
<layout version="0.1.0">
    <reference name = "root">
        <reference name="footer">
            <remove name="footer_links"/>
        </reference>
    </reference>

Y con esto eliminamos los footer links, pero nos damos cuenta que aun quedan 3 los cuales son :

  • About us
  • Customer Service
  • Privacy Policy
Para eliminar estos tres links restantes, nos vamos a nuestro BackEnd, y desde CMS->Static Blocks->Footer links, damos click y dentro cambiamos a status “Disabled”. Guardamos cambios, refrescamos caché y con esto hemos logrado eliminar los links del footer.

Magento: Activar logs de errores

Al momento de hacer debugging en Magento, nos encontramos con que una instalación limpia de Magento no tiene por default los logs activados.
Para lograrlo, nos vamos a nuestro backend->System->Configuration->Developer->Log Settings
Y cambiamos la opción de Enabled a Yes.

Para poder visualizarlos físicamente, nos vamos al directorio de nuestra aplicación, en la carpeta raíz buscamos el directorio de /var/log, y ahí se deben encontrar nuestros archivos con los logs de errores correspondientes.

En dado caso que no se logren a visualizar ni haciendo el proceso anterior, entonces nos vamos a la carpeta /errors localizada también en la raíz del sitio, ahí vamos a copiar y pegar el archivo local.xml.sample y pegarlo con el nombre de local.xml. Y con esto ahora sí, nuestros logs quedarán activados.

Magento: Ver que archivos del core fueron modificados

 Cuando un cliente nos contrata y ya tiene un proyecto en Magento iniciado, es común que muchos otros desarolladores hayan olvidado las buenas prácticas y quizas han modificado archivos del core por innumerables ocasiones.
 Es por esto que debemos comprobar que funcionalidades del core han sido modificadas, para obtener un reporte rápido de estos casos, haremos lo siguiente en nuestra consola de comandos:

$diff -qrbB carpeta_limpia_core carpeta_modificada_del_core

La consola nos mostrara una lista de todas las rutas de archivos encontrados con diferencias:

Magento: muestra de resultados con diff


Y con esto podremos ver que archivos han sido modificados de una manera rápida y sencilla.

Arreglar Error de no poder accesar al backend

Les ha sucedido que al instalar una instancia “limpia” de Magento todo parece ir fluyendo bien, hasta que de pronto, cuando queremos accesar al backend, ingresamos las credenciales correspondientes, y no podemos accesar aunque hayamos ingresado los datos correctos, y lo peor de todo, sin mostrar ningun error.

En mi caso me ha sucedido un sinfín de ocasiones, para corregir esto, tenemos que copiar y ditar un archivo del core de Magento.

Para lograrlo, copiamos el siguiente archivo ubicado en:

app/code/core/Mage/Core/Model/Session/Abstract/Varien.php

Y lo colocamos en:

app/code/local/Core/Model/Session/Abstract/Varien.php

A continuación editamos su contenido, buscamos la siguiente sentencia:

if(isset($cookieParams['domain'])){
    $cookieParams['domain'] = $cookie->getDomain();
}

Y lo reemplazamos por lo siguiente:

if(isset($cookieParams['domain']) && !in_array("127.0.0.1", self::getValidatorData())){
    $cookieParams['domain'] = $cookie->getDomain();
}


Posteriormente eliminamos nuestra caché, borrando todo el contenido de la ruta /var/cache/ de nuestro sitio y por último borramos la caché de nuestro navegador.

Probamos nuevamente, y ahora si, seremos capaces de ingresar a nuestro backend

Magento: Crear mensajes de error y éxito

Magento nos ofrece la posibilidad de agregar mensajes de error y de éxito de una manera muy sencilla.
Simplemente desde nuestro controlador agregaremos la siguiente sentencia:
Mensaje de error:
$mensaje = $_this->__('Este usuario ya existe');
//Recordemos que con $this->__() invocamos al traductor de Magento
Mage::getSingleton('core/session')->addError($mensaje);
Mensaje de éxito:
$mensaje = $this->__('Usuario registrado');
Mage::getSingleton('core/session')->addSuccess($mensaje);
Y si queremos crear este tipo de mensajes para el backend:
Mensaje de error:
$mensaje = $_this->__('Este usuario ya existe');
Mage::getSingleton('adminhtml/session')->addError($mensaje);
Mensaje de éxito:
$mensaje = $this->__('Usuario registrado');
Mage::getSingleton('adminhtml/session')->addSuccess($mensaje);
Saludos.

Magento: Precios con impuestos

Si requerimos mostrar o conocer el precio que tiene un producto incluyendo impuestos, lo conseguimos con este código:

$priceWithTax = $this->helper('tax')->getPrice($product, $product->getFinalPrice());

Donde $product es nuestro producto previamente cargado ya sea por el modelo o por la Colección. 


Nota: Los impuestos deben estar previamente configurados desde el backend.

Magento: Problema de validación de formularios con IE9

Como siempre, cada versión nueva de Internet Explorer trae consigo un sin numero de problemas en aplicaciones web que tengamos desarrolladas. En esta ocasión tuvimos un problema con la validación de formularios en Magento en IE9, ya que los formularios sí mostraban los mensajes de error pero el formulario se enviaba. Lo cual generaba que se guardara información vacía o incorrecta.
Después de mucha investigación, resulta que Internet Explorer no es totalmente compatible con la versión de prototype que trae Magento por defecto.
Existen 3 soluciones:
– Actualizar la versión de prototype de la 1.6 a la 1.7, esto podría implicar que dejen de funcionar algunos otros componentes (no la he probado).
– Modificar el head de nuestro sitio, agregando la siguiente etiqueta:
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
Esto lo logramos modificando el /template/page/html/head.phtml de nuestro tema actual.
Fuente
– Si esto no funcionó, como en mi caso, trataremos de aplicar la misma solución, desde el .htaccess de nuestro sitio ubicado en /sitio/.htaccess
Aquí agregaremos la siguiente línea al comienzo del archivo:

BrowserMatch MSIE best-standards-support Header set X-UA-Compatible IE=8 env=best-standards-support

Fuente
Con esto, nuestro sitio en IE9 será interpretado como si estuviera corriendo en IE8.
Saludos