Crear un Observer en Magento

 

Magento

En Magento tenemos lo que se llaman eventos, se ejecuta antes o después de una acción determinada en la tienda Magento, por ejemplo después de terminar nuestra compra.

Estas llamadas se realizan con un método que se llama en las funciones que despachan tal evento:

Mage::dispatchEvent($evento, array $data);

No haría falta llamar este método, ya que Magento posee un listado predefinido.

Lo más fácil para entender esto y ver su utilidad, es con un ejemplo:

EJEMPLO

La idea, es que cuando se ejecute el observer “sales_order_payment_place_end”, después de hacer un pago correcto, se ejecute nuestro código, que en este caso tan solo guardara en el Log de Magento, la id de la orden, y el total. Tendremos que que añadir nuestro pequeño módulo en app/code/ “comumunity” o “local”, community si tu interés es compartirlo con otros usuario, si es algo particular, en “local”.

Es muy importante como crear tu directorio de carpetas para magento, al final del este post adjunto el ejemplo completo, para tener más claro el árbol de directorios.

Otro de los aspectos importantes a tener en cuenta, es el archivo config.xml, donde definiremos el nombre del observer de Magento, también definiremos, la clase y el método que ejecutaremos, cuando se lance el observer.


    
        
            1.0
        
    
    
        
            
                
                    
                        singleton
                        Pay_Order_Model_Observer
                        orderView
                    
                
            
        
    

 

Ya solo nos queda crear nuestro observer, con nuestro método, de una forma muy sencilla.

getEvent();
    $order = $event->getOrder();
    
    Mage::log('orden id: ' . $order->getRealOrderId() . ' total:' . $order->getGrandTotal(););
    return $this;


  }

}

