Mostrando entradas con la etiqueta magento. Mostrar todas las entradas
Mostrando entradas con la etiqueta magento. Mostrar todas las entradas

jueves, 14 de febrero de 2013

Magento: WSDL, limpiar los archivos del caché de PHP

Problema: Durante el desarrollo y exposición de Web services desde Magento usando SOAP, he tenido que prender y apagar el setting de "Enable WSDL Cache", y a veces, no actualiza los cambios realizados a las estructuras de datos definidos en los archivos wsdl.xml.

Solución: Eliminar los archivos temporales que PHP genera para el manejo de caché del archivo WSDL, así que:

Acceder a la carpeta temporal de tu servidor (linux), y eliminar los archivos temporales de wsdl:

cd /tmp
ls wsdl-* -l
rm wsdl-*

Listo, eso es todo.

Como beneficio adicional, seguramente esta acción evitará falsos errores de SOAP como:
  • Invalid API path
  • Is not a valid method
  • Resource path not callable

miércoles, 13 de febrero de 2013

Magento: SOAP V2, mejorar el tiempo de respuesta

Hay muchas razones por las que una petición a un web service usando SOAP V2 puede tomar mucho tiempo, pero la primera cosa que pienso es revisar la configuración para activar la caché en la construcción del archivo WSDL. Cuando se hace una llamada a la API de Magento, Magento usa el objecto SoapServer de PHP. El objeto SoapServer necesita obtener su propio archivo WSDL para poder funcionar, y la generación y extracción de este archivo puede consumir mucho tiempo.

La solución para esto es habilitar el manejo de caché para el archivo WSDL, que por defecto viene apagado en Magento. 


Acceder al backend de Magento, luego a System->Configuration->Magento Core API
Busca el rubro "Enabled WSDL Cache" y cámbialo a Yes.



Haciendo esto, mejorarás notablemente el tiempo de respuesta de las llamadas a la API, aclaro que esto funciona a partir de la versión 1.6 de Magento usando SOAP V2, para versiones anteriores hay una solución en este link: http://www.ivoronline.com/Coding/Languages/PHP/Tutorials/PHP - API - SOAP - Extension - Introduction.php

Este parámetro no existe en versiones anteriores a 1.6 de Magento, pero también existe una extensión comercial hecha por Alan Storm, y se llama "Mercury API Extension". Aunque también se puede mirar la clase Mage_Api_Model_Server_Adapter_Soap donde las versiones anteriores de Magento deshabilitan esta caché.

Esta solución fue tomada de Alan Storm desde Stackoverflow.com

martes, 28 de agosto de 2012

Magento: Cómo crear/usar variables globales

A partir de Magento 1.4 se pueden usar las variables personalizadas, o si lo quieres ver de otra manera "constantes" que pueden ser usadas a lo largo de tu código en Magento.

En este caso, voy a ejemplificarlo con el uso de una variable que me es muy útil para controlar el uso de la directiva display_errors de php.ini para los entornos de desarrollo/producción

Paso 1:

Acceder al backend de Magento, luego a System->Custom Variables

Paso 2:
Agregar una nueva variable. En el formulario ingresar los datos:
  • Variable Code. Aquí va el nombre de la variable, lo recomendable es nombrar una variable de acuerdo a la sintaxis de php (pero sin el signo de $)
  • Variable Name. Aquí se debe poner la descripción de la variable
  • Variable HTML Value. Opcional, se puede usar este campo que permite tags de HTML o usar el campo de abajo o ambos, y decidir en tu programación cual de los dos valores quieres que te retorne: el valor HTML o el valor de texto plano
  • Variable Plain Value. Colocar el valor que se desea, pero aquí no se acepta código HTML
Guardar los datos. Ahora vayamos al código para saber cómo usar esta nueva variable.

Paso 3:
Usar el siguiente código:

// por default, el tipo de datos es un string
$objVar = Mage::getModel('core/variable')->loadByCode('display_errors');
$display_errors = $objVar->getValue('plain');
ini_set('display_errors', $display_errors);

// pero puedes explícitamente cambiar el tipo:
$display_errors = (int) $objVar->getValue('plain');
ini_set('display_errors', $display_errors);

// booleano:
$display_errors = (boolean) $objVar->getValue('plain');
ini_set('display_errors', $display_errors);

// de punto flotante:
$display_errors = (double) $objVar->getValue('plain');
ini_set('display_errors', $display_errors);
Para este ejemplo, todos los tipos de datos son válidos para la directiva ini_set('display_errors', string|int|bool|double)

Y como te imaginarás, en el método getValue() puedes poner 'html' en lugar de 'plain'

Espero que te sea de utilidad y como dicen los gringos: Happy coding!

lunes, 13 de agosto de 2012

Magento: Cómo reducir el tamaño de los archivos PDF

Para reducir el tamaño de los archivos PDF que genera Magento, tales como las facturas (invoices), pedidos (orders), etc. se necesita usar una fuente (fonts) diferentes a las predeterminadas.

Los archivos PDF generados por Magento tienen un tamaño alrededor de 1.5 MB, esto se debe a que la fuente predeterminada es /lib/LinLibertineFont/LinLibertineC_Re-2.8.0.ttf

La cual por sí misma pesa 1.5 MB. La solución es reemplazar esta fuente por alguna estándar de Zend_Pdf, para hacer esto, solamente abre el archivo app/code/core/Mage/Sales/Model/Order/Pdf/Abstract.php

Busca la siguiente línea:

$font = Zend_Pdf_Font::fontWithPath(Mage::getBaseDir() . '/lib/LinLibertineFont/LinLibertineC_Re-2.8.0.ttf');
#
#

Y reemplázala con:

$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
#
#

Esto reducirá hasta en un 90% el tamaño de los archivos PDF generados en Magento

Si deseas aumentar el tamaño de las fuentes para las facturas, direcciones de envío, etc., puedes cambiar las líneas:

protected function _setFontRegular($object, $size = 7)
protected function _setFontBold($object, $size = 7)
protected function _setFontItalic($object, $size = 7)

Por:

protected function _setFontRegular($object, $size = 9)
protected function _setFontBold($object, $size = 9)
protected function _setFontItalic($object, $size = 9)

Como podrás ver, hemos tocado el core de Magento, para preservar las modificaciones para futuras actualizaciones de Magento, puedes colocar este código en app/local/Mage/Sales/Model/Order/Pdf/Abstract.php, pero toma en cuenta que con el simple hecho de colocarlo en esta carpeta no quiere decir que vas a sobreescribir la clase, sino que simplemente es a manera de "backup" para que sepas que ahí puedes recolectar los cambios hechos al core de Magento cuando hagas una actualización de versión y repetir estos pasos para un futuro.

Ahora bien, si no quieres tocar el core de Magento, puedes extender la clase app/code/core/Mage/Sales/Model/Order/Pdf/Abstract.php y entonces sobreescribir los métodos arriba mencionados. Por el momento no voy a tocar el tema de cómo extender módulos en Magento, pero te dejo unos links en inglés que te pueden servir:

http://blog.chapagain.com.np/magento-block-controller-model-helper-override/

http://blog.theunical.com/ecommerce/shopping-carts/magento-cart/magento-how-to-create-a-custom-plugin-module-example-tutorial/

http://www.webspeaks.in/2010/07/create-your-first-magento-module.html

 

Artículo original:
http://www.magpleasure.com/blog/change-fonts-and-reduce-file-size-for-pdf-invoice-in-magento.html

martes, 24 de julio de 2012

Magento: Cómo crear un helper

La creación de un helper en Magento es muy simple, lo que sí es muy importante, es tener cuidado en el uso de las mayúsculas y minúsculas, así como en el uso de comentarios en los archivos xml.

Este artículo también pretende ser un breve tutorial para comprender el porqué de las cosas.

1) Hay que crear un módulo para alojar nuestro helper, para ello, necesitamos crear un nuevo archivo en la carpeta app/etc/modules/ el cual llamaremos Micodigo.xml

Poner el siguiente código dentro:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Micodigo_Mihelper>
            <codePool>local</codePool>
            <active>true</active>
        </Micodigo_Mihelper>
    </modules>
</config>

Micodigo representa un espacio de nombres (Namespace) en donde podemos colocar uno o varios módulos nuestros.

Mihelper representa el nombre de nuestro módulo

En el nodo codePool, local significa que nuestro módulo es exclusivamente para nuestra necesidad específica (en Magento, community es por lo general para los plug-ins libres o comerciales que la comunidad de Magento desarrolla y resuelven problemas más comunes, y core significaría que este módulo es de la plataforma de Magento)

2) Crear el directorio app/code/local/Micodigo/Mihelper/etc/ y crear el archivo config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Micodigo_Mihelper>
            <version>1.0.0</version>
        </Micodigo_Mihelper>
    </modules>
    
    <global>
        <helpers>
            <mihelper>
                <class>Micodigo_Mihelper_Helper</class>
            </mihelper>
        </helpers>
    </global>
</config>

3) Crear la carpeta app/code/local/Micodigo/Mihelper/Helper/ y crear el archivo Data.php

<?php
class Micodigo_Mihelper_Helper_Data extends Mage_Core_Helper_Abstract
{

    public function test()
    {
        return 'Hola mundo' ."\n";
    }

}

4) Usar el helper de la siguientes maneras:

echo Mage::helper('mihelper')->test();
$helper = Mage::helper('mihelper')
echo $helper->test();

O si lo prefieres, puedes probarlo desde el shell, ya sea que hayas iniciado una sesión por SSH en linux:

1) Crear un archivo test.php en la carpeta raíz de Magento, y poner este código:

<?php
require 'app/Mage.php';
Mage::App('default');
if (!Mage::isInstalled()) {
    echo "Application is not installed yet, please complete install wizard first.";
    exit;
}

$_SERVER['SCRIPT_NAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_NAME']);
$_SERVER['SCRIPT_FILENAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_FILENAME']);
ini_set('display_errors', '1');

require 'Mage/Core/Helper/Data.php';
echo Mage::helper('mihelper')->test();

2) Ejecutarlo desde el prompt de linux, con un comando como este (hay que tomar en cuenta que la ubicación del archivo php binario varía según la distribucion de linux que estés usando, en este caso es con CentOS 6):

/usr/bin/php ./test.php

martes, 17 de julio de 2012

Magento: Obtener información de la tienda

Guía rápida para obtener en Magento los datos de al tienda (store id, store name, store code, website id, name, is active, home url).

// Obtener el store Id
echo Mage::app()->getStore()->getStoreId();

// Obtener el store code
echo Mage::app()->getStore()->getCode();

// Obtener el website Id
echo Mage::app()->getStore()->getWebsiteId();

// Obtener el nombre de la tienda
echo Mage::app()->getStore()->getName();

// Saber si la tienda está activa
echo Mage::app()->getStore()->getIsActive();

// Obtener la URL home de la tienda
echo Mage::app()->getStore()->getHomeUrl();

// O si prefieres obtener el objeto con la colección de datos de la tienda
$storeData = Mage::app()->getStore();
echo $storeData->getStoreId();
echo $storeData->getCode();
echo $storeData->getWebsiteId();
echo $storeData->getName();
echo $storeData->getIsActive();
echo $storeData->getHomeUrl();



Artículo original:
http://blog.chapagain.com.np/magento-get-store-information/

Autor: Mukesh Chapagain

martes, 6 de marzo de 2012

Magento: ¿Como obtener el ruteador, módulo, controlador y acción?

Guía rápida para obtener en Magento los nombres del ruteador (router), módulo (module), controlador (controller) y acción (action) tanto en templates (.phtml) como en cualquier clase (class).

En los templates: $this->getRequest()
  • $this->getRequest()->getRouteName();
  • $this->getRequest()->getModuleName();
  • $this->getRequest()->getControllerName();
  • $this->getRequest()->getActionName();

Datos personales

Mi foto
Podrás encontrar códigos recursos y artículos sobre PHP, JavaScript, jQuery, MooTools, Ajax, CSS, HTML, UML, RUP, AUP, XP (eXtreme Programming), Six-Sigma, CMMI, FrameWorks, Zend Framework, Magento, CodeIgniter, CakePHP, Joomla 1.5, Doctrine, Active Record, ORM, POO, MVC, MySql, PostgreSql. Este espacio está destinado a ayudar y compartir un poco de lo mucho que he recibido de la comunidad en la Red.