lunes, 21 de diciembre de 2015

Script de permisos para Magento

Consideraciones iniciales:


  1. El usuario y grupo de apache son "www-data".
  2. El documentroot es "/var/www/html"

sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html/ -type d -exec chmod 500 {} \;
sudo find /var/www/html/ -type f -exec chmod 400 {} \;
sudo find /var/www/html/media -type d -exec chmod 700 {} \;
sudo find /var/www/html/var   -type d -exec chmod 700 {} \;
sudo find /var/www/html/media -type f -exec chmod 600 {} \;
sudo find /var/www/html/var   -type f -exec chmod 600 {} \;
sudo chmod 600 /var/www/html/includes/config.php
sudo chmod 700 /var/www/html/includes

jueves, 22 de octubre de 2015

SHELL, FUNCIONES PARA TRABAJAR CON ARCHIVOS EN HTDOCS

Como desarrollador de software en algunas ocasiones, es necesario realizar operaciones constantes sobre archivos lo cual a  más de uno nos a costado tener que reinstalar el kernel.

En está ocasión les presento algunas funciones de mi uso personal, las cuales me han ayudado a mitigar bastante este tipo de errores, antes de presentarlas quiero hacer énfasis en lo siguiente:
"Son funciones de mi uso personal, he decidido hacerlas públicas no como una recomendación, las hago públicas para que cualquiera que las encuentre útiles y quiera usarlas las adopte, ¿y por que no? las mejore".

En Bueno comenzamos, todo el código debe ir dentro del archivo .bashrc

#ESTA VARIABLE ES EL DocumentRoot DE NUESTROS PROYECTOS
HTDOCS=/var/www/html/

#####################################################################################################
# ESTA FUNCIÓN ES USADA PARA GENERAR EL AUTOCOMPLETE DE LAS FUNCIONES SIGUIENTES.
# POR EJEMPLO LA FUNCION cdw LA CUAL SIRVE PARA ACCEDER RÁPIDAMENTE A LAS SUBCARPETAS DE HTDOCS
#####################################################################################################
function _cdw(){
  directory=$HTDOCS
  cur="${COMP_WORDS[COMP_CWORD]}"
  curb=$(echo $cur | sed 's,[^/]*$,,')
  cmd="find $directory$curb -maxdepth 1 -type d -printf %p/\n "
  opts=$($cmd | sed s:$directory:: | sed s://*$:/:)
  COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
  return 0;
}

#####################################################################################################
# SIRVE PARA ACCEDER RÁPIDAMENTE A LAS SUBCARPETAS DE HTDOCS
# AL PRESIONAR <tab> AUTOCOMPLETA CON LAS SUBCARPETAS DE HTDOCS
#####################################################################################################
function cdw(){
    cd $HTDOCS$1
}
complete -o nospace -F _cdw cdw */

#####################################################################################################
# BORRA UNA SUBCARPETA DE HTDOCS
# AL PRESIONAR <tab> AUTOCOMPLETA CON LAS SUBCARPETAS DE HTDOCS
#####################################################################################################
function delete(){
if [ -z "$1" ]
    then
    echo "I CAN'T ERASE $HTDOCS"
else
    rm -rf $HTDOCS$1
fi
}

complete -o nospace -F _cdw delete */

#####################################################################################################
# CAMBIA LOS PERMISOS A UNA SUBCARPETA DE HTDOCS
# AL PRESIONAR <tab> AUTOCOMPLETA CON LAS SUBCARPETAS DE HTDOCS
#####################################################################################################
function shmod(){
    if [ -z "$2" ]
    then
        echo "I CAN'T CHANGE MODE TO $HTDOCS"
    else
        sudo chmod -R $1 $HTDOCS$2
    fi
}

complete -o nospace -F _cdw shmod */

martes, 7 de abril de 2015


LUNUX, FEDORA

Abrir aplicación si no se esta ejecutando , y si esta ejecutandose abrirla

sh -c "if test $(wmctrl -vxa nautilus 2>&1 | wc -l) -eq 1; then nautilus; fi"
sh -c "if test $(wmctrl -vxa chrome 2>&1 | wc -l) -eq 1; then google-chrome; fi"
sh -c "if test $(wmctrl -vxa phpstorm 2>&1 | wc -l) -eq 1; then phpstorm; fi"

viernes, 18 de abril de 2014

MAGENTO: Virtual host de NGINX para MAGENTO

Precondiciones:
  1. Tener instalado y funcionando NGINX y php-fpm
Variables:
  • {serverRoot}
    • Ruta donde se encuentra nuestra tienda.
  • {serverName}
    • Nombre de nuestro servidor.
  • {codigoTienda}
    • Código en MAGENTO de la tienda.
Consideraciones:
En instalaciones multitienda y por cuestiones de rendimiento se aconseja crear un virtualhost por cada tienda.


Proceso:
En el directorio de sites_enabled de NGINX crear el archivo {serverName}, con el siguiente contenido:

server {
    listen   80;
    root {serverRoot};
    index index.php;

    server_name {serverName};

    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
        access_log        off;
        expires           30d;
        add_header Cache-Control "public";
    }

    location ^~ /app/                { deny all; }
    location ^~ /includes/           { deny all; }
    location ^~ /lib/                { deny all; }
    location ^~ /media/downloadable/ { deny all; }
    location ^~ /pkginfo/            { deny all; }
    location ^~ /report/config.xml   { deny all; }
    location ^~ /var/                { deny all; }

     location / {
         if ($uri ~ "^(.+.php)(/.+)") {
                set $path_info $1;
        }

        if (!-e $request_filename) {
            rewrite ^(.+)$ /index.php;
        }
    }

    fastcgi_param PATH_INFO $path_info;

    location ~ \.php$ {

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;

        expires        off; ## Do not cache dynamic content
        fastcgi_buffer_size 256k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_read_timeout 120;

        fastcgi_param  MAGE_RUN_CODE {codigoTienda};

    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny all;
    }

}

