Trabajando con colecciones grandes en Magento

Trabajando con colecciones grandes en Magento

Guardando atributos en colecciones grandes

En este capítulo vamos a explicar uno de los grandes problemas que nos podemos encontrar cuando estamos trabajando con Magento, las colecciones y el guardado de los datos en la base de datos, por defecto al trabajar con colecciones de datos muy grandes podemos apreciar que los tiempos de carga de nuestro ecommerce aumentan y si queremos modificar algún atributo del item de la colección puede verse afectado el performance de la página.

Generalmente se suelen hacer y guardar colecciones de la siguiente forma:


$productCollection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect(array('entity_id', 'status'));

foreach ($productCollection as $product){
$product->setStatus(Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
$product->save();
}

Esta manera es la “tradicional” de hacer un save de items que nos devuelve una colección y si trabajamos con pocos productos no encontraremos ningún problema de rendimiento, pero cuando empezamos a trabajar con 100 o hasta miles de productos nos podemos “cargar” literalmente nuestro Magento, además es muy probable que nos de un error de memoria.

Gracias al método walk de la clase Mage_Core_Model_Resource_Iterator podremos guardar muchos datos sin problema.

Primero justo después de nuestra colección vamos a llamar al método walk:


$productCollection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect(array('entity_id', 'status'));

Mage::getSingleton('core/resource_iterator')->walk($productCollection->getSelect(), array(array($this, 'productsCallback')));

Luego deberemos crear un método público en nuestra clase que será el callback que el método walk llamará para ejecutar la consulta


public function productsCallback($args){
$product = Mage::getModel('catalog/product');
$product->setData($args['row']);
$product->setStatus(Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
$product->getResource()->saveAttribute($product, 'status');
}

El argumento $args que nos llega es para hacer el mapping con el producto de Magento por su entity_id, luego seteamos el atributo status del objeto product y hacemos un saveAttribute para que se ejecute una consulta SQL solo para este atributo.

 

Esto es todo, y esperamos que sus Magento mejoren el rendimiento.

También aprovechamos por decir que Progento cuenta de unos packs de horas para todo tipo de clientes y adaptados a sus necesidades, échele un ojo al siguiente enlace para obtener más información: Paquetes de horas

Happy coding =)

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Solve : *
23 ⁄ 1 =