?>

 
Nos faltaría solo un pequeño paso para Magento reconozca el módulo, y es añadir un archivo en el directorio ect/modules de magento, en este caso el archivo será llamado “Invoice_Order.xml” ( tiene que ver con el nombre que hemos dado al directorio donde guardamos el módulo.



    
        
            true
            community
        
    

Ver el código en Github

Píldora – Traducción de fechas en cakephp 2.0.

 

cakePhp

Si usamos el Helper Form para construir nuestro formularios, cuando tenemos un campo fecha, los meses no salen en inglés. ¿Como traducir esto?

Primero fijarnos en el Helper Form, como están construidos los textos traducibles

__d('cake', 'January');

Viendo en el código vemos que el archivo que va a buscar las traducciones no es el default.po ( como en otras versiones de cakePhp, sino uno llamado cake.po, habría que crear este archivo con las traducciones de todos los meses o descargar el que tengo hecho.

El último paso para que esto funcione, es configurar el cakePhp para que el idioma definido sea castellano.

Para probar ponemos el siguiente código en el controlador que necesitemos esa traducción.

Configure::write('Config.language', 'spa');

Como ver título de un bloque. Drupal 7

 

Código

Buenas en el drupal 7, hay un problema bastante extendido , al hacer un module_invoke para mostrar el contenido y el título, el título siempre me viene nulo.

 
$block = module_invoke('block', 'block_view', 56); 
print $block['content']; 
print $block['subject']; // viene a null. 

 

No se sí hay otra solución, he estado buscando y nada, así que he hecho esta pequeña función sin respetar el MCV de Drupal.

 
function titleblock($id){ 
$result = db_query("SELECT bid, info from block_custom WHERE bid = ".$id); 
$data = $result->fetchColumn(1); 
return $data; } 

 

 

¿Qué es Open Graph protocol?

 

Código

¿Qué es?

Es un protocolo adoptado por muchos generadores de contenidos ( Facebook, WordPress, Youtube, Vimeo, etc..), para poder compartir su contenido de una forma social.

Esto surge por la necesidad de solucionar el problema que tenían los programadores para integrar contenido de webs externas, tenían que programar  tantas llamadas soap o rest como plataformas de contenidos quisiesen integrar, cada una con sus peculiaridades, cuando al fin y al cabo solo necesitabas siempre las misma información básica.

Ventajas para programadores

La gran ventaja, es programar una sola llamada para todo tipo de contendido que se quiera integrar en la web, o si quieres que tu web sea generadora de contenido y que los demás puedan integrar tu contenido, es muy sencillo y poco costoso.

Ejemplo en código








Más información
http://ogp.me/

Cambiar url navegador desde Ajax en cakePhp (location.hash)

 

cakePhp

Cuando usamos Ajax,  y cargamos información, no se refresca nuestra url.
A veces nos interesa que si sea así, que nuestra url cambié.

Una manera sencilla de hacerlo en cakePhp

echo $ajax->link(
‘ver Usuario’,
array(‘controller’ => ‘User’, ‘action’ => ‘ver/’.$id),

array(‘update’ => ‘ver_usuario’, ‘complete’ => ‘window.location.hash = “usuario”‘)
);

Lo que tenemos en window.location.hash es lo que luego saldrá en nuestra url tipo:  http://localhost/user/ver#usuario

Aplicaciones indispensables para Mac Os X

 

Herramientas

Ya llevo casí un año con el sistema operativo Mac Os X, y creo que puedo aventurarme a listar cuales son las aplicaciones indispensables, al menos para mí, y siempre desde el punto de vista de un programador web.

Growl
Es un simple notificador, con un buen aspecto, y muy configurable

Adium
Aplicación de mensajería instantaneta para multiples cuentas.

Dropbox
El TimeMachine está bien para copias de seguridad, pero hay ciertos documentos que quieres tener disponibles desde cualquier ordenador o dispositivo, o incluso compartilo. ( está aplicación ya la comente en el post de 11 importantes aplicaciones en la nube ).

Pomodoro
Aplicación que nos ayuda con la técnica pomodoro, ayuda a ser más productivos, a concentrarnos y tener los descansos adecuados, ya sea para trabajar o estudiar.

pomodoro

Reeader
Si eres un fan de los rss, es tu aplicación, los rss de reader de google de una manera bonita.

Things
Herramienta sencilla para ayudarnos con GTD.

Twitter for Mac
Si usas twitter, esta es una buena aplicación, incluso si tienes varias cuentas, la estoy usando ahora en vez de tweetDeck que también es una buena aplicación para varias cuentas y no solo para twitter.

Mailplane
Si usas Gmail para todas tu cuentas, siempre puedes optar por Mailplane, una aplicación para gmail, no es un indispensable hasta que te acostumbras a ella.

Mamp pro
Si desarrollas en php, el mejor servidor web para tu Mac.

Espresso
Aplicación para desarrollar web, he probado otras como Coda o TextMate, pero al final me he quedado con Espresso.


¿Crees que hay alguna aplicación más que es indispensable para mac, que debería estar en esta lista?

¡Comentalo!


FirePHP para cakePHP

 

cakePhp

Primero decir que firePHP es complemento  de firebug para firefox, ¿en que nos facilita la vida? nos ahorra tener que sacar por pantalla echos, o var_dump(), esto es extremadamente útil cuando un proyecto web en php ya está en subido, y hay usuarios conectados.

Pasos a seguir para poder utilizar firePHP en Cakephp:
He sacado la parte de como instalarlo de: http://www.utoxin.name/2009/02/cakephp-firephp/.

Requerimientos:

Vamos a preparar cakePHP para el correcto funcionamiento de firePHP.

Lo primero que debemos haces es descomprimir la biblioteca principal de firePHP que hemos descargado, dentro de la carpeta lib, copiar la carpeta FirePHPCore, en “app/vendors/”.

Copiamos el archivo dbo_source.php de “cake/lib/models/datasources” y lo pegamos en “app/models/datasources/”, buscamos dentro del archivo la función showLog() y la cambiamos por la siguiente.

function showLog($sorted = false) {
	if ($sorted) {
		$log = sortByKey($this->_queriesLog, 'took', 'desc', SORT_NUMERIC);
	} else {
		$log = $this->_queriesLog;
	}
 
	if ($this->_queriesCnt > 1) {
		$text = 'queries';
	} else {
		$text = 'query';
	}
 
	if (PHP_SAPI != 'cli') {
		$summary = "{$this->_queriesCnt} {$text} took {$this->_queriesTime} ms";
 
		$body = array();
		$body[] = array("Nr", "Query", "Error", "Affected", "Num. rows", "Took (ms)");
		foreach ($log as $k => $i) {
			$body[] = array(($k + 1), $i['query'], $i['error'], $i['affected'], $i['numRows'], $i['took']);
		}
 
		fb(array($summary, $body), FirePHP::TABLE);
	} else {
		foreach ($log as $k => $i) {
			print (($k + 1) . ". {$i['query']} {$i['error']}\n");
		}
	}
}

Ahora debemos pegar el siguiente código en “app/config/bootstrap.php”.

App :: import ( 'Vendor' , 'FirePHP' , array ( 'file' => 'FirePHPCore/FirePHP.class.php' )); 
function fb() {
	$debug = Configure::read('debug');
	if ($debug) {
		$ob_setting = ini_get('output_buffering');
		if (!$ob_setting) {
			ob_start();
		}
 
		$instance = FirePHP::getInstance(true);
		$args = func_get_args();
		return call_user_func_array(array($instance, 'fb'), $args);
	} else {
		return true;
	}
}

Ahora crearemos un componente para poderlo utilizar en todos nuestros controladores, app/controllers/components/fire_p_h_p.php y copiamos el siguiente código:

class FirePHPComponent {
	private $instance;
 
	public function __construct() {
		$ob_setting = ini_get('output_buffering');
		if (!$ob_setting) {
			ob_start();
		}
		$this->instance = FirePHP::getInstance(true);
		$this->instance->setEnabled(Configure::read('debug'));
	}
 
	public function __call($name, $args) {
		return call_user_func_array(array($this->instance, $name), $args);
	}
}

Ya estaría instalado, vamos a probarlo, primero deberiamos llamar al componente en el controlador donde queramos usarlo.

var $components = array('FirePHP');

También dejo una pequeña idea de como usarlo en el controlador.

public function index() {
                $users = $this->Users->AllUsers();
		$this->FirePHP->error($users,'array users');
	}

Estamos simulado que recogemos todos los usuarios de la base de datos en una variable $users, la salida será un array, como habíamos comentado, la idea era no tener que poner var_dump o echos. Ahora en pantalla no nos saldrá nada, pero si vamos a la consola de firebug, vermos ahí nuestra array reflejada con el nombre de error array users.

Helpers cakephp

 

cakePhp

Una de las cosas que utilizo en mis vistas en cakephp son los helpers.

¿Para que sirve?
Lo que hago yo es hacer un helper de una tématica ( ejemplo album de imagenes), asi lo tengo más organizado.

Mi controlador llama a mi vista, y la vista llama a una función el helper pasando las variables necesarias de la siguiente manera.


echo $imageHelper->viewImageComponent($image,$albums);

para que me funcione esta manera de hacerlo necesito tener creado mi helper en views/helpers/image_helper.php
y debemos también decir que vamos a usar este helper, esto lo hacemos en /app_controller.php
añadir lo siguiente, o modificarla.


class AppController extends Controller {
	var $helpers = array('Html', 'Form', 'ImageHelper');	
}

De esta manera si mi proyecto es grande, puedo estar modificando mis vistas desde un solo archivo, y tenelo más organizado.

Test Unitarios en Cakephp

 

cakePhp

Podreís ver que muchos de mis Posts son sobre cakephp, pero es sobre lo que estoy trabajando ahora mismo.

En este caso me gustaría Explicar como hacer un test unitario en un módelo y su importancia.
A mi me ayuda mucho. No se siempre, si mi modelo está bien hecho, también me ayuda a pensar en todas las funciones que necesito para ese modelo, en diferentes casos que puedo tener de respuesta, y no dar palos de ciego cuando algo no funciona.
Aunque al principio pueda parecer una perdida de tiempo hacer test unitarios, cuando la complegidad se mayor más los necesitaremos, y nos daremos cuenta de que nuestro rendimiento mejora.

Lo primero que deberemos hacer, es crear un fixture, vamos a poner un ejemplo simple, un modelo User con los campos id, name, email.

En el directorio tests/fixtures creamos el archivo user_fixtures.php
En este fichero siempre tendremos que tener la extructura de nuestra tabla, y datos con los que luego haremos nuestros tests.

ejemplo user_fixtures.php

class UserFixture extends CakeTestFixture {
	var $name = 'User';
	var $table = 'users';
	var $fields = array(
		'id' => array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 20, 'key' => 'primary'),
		'name' => array('type'=>'string', 'null' => false, 'default' => NULL, 'length' => 100),
		'email' => array('type'=>'string', 'null' => false, 'default' => NULL),
		'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1))
	);
	var $records = array(
		array(
		'id'  => 1,
		'name'  => 'usuario1',
		'email'  => 'usuario1@email.com'),
	var $records = array(
		array(
		'id'  => 2,
		'name'  => 'usuario2',
		'email'  => 'usuario2@email.com'),
	);
}

Una vez hecho el fixture, es momento de pensar en nuestros en un caso de test unitario, el primero que se me ocurre es buscar usuarios por su id.
Creamos en el directorio tests/models el archivo user.test.php, importante siempre en cake el nombre de los arhivos.
Ejemplo user.test.php

App::import('Model', 'user');

class UserTestCase extends CakeTestCase {
	var $user = null;
	var $fixtures = array('app.user');

	function startTest() {
		$this-=>User =& ClassRegistry::init('User');
	}
        function testuserInstance() {
		$this-=>assertTrue(is_a($this-=>User, 'User'));
	}
        function testfindUserId(){
	        // buscamos en el modelo user en la función findUserId la id 1.
		$friendid=$this-=>User-=>findUserId(1);
                // comparamos si el usuario el name de la busqueda, con usuario1, que debería ser true.
		$this-=>assertEqual($friendid['User']['name'],'usuario1');
	}
}

Ya tenemos Hecho un test unitario para el modelo User, ahora mismo esto nos dará Error, debemos crear la funcion findUserId() en el modelos user, aún así nos dará error, hay que hacer que esta función nuestro return sea el usuario 1 que es lo que estamos buscando.
Por cierto para poder hacer test en Cakephp debemos tener el debug del core.php a 2.