Tag: Magento

Magento: Cargar Modelo por distintos campos

Cuantas veces nos hemos topado con la necesidad de cargar un modelo de datos sin conocer el id en un módulo creado por nosotros. Y nativamente no encontramos la manera de hacerlo, ya que el ORM de Magento, con un modelo recién creado, solo permite la carga de modelos a través del id. Como por ejemplo:

$model = Mage::getModel('minamespace_mimodulo/modelo')->load(5);
$model->getData();

Sí necesitamos cargar un modelo por medio de otro campo, necesitamos agregar un par de métodos en nuestras clases modelos y resources models.
Supongamos que necesitamos hacer una carga del modelo a través de un campo propio, en este caso “Teléfono”. Para esto necesitamos modificar nuestra clase ubicada en:
Minamespace_Mimodulo_Model_Modelo

public function loadByTelephone($telephone){
$this->_getResource()->loadByTelephone($this, $telephone);
return $this;
}

Con esto, indicamos que necesitamos obtener datos por medio de un método del Resource Model. Posteriormente agregamos otro método a nuestro Resource Model, ubicado en:
Minamespace_Mimodulo_Model_Mysql4_Modelo

public function loadByTelephone(Entrepids_Product_Model_Enhancement_Item     $custommoduleobj, $telephone)
{
$select = $this->_getReadAdapter()->select()
->from($this->getMainTable())
->where($this->getMainTable() . '.' . 'telephone' . '=?', $telephone);
$custommodule_id = $this->_getReadAdapter()->fetchOne($select);
if ($custommodule_id)
$this->load($custommoduleobj, $custommodule_id);
return $this;
}

Con esto estamos logrando la carga de nuestro modelo de datos especificando el query que se encargará de retornar estos datos.

Ya por último, para poder hacer uso de estos datos, lo haremos de la siguiente manera:

$model= Mage::getModel('minamespace_mimodulo/modelo')->loadByTelephone($telephone);
$model->getData();

Magento: crear Credito en Tienda manualmente

store-credit

Magento Enterprise cuenta con una característica muy particular, los store credits o creditos en tienda.

Desafortunadamente el modelo del store credit solo funciona para crearlos a través del backend.

Aquí les pongo un método desarrollado por mí para poder crearlos manualmente:


public function manuallyStoreCredit($customer, $amount)
{
    $customerId = $customer->getId();
    $websiteId = $customer->getWebsiteId();
    try{
        $products = Mage::getSingleton('core/resource');
        $writeConnection = $products->getConnection('core_write');
        $readConnection = $products->getConnection('core_write');
        $writeConnection->beginTransaction();
        //Validamos que no exista una nota de credito
        $queryValidate = "SELECT COUNT(*) FROM enterprise_customerbalance WHERE         customer_id = '{$customerId}'";
        $cant = $readConnection->fetchOne($queryValidate);

        if ($cant > 0) {
            $updateBalance = "UPDATE enterprise_customerbalance SET amount = '{$amount}'  WHERE customer_id = '{$customerId}'";
            $writeConnection->query($updateBalance);
            $queryBalanceId = "SELECT balance_id FROM enterprise_customerbalance WHERE customer_id = '{$customerId}'";
            $balanceId = $readConnection->fetchOne($queryBalanceId);
            $queryHistory = "INSERT INTO enterprise_customerbalance_history (balance_id, updated_at, action, balance_amount, balance_delta, additional_info, is_customer_notified)";
            $queryHistory .= " VALUES ('{$balanceId}', CURRENT_TIMESTAMP, 1, '{$amount}', '{$amount}', 'SE ACTUALIZA NOTA DE CREDITO POR WS', '0')";
            $writeConnection->query($queryHistory);
        } else {
            $query = "INSERT INTO enterprise_customerbalance (customer_id, website_id, amount ) VALUES ('{$customerId}', '{$websiteId}', '{$amount}')";
            $writeConnection->query($query);
            $balanceId = $writeConnection->lastInsertId();
            $queryHistory = "INSERT INTO enterprise_customerbalance_history (balance_id, updated_at, action, balance_amount, balance_delta, additional_info, is_customer_notified)";
            $queryHistory .= " VALUES ('{$balanceId}', CURRENT_TIMESTAMP, 2, '{$amount}', '{$amount}', 'SE CREA NOTA DE CREDITO MANUALMENTE', '0')";
            $writeConnection->query($queryHistory);
        }
        $writeConnection->commit();
    }
    catch(Exception $e) {
        Mage::log($e);
    }
}

Magento 2

 

m2-project

La expansión en uso y popularidad de Magento en los últimos años ha ido a un ritmo bastante rápido. Gracias a eso, el equipo de desarrollo de esta plataforma se ha visto en la necesidad de acelerar el desarrollo de la siguiente versión
MAGENTO 2.
Se está trabajando en mejorar varios puntos, entre los que destacan:

  • Procesos limpios y transparentes
  • Calidad mejorada en el catalogo de productos
  • Mejoras en escalabilidad y rendimiento
  • Mejoras en cuestiones de seguridad
  • Mejoras en las Web Api’s
  • Soporte multilenguaje
  • Mejoras en la arquitectura modular