Recargarmos la configuración de NGINX y listo :D

sudo service nginx reload


MAGENTO: En subdirectorio de NGINX

Precondiciones:
  1. Tener funcionando NGINX con PHP
  2. Tener instalado MAGENTO como subdirectorio en el root de NGINX
Variables:
  • {miTienda}
    • Nombre del subdirectorio donde se encuentra Magento.
  • {admin}
    • Identificador del backend de nuestra tienda.
Proceso:

En el archivo de configuración de sitio de nginx, en mi caso

/etc/nginx/sites-enabled/default

Agregamos los siguientes location:

  location /{miTienda} {
        index index.php;
        try_files $uri $uri/ @handler;
        expires 30d;
        if ($uri ~ "^/index.php/{admin}.*$"){
            rewrite ^/index.php/
{admin}(.*) /{admin}$1 redirect;
        }
    }

    location ~ ^/{miTienda}/(app|includes|var|lib|media/downloadable|pkginfo|report/config.xml|var)/  {
       deny all;
    }

    location @handler { 
        rewrite / /{miTienda}/index.php; 
    }

UBUNTU: Migrar de APACHE a NGINX


Precondiciones:
  1. Tener apache funcionando
  2. Tener php5 funcionando en apache
Paso 1:
Remover apache, así sin más, sin miedo:


sudo apt-get remove apache2*


Paso 2:

Instalar php5-fpm con sus dependencias, este paso podría disparar algunos mensajes sobre algunos paquetes ya instalados:

sudo apt-get install php5-common php5-cli php5-fpm


Paso 3:
Instalamos nginx

sudo apt-get install nginx

Paso 4:
Comienzan las configuraciones :D, primero php-fpm

En el archivo:


    /etc/php5/fpm/pool.d/www.conf

 
