Pregunta

He creado un módulo de proveedor personalizado.¿Cómo puedo obtener el nombre del proveedor junto con la colección de productos?.

El mío tiene un atributo de vendedor cuyos valores provienen del módulo de proveedores.

Lo intenté

$collection = Mage::getModel('catalog/product')->getCollection()
$collection->getSelect()->join( array('tvendor'=>$this->getTable('vendor/vendor')), 'main_table.vendor = tvendor.vendor_option_id', array('tvendor.filename'));

pero no funciona.¿Dónde estoy equivocado?

¿Fue útil?

Solución

Las siguientes obras.
Me he encontrado con esto basado en la forma en que Magento ordena una colección de productos basada en un atributo que tiene opciones.Ver más detalles sobre esto en Mage_Eav_Model_Entity_Attribute_Source_Table::addValueSortToCollection y Mage_Eav_Model_Resource_Entity_Attribute_Option::addOptionValueToCollection

//===>configure the fields below based on your needs
$attributeCode = 'vendor_id'; //replace this with the attribute code that holds the vendor
//get the attribute object
$attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', $attributeCode);
//attribute id
$attributeId = $attribute->getId();
$tablePkName = 'vendor_id'; //primary key name of the vendor table
$nameField = 'name'; //vendor table name field - the one you need
//get table that holds the vendors
$table = Mage::getSingleton('core/resource')->getTableName('vendor/vendor');
//<=== end of configuration
$collection = Mage::getModel('catalog/product')->getCollection();
//add the vendor attribtue to select
$collection->addAttributeToSelect($attributeCode);
$valueTable1    = $attributeCode . '_t1';
$valueTable2    = $attributeCode . '_t2';
//perform 2 left joins in case the attribute has the scope website or store view. 
//It works even if the attribute has the scope global. this covers all the cases
$collection->getSelect()
    ->joinLeft(
        array($valueTable1 => $attribute->getBackend()->getTable()),
        "e.entity_id={$valueTable1}.entity_id"
            . " AND {$valueTable1}.attribute_id='{$attributeId}'"
            . " AND {$valueTable1}.store_id=0",
        array())
    ->joinLeft(
        array($valueTable2 => $attribute->getBackend()->getTable()),
        "e.entity_id={$valueTable2}.entity_id"
            . " AND {$valueTable2}.attribute_id='{$attributeId}'"
            . " AND {$valueTable2}.store_id='{$collection->getStoreId()}'",
        array()
    );
$valueExpr = $collection->getSelect()->getAdapter()
    ->getCheckSql("{$valueTable2}.value_id > 0", "{$valueTable2}.value", "{$valueTable1}.value");
$optionTable   = $attributeCode . '_option_value_t1';
$tableJoinCond = "{$optionTable}.{$tablePkName}={$valueExpr}";
//join with the vendor table
$collection->getSelect()
    ->joinLeft(
        array($optionTable => $table),
        $tableJoinCond,
        array($nameField));

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top