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