Buscar la variable listen, que por default viene como:


    listen = 127.0.0.1:9000


La modificamos a:


    listen = /var/run/php5-fpm.sock


Tomen en cuenta el valor que asignen a listen, por que ese valor mas el prefijo "unix:" deben coincidir con la variable fastcgi_pass de nginx pues ese sera el socket por el que se comunicaran php y nginx.

 
Ahora nginx, en el arcivo:


    /etc/nginx/sites-enabled/default

Vamos primero a modificar la variable root, para no tener que mover nuestros proyectos actuales


root /var/www;

Luego de ello, buscamos el location que nos propone nginx para manejar las peticiones de php, y descomentamos las lineas necesarias para que quede algo así:


    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        # With php5-cgi alone:
        #fastcgi_pass 127.0.0.1:9000;
        # With php5-fpm:
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

  
Noten que la variable fastcgi_pass tiene el prefijo "unix:" y el valor que le dimos a la variable listen de php-fpm, si dicha condición no se cumple la configuración no funcionara.

También sugiero agregar el siguiente location, para mejorar la descarga de imágenes y contenido estático
:

    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
            access_log        off;
            expires           30d;
            add_header Cache-Control "public";
    }


Por ultimo agregamos el siguiente location, el cual impedirá el acceso a los archivos .htaccess de apache


    location ~ /\.ht {
        deny all;
    }


Bueno, al llegar a este punto solo nos queda una cosa por hacer


sudo service nginx restart

Y si todo salío como debe, visiten http://localhost y bienvendios a NGINX, y si no, como dice Kick Butowsky "Live Till It Hurts"

martes, 1 de abril de 2014

Magento: Prevenir Envío de correos

Precondiciones:

Tener la base instalada.

Evitar mandar correos a los clientes:

UPDATE customer_entity
SET email = 'some@mail.com'
WHERE email != 'other@mail.com';

Evitar mandar correos a los usuarios

UPDATE core_config_data ccd
SET ccd.value = 'some@mail.com'
WHERE ccd.value LIKE '%@%';

Evitar mandar correos sobre ordenes y carritos
UPDATE sales_flat_order
SET customer_email = 'unexistent@mail.com'
WHERE customer_email != 'finalmau@gmail.com';

UPDATE sales_flat_quote
SET customer_email = 'unexistent@mail.com'
WHERE customer_email != 'finalmau@gmail.com';

viernes, 12 de abril de 2013

Magento: Borrar Pedidos de Prueba


Otro de c&p

SET FOREIGN_KEY_CHECKS=0;

TRUNCATE `sales_flat_creditmemo`;
TRUNCATE `sales_flat_creditmemo_comment`;
TRUNCATE `sales_flat_creditmemo_grid`;
TRUNCATE `sales_flat_creditmemo_item`;
TRUNCATE `sales_flat_invoice`;
TRUNCATE `sales_flat_invoice_comment`;
TRUNCATE `sales_flat_invoice_grid`;
TRUNCATE `sales_flat_invoice_item`;
TRUNCATE `sales_flat_order`;
TRUNCATE `sales_flat_order_address`;
TRUNCATE `sales_flat_order_grid`;
TRUNCATE `sales_flat_order_item`;
TRUNCATE `sales_flat_order_payment`;
TRUNCATE `sales_flat_order_status_history`;
TRUNCATE `sales_flat_quote`;
TRUNCATE `sales_flat_quote_address`;
TRUNCATE `sales_flat_quote_address_item`;
TRUNCATE `sales_flat_quote_item`;
TRUNCATE `sales_flat_quote_item_option`;
TRUNCATE `sales_flat_quote_payment`;
TRUNCATE `sales_flat_quote_shipping_rate`;
TRUNCATE `sales_flat_shipment`;
TRUNCATE `sales_flat_shipment_comment`;
TRUNCATE `sales_flat_shipment_grid`;
TRUNCATE `sales_flat_shipment_item`;
TRUNCATE `sales_flat_shipment_track`;
TRUNCATE `sales_invoiced_aggregated`;
TRUNCATE `sales_invoiced_aggregated_order`;
TRUNCATE `log_quote`;
TRUNCATE `downloadable_link_purchased`;
TRUNCATE `downloadable_link_purchased_item`;
TRUNCATE `eav_entity_store`;