Y lo mejor de todo, Magento nos promete una curva de aprendizaje mucho menor, y mas material de referencia para los desarrolladores 😀
Otros temas muchos mas específicos de los que se nos ha hecho saber son:
Magento con Github
Ahora los desarrolladores podrán contribuir de una manera mas cercana, descargando un branch del código de Magento 2, encontrando bugs y agregando cosas nuevas. Como todos sabemos en el mundo del software libre, la clave está en la contribución.
Nueva estructura de archivos
Ha llegado el momento de olvidarnos de la estrutura app/design/frontend/base/tema . De ahora en adelante Magento2 no buscará las plantillas que no se encuentren en nuestro tema activo en base, si no que ahora Magento buscará en otro lugar, ya no existirá el tema base. En lugar de eso, la estructura de las vistas ( templates y layouts) será movida a la estructura modular. Por ejemplo:
La vista del catálogo ahora se encontrará en:
app/code/core/Mage/Catalog/view/frontend/product/view.phtml y en lugar de tener catalog.xml dentro de la carpeta /layout, ahora tendremos un archivo layout.xml dentro de cada carpeta vista del módulo.
  Esto es para tener una estructura de archivo mucho mas limpia y sencilla de comprender
Nuevos elementos en el layout

Magento2 agrega el nuevos concepto de containers:

  • Containers pueden contener bloques
  • Containers pueden contener otros containers
  • Containers pueden renderizar todos los childrens

La idea detrás de este nuevo concepto es tener una estructura lógica nueva y clara para organizar los bloques y definir secciones del layout. Los containers serán usados en su gran mayoría por el editor de diseño para poder manipular de una manera más sencilla los bloques

jQuery finalmente reemplaza a prototype

Cuando Magento comenzó, jQuery no era la libreria tan robusta que es ahora, es por esto que en aquellos años se opto por utilizar a prototype como la libreria javascript nativa para el framework. Después de mucho pedirlo por la comunidad de Magento, finalmente tendremos a jQuery como el framework nativo de javascript. Cabe mencionar, que aun contará con soporte con prototype.

Adiós a los nombres de métodos factoriales
Si te costo mucho tiempo aprenderte la manera de nombrar o hacer uso de los nombres de los métodos factoriales, te tengo una mala noticia, esto desaparecerá, a partir de Magento2, la manera en que hacemos:
Mage::getModel(‘catalog/product’) ya no funcionará, a partir de Magento2 tendremos que utilizar el nombre de la clase por completo haciéndolo de está manera:
 Mage::getModel(‘Mage_Catalog_Model_Product’) Al igual que todas las class names de las tablas eav.* Afortunadamente Magento no se olvida de su comunidad de programadores, y se han desarrollado varios métodos para realizar las migraciones sin problemas, creando una serie de herramientas ubicadas en /dev/tools/migration Las cuales buscarán todas las llamadas con el nombre factorial anterior y reemplazandolas por las nueva manera de invocarlas con el nombre de la clase completa incluyendo el namespace.
Y estos, son solo algunas de las características que nos esperan. Sigamos esperando con ansias la salida de Magento2.

Magento: Obtener las subcategorias

La manera en que podemos cargar las subcategorias en base a la id de una categoría que conozcamos, lo hacemos de la siguiente manera.

$children = Mage::getModel('catalog/category')->getCategories($_category->getId()); 
foreach ($children as $category){
    $cat = Mage::getModel('catalog/category')->load($category->getId()); ?>
    // En caso de que queramos imprimir la imagen thumbnail
    // echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA) . 'catalog' . '/' . 'category/' .$cat->getThumbnail();
    echo $cat->getName();
}

Saludos

Magento: Obtener los productos mas vendidos

Para poder obtener una colección de los productos mas vendidos, simplemente hacemos una clase como la siguiente:

<?php
class Mage_Catalog_Block_Product_Bestseller extends Mage_Catalog_Block_Product_Abstract
{
    public function __construct()
    {
    parent::__construct();

    $storeId = Mage::app()->getStore()->getId();

    $products = Mage::getResourceModel('reports/product_collection')
        ->addOrderedQty()
        //->addAttributeToSelect('*')
        ->addAttributeToSelect(array('name', 'price', 'small_image', 'short_description', 'description'))       
        ->setStoreId($storeId)
        ->addStoreFilter($storeId)
        ->setOrder('ordered_qty', 'desc'); //Los mas vendidos arriba

    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);

    $this->setProductCollection($products);

    }
}

Saludos.

Magento: Obtener nombre del método de Pago

Para obtener el método de pago actual, de una orden o de un quote, lo hacemos de la siguiente manera:

$payment = $order->getPayment()->getMethodInstance()->getTitle();

O si queremos obtener el código del método de pago:

$payment = $order->getPayment()->getMethodInstance()->getCode();