viernes, 30 de diciembre de 2011

Magento: ¿Qué poner donde?

Para saber donde va cada cosa es fácil:

Variables (Respetar las mayúsculas es importante):

{{Empresa}} Nombre de espacio dentro de ./app/code/local
{{modelo}} Nombre del modulo
{{helper}} Nombre del helper


Las peticiones, pues las peticiones deben llegar a los controllers y estos deben estar en la carpeta:
app/
code/
local/
{{Empresa}}/
{{Modulo}}/
controllers/
Los controllers deben extender la clase Mage_Core_Controller_Front_Action

Todo lo que tenga que ver con la vista, llamese grids, formularios o simples pantallas para mostrar información son bloques y van en la carpeta:
app/
code/
local/
{{Empresa}}/
{{Modulo}}/
Block/
Los bloques deben extender cualquier subtipo de Mage_Core_Block_Template

Todo lo que tenga que ver Entrada / Salida de datos es un modelo y debe ir en la carpeta:
app/
code/
local/
{{Empresa}}/
{{Modulo}}/
Model/
Los modelos deben extender cualquier subtipo de Mage_Core_Model_Abstract.
Los modelos se cargan así:
$model = Mage::getModel('{{modulo}}/{{modelo}}');

Todo lo demás, debe ser considerado como un helper, y van el a carpeta de
app/
code/
local/
{{Empresa}}/
{{Modulo}}/
Helper/
Los helpers deben extender cualquier subtipo de Mage_Core_Helper_Abstract
Los helpers se cargan así:
$model = Mage::helper('{{modulo}}/{{helper}}');

Magento: Enviar correo transaccional, con atachment y bcc

Esto muestra como manejar los correos transaccionales, así como la forma de agregar atachments y el uso del bcc en los correos transaccionales.

Precondiciones:
Tener un al menos un correo transaccional.


<?php

$transactionalMail = Mage::getModel('core/email_template')->load('Nombre del Template','template_code');
$storeId = 1;
$area = 'frontend'; //$area = 'admin';
$fromEmail = array('name' => 'CONTACT', 'email' => 'support@domain.com');
$fileName = '/path/to/some/attachment.zip';
$fileConent = file_get_contents($fileName);
$toEmail = 'customer@domain.com';
$toName = 'Customer Customer';
$vars = array('var1' => 1, 'var2' => 2);

$transactionalMail->setDesignConfig(array('area'=>$area, 'store'=>$storeId));
$transactionalMail->getMail()->createAttachment($fileConent,'application/zip')->filename = basename($fileName);
$transactionalMail->getMail()->addBcc(array('name' => 'ADMIN', 'email' => 'admin@domain.com'));

$transactionalMail->sendTransactional(
$transactionalMail->getId(),
$fromEmail,
$toEmail,
$toName,
$vars,
$storeId);

Magento: Como sobreescribir un controller

Plantilla básica de un config.xml para hacer sobreescribir un cotroller, incluye la version para sobreescribir un controller del front como la del admin.

Variables (Respetar las mayúsculas es importante):

{{Empresa}} ó {{empresa}} Nombre de espacio dentro de ./app/code/local
{{Modulo}} ó {{modulo}} Nombre del modulo dentro del nombre de espacio, debe estar dentro de ./app/code/local/{{Empresa}}
{{controller}} Nombre del modelo del controller.
{{modulonativo}} Nombre del modulo al que pertenece el controller que vamos a sobreescribir.
{{controllernativo}} Nombre del controller que vamos a sobreescribir.

Precondiciones:
    Tener declarado el modulo con el archivo ./app/etc/{{Empresa}}_{{Modulo}}.xml
    Tener ya la estructura de directorios del modulo, y el controller.
    Tener el archivo config.xml del modulo
Los conotrollers no respetan la nomenclatura standard del autoinclude de Magento, por lo que es necesario hacer un require_once
Para hacer una reutilización optima del código del core, la clase del controller debe extender a la clase del controller que vamos a sobreescribir.

<?xml version="1.0"?>
<config>
    <modules>
        <{{Empresa}}_{{Modulo}}>
            <version>0.1.1</version>
        </{{Empresa}}_{{Modulo}}>
    </modules>
    <frontend>
        <routers>
            <{{modulo}}>
                <use>standard</use>
                <args>
                    <module>{{Empresa}}_{{Modulo}}</module>
                    <frontName>{{modulo}}</frontName>
                </args>
            </{{modulo}}>
        </routers>
    </frontend>
    <admin>
        <routers>
            <{{modulo}}>
                <use>admin</use>
                <args>
                    <module>{{Empresa}}_{{Modulo}}</module>
                    <frontName>{{empresa}}{{modulo}}</frontName>
                </args>
            </{{modulo}}>
        </routers>
    </admin>
<global>
        <rewrite>
            <{{empresa}}_{{modelo}}_{{controller}}>
                <from><![CDATA[#^/{{modulonativo}}/{{controllernativo}}/#]]></from>
                <to>/{{empresa}}{{modulo}}/{{controller}}/</to>
            </{{empresa}}_{{modelo}}_{{controller}}>
        </rewrite>
</global>
</config>

viernes, 23 de diciembre de 2011

Linux: Copia y no preguntes (cp -f)

Si queremos copiar muchos archivos de un lugar a otro y que no nos pregunte si queremos sobreescribir el destino (cp: overwrite)

yes | cp -f /var/src/* /var/dest

jueves, 22 de diciembre de 2011

Magento: Como configurar un cron

Para configurar un cron usando el motor de crons de Magento se seben seguir los siguientes pasos:

Variables (Respetar las mayúsculas es importante):
    {{Empresa}} ó {{empresa}} Nombre de espacio dentro de ./app/code/local
    {{Modulo}} ó {{modulo}} Nombre del modulo dentro del nombre de espacio, debe estar dentro de ./app/code/local/{{Empresa}}
    {{modelo}} Nombre del modelo del modulo.
    {{metodo}} Nombre del metodo del modelo que se va a ejecutar.
    {{cron_name}} Nombre del cron con el que sera identificado dentro de la tabla cron_schedule.

Precondiciones:
    Tener declarado el modulo con el archivo ./app/etc/{{Empresa}}_{{Modulo}}.xml
    Tener ya la estructura de directorios del modulo, y almenos un modelo.
    Tener el archivo config.xml del modulo

En el archivo config.xml solo debemos seguir esta estructura:

<?xml version="1.0"?>
<config>
    <modules>
        <{{Empresa}}_{{Modulo}}>
            <version>0.1.0</version>
        </{{Empresa}}_{{Modulo}}>
    </modules>
...
    <global>
        <models>
            <{{modulo}}>
                <class>{{Empresa}}_{{Modulo}}_Model</class>
            </{{modulo}}>
        </models>
    </global>
...
    <crontab>
        <jobs>
            <{{cron_name}}>
                <schedule><cron_expr>0 * * * *</cron_expr></schedule>
                <run><model>{{metodo}}/{{empresa}}_{{modulo}}_{{modelo}}::{{metodo}}</model></run>
            </{{cron_name}}>
        </jobs>
    </crontab>
</config>


El valor del nodo <cron_expr>, equivale a una expresion del programa crontab de linux.

    <schedule><cron_expr>0 * * * *</cron_expr></schedule>

martes, 20 de diciembre de 2011

Magento: Como sobre cargar un bloque

Ejemplo:
Para sobre cargar este bloque:
    Mage_Adminhtml_Block_Sales_Order_Grid
  
Antes de comenzar
Empresa: significa el nombre de espacio dentro de la carpeta de
./app/code/local

Declarar un modulo nuevo si no lo tienes, para declarar el mdolulo debemos crear un archivo llamado Empresa_Adminhtml.xml en :
./app
    /etc
        /modules
            /Empresa_Adminhtml.xml
          
El contenido del archivo debe ser:
<?xml version="1.0"?>
<config>
    <modules>
        <Empresa_Adminhtml>
            <active>true</active>
            <codePool>local</codePool>
        </Empresa_Adminhtml>
    </modules>
</config>

Luego debemos configurar el modulo, para ello creamos un archivo de configuración que debe quedar en:

./app
    /code
        /local
            /Empresa
                /Adminhtml
                    /etc
                        /config.xml
                  
El contenido minímo que debe tener tu archivo config.xml es:
<?xml version="1.0" encoding="utf-8"?>
<config>
    <modules>
        <Empresa_Adminhtml>
            <version>0.1.0</version>
        </Empresa_Adminhtml>
    </modules>
    <global>
        <blocks>
            <adminhtml>
                <rewrite>
                    <sales_order_grid>Empresa_Adminhtml_Block_Sales_Order_Grid</sales_order_grid>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>
</config>
    
Ahora si creamos la clase que sobre cargara a la calse original, el archivo debe quedar en:

./app
    /code
        /local
            /Empresa
                /Adminhtml
                    /Block
                        /Sales
                            /Order
                                /Grid.php
                          
El archivo debe tener como minimo este contenido, noten que nuestra clase extiende del bloque que estamos sobrecargando, lo cual sirve para tener que implementar solo los cambios especificos en el bloque.

<?php
class Empresa_Adminhtml_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid
{
    /**
     * @todo
     */
}

Magento: No puedo entrar al backend

Cuando no se puede entrar al backend en Magento solo debes ir al archivo

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

Cerca de la linea 78 tenemos

$cookieParams = array(
            'lifetime' => $cookie->getLifetime(),
            'path'     => $cookie->getPath(),
            'domain'   => $cookie->getConfigDomain(),
            'secure'   => $cookie->isSecure(),
            'httponly' => $cookie->getHttponly()
        );

Solo lo debemos cambiar

$cookieParams = array(
            'lifetime' => $cookie->getLifetime(),
            'path'     => $cookie->getPath(),
            /*'domain'   => $cookie->getConfigDomain(),
            'secure'   => $cookie->isSecure(),
            'httponly' => $cookie->getHttponly()*/
        );