ALTER TABLE `sales_flat_creditmemo_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_payment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_status_history` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item_option` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_payment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_shipping_rate` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_track` AUTO_INCREMENT=1;
ALTER TABLE `sales_invoiced_aggregated` AUTO_INCREMENT=1;
ALTER TABLE `sales_invoiced_aggregated_order` AUTO_INCREMENT=1;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
ALTER TABLE `downloadable_link_purchased` AUTO_INCREMENT=1;
ALTER TABLE `downloadable_link_purchased_item` AUTO_INCREMENT=1;
ALTER TABLE  `eav_entity_store` AUTO_INCREMENT=1;

SET FOREIGN_KEY_CHECKS=1;

Magento: Borrar Productos de Pruebas


Simple y sencillo, un c&p

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE `catalog_product_bundle_option`;
TRUNCATE TABLE `catalog_product_bundle_option_value`;
TRUNCATE TABLE `catalog_product_bundle_selection`;
TRUNCATE TABLE `catalog_product_entity_datetime`;
TRUNCATE TABLE `catalog_product_entity_decimal`;
TRUNCATE TABLE `catalog_product_entity_gallery`;
TRUNCATE TABLE `catalog_product_entity_int`;
TRUNCATE TABLE `catalog_product_entity_media_gallery`;
TRUNCATE TABLE `catalog_product_entity_media_gallery_value`;
TRUNCATE TABLE `catalog_product_entity_text`;
TRUNCATE TABLE `catalog_product_entity_tier_price`;
TRUNCATE TABLE `catalog_product_entity_varchar`;
TRUNCATE TABLE `catalog_product_link`;
TRUNCATE TABLE `catalog_product_link_attribute`;
TRUNCATE TABLE `catalog_product_link_attribute_decimal`;
TRUNCATE TABLE `catalog_product_link_attribute_int`;
TRUNCATE TABLE `catalog_product_link_attribute_varchar`;
TRUNCATE TABLE `catalog_product_link_type`;
TRUNCATE TABLE `catalog_product_option`;
TRUNCATE TABLE `catalog_product_option_price`;
TRUNCATE TABLE `catalog_product_option_title`;
TRUNCATE TABLE `catalog_product_option_type_price`;
TRUNCATE TABLE `catalog_product_option_type_title`;
TRUNCATE TABLE `catalog_product_option_type_value`;
TRUNCATE TABLE `catalog_product_super_attribute`;
TRUNCATE TABLE `catalog_product_super_attribute_label`;
TRUNCATE TABLE `catalog_product_super_attribute_pricing`;
TRUNCATE TABLE `catalog_product_super_link`;
TRUNCATE TABLE `catalog_product_enabled_index`;
TRUNCATE TABLE `catalog_product_website`;
TRUNCATE TABLE `catalog_product_entity`;

TRUNCATE TABLE `cataloginventory_stock`;
TRUNCATE TABLE `cataloginventory_stock_item`;
TRUNCATE TABLE `cataloginventory_stock_status`;

INSERT  INTO `catalog_product_link_type`(`link_type_id`,`code`) VALUES (1,'relation'),(2,'bundle'),(3,'super'),(4,'up_sell'),(5,'cross_sell');
INSERT  INTO `catalog_product_link_attribute`(`product_link_attribute_id`,`link_type_id`,`product_link_attribute_code`,`data_type`) VALUES (1,2,'qty','decimal'),(2,1,'position','int'),(3,4,'position','int'),(4,5,'position','int'),(6,1,'qty','decimal'),(7,3,'position','int'),(8,3,'qty','decimal');
INSERT  INTO `cataloginventory_stock`(`stock_id`,`stock_name`) VALUES (1,'Default');

SET FOREIGN_KEY_CHECKS = 1;

miércoles, 23 de enero de 2013

Ubuntu: Cambiar Colores de la Terminal al Conectarse a ssh

Precondiciones:

  1. Tener autenticación por certificado rsa al servidor
 Procedimiento

  1. Crear un perfil en la terminal, desde el menu Edit > Profiles.
  2. Agregamos el siguiente alias al archivo ~/.bashrc
  • alias ALIAS="gnome-terminal --window-with-profile=PERFIL -e 'ssh USER@SERVER' &"
Donde
  1. ALIAS: Comando con el que ejecutaremos la magía desde la terminal
  2. PEFIL: Perfil de colores creado en el paso 1
  3. USER: Usuario del servidor
  4. SERVER: Servidor al que nos conectaremos.
LISTO tenemos un sistema de colores según el servidor al que estamos conectados.




 

jueves, 8 de noviembre de 2012

Constitución del Programador Espartano

1.       Al ser becario, serás medido y pesado, y si no sirves serás convertido en becario de Comercial.
2.       Desde el principio debes pensar que llegaras a ser un programador de élite
a.       Todo becario debe ser formado desde un principio para ser parte de la élite de programadores; así que:
                                                               i.      Nada de cursos.
                                                             ii.       Nada de asesorías.
                                                            iii.      Ni siquiera comentarios en el código.
b.      Todo programador espartano debe tener buen comportamiento y debe demostrar carácter y valía desde su contratación.
3.       Al llegar a programador Junior, después de haber cumplido varios requerimientos que nadie más quiere hacer, se te comenzaran a dar requerimientos más pesados y se te mostrara el significado de la frase, "Debe quedar hoy, sí ó sí...", a través de desveladas y soportar a los Comerciales.
4.       Como programador Junior no recibirás ninguna ayuda, deberás aprender a investigar e indagar las cosas por ti mismo, y además entregar las cosas en tiempo y forma.
5.       Si un programador Junior pregunta a un programador Senior se le remitirá inmediatamente a usar el puto google.
a.       El programador Senior tiene derecho a ni siquiera contestar si la pregunta es una pendejada, pues si no se es capaz de resolver una pendejada, menos podrá resolver un requerimiento avanzado.
6.       Como programador Junior debes de ser mejor que el de al lado, pues solo los mejores reciben los aumentos.
7.       Para convertirte en programador Senior se te enviara solo a una junta, en la cual debes de ser capaz de explicarle todos los puntos a un Comercial y hacer entrar en razón al cliente.
8.       A partir que eres programador Senior, tienes el derecho (más bien obligación) de someter al mismo trato a los becarios
9.       A los programadores Senior más exitosos siempre se les enfrenta entre ellos por el dominio del departamento de desarrollo.

martes, 11 de septiembre de 2012

Ubuntu: Como enviar correos desde PHP usando una cuenta de gmail


Precondiciones:

  1. Una cuenta en gmail
  2. Obvio una máquina con Ubuntu
  3. Conexión a Internet

 Paso 1: Installar nuestro "Conector"

sudo apt-get install msmtp ca-certificates

Paso 2: Configurar msmtp

Creamo el archivo:

sudo vim /etc/msmtprc

Con el contenido, antes de guardar es necesario descomentar la linea 13 o la linea 15 según tu sistema operativo:

defaults
tls on
tls_starttls on
#EN UBUNTU
#tls_trust_file /etc/ssl/certs/ca-certificates.crt
#EN FEDORA 21
#tls_trust_file /etc/pki/tls/certs/ca-bundle.crt

account default
host smtp.gmail.com
port 587
auth on
user username@gmail.com
password yourpass
from username@gmail.com
logfile /var/log/msmtp.log


Paso 3: Decirle a PHP como mandar mails

Con el editor de tu preferencia edita el php.ini que se este cargando y asignamos la siguiente variable

sendmail_path = /usr/bin/msmtp -t

Paso 4: Crear la estructura para el log

Creamos el directorio, junto con sus permisos adecuados:

sudo mkdir /var/log/msmtp
sudo chown www-data:adm /var/log/msmtp

Damos de alta el log, creando el archivo:

sudo vim /etc/logrotate.d/msmtp

Con el contenido:

/var/log/msmtp/*.log {
  rotate 12
  monthly
  compress
  missingok
  notifempty
}

Listo, si todo salio bien ya podemos enviar correos desde ubuntu, y si no pues revisa, algo omitiste :D




Magento: Bajar un sitio a tu local


Precondiciones

Tener acceso vía ssh y ftp (o sftp) al servidor del que queremos descargar el sitio.

Paso 1 Generar el backup del código

Conectarse al servidor via ssh y generar el tar.gz para nuestro backup, es recomendable omitir las carpetas de media y de var

tar -czf text.tar.gz --exclude=var/* --exclude=media/*

Paso 2 Generar el backuo de la base de datos

Generar el backup de la base de datos, este paso lo hacemos en dos comandos para evitar traer la enorme catidad de información basura guardada en las tablas de log_*
Nota: Son dos comandos cada uno debe ir en una sola linea, los pongo en multilinea para efectos ilustrativos, pero repito son dos comandos

mysqldump -u{username} -p{password} \
--databases \
--ignore-table={database}.log_customer \
--ignore-table={database}.log_quote \
--ignore-table={database}.log_summary \
--ignore-table={database}.log_summary_type \
--ignore-table={database}.log_url \
--ignore-table={database}.log_url_info \
--ignore-table={database}.log_visitor \
--ignore-table={database}.log_visitor_info \
--ignore-table={database}.log_visitor_online \
{database} > {backup_day}.sql


mysqldump -u{username} -p{password} \
--no-data \
{database} \
log_customer \
log_quote \
log_summary \
log_summary_type \
log_url \
log_url_info \
log_visitor \
log_visitor_info \
log_visitor_online \
>> {backup_day}.sql

Paso 3 Crear la base en nuestro local

Una vez descargado nuestro backup de la base de datos, lo ejecutamos en nuestro local,.
Nota: si ejecutaste  de manera adecuada los comandos anteriores ya no es necesario crear la base de datos,  por que el script la va a crear por nosotros.

mysqldump -u{username} -p{password}  < {backup_day}.sql

Paso 4 Reconfigurar las URLs

Luego de eso es necesario reconfigurar nuestras url, para ello no existe una formula exacta, pues es necesario hacer un update al campo de value de todos los registros que salgan con la siguiente consulta:

select * from core_config_data where  path in ('web/unsecure/base_url', 'web/secure/base_url');

Paso 5 Reconfigurar nuestra instalación de magento

Una vez descargado nuestro backup, lo descomprimimos y editamos en nuestro archivo app/etc/local.xml los accesos a nuestra base de datos:
Nota: si ejecutaste  de manera adecuada los comando anteriores ya no es cambiar la base de datos.
<default_setup>
<connection>
   <host><![CDATA[{local server name}]]></host>
   <username><![CDATA[{local user name}]]></username>
   <password><![CDATA[{local password}]]></password>
   <dbname><![CDATA[{database}]]></dbname>
   <active>1</active>
</connection>
</default_setup>

Si seguiste estos sencillos pasos ya deberias tener tu sitio funcionando y en linea.











lunes, 10 de septiembre de 2012

Magento: Crear transacciones

El siguiente script es para esos casos cuando es necesario trabajar de forma transaccional: 

$transaction = Mage::getModel('core/resource_transaction');
 
...

$transaction->addObject($orderObject);
$transaction->addObject($productObject);
 
...
 
$transaction->save();

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>