php - Magento: ¿cómo vincular la imagen configurable del producto con la imagen del producto simple?
(4)
Una solución rápida podría ser exportar su lista de productos ( Admin> Sistema> Importar / Exportar> Perfiles ), poner el nombre del archivo de imagen en la (s) columna (s) apropiada (s) para todos sus productos simples, copiar los archivos a media/import/
directorio luego importar la lista de productos modificados. Las diversas asociaciones se crearán para usted y los archivos de imagen se copiarán donde sea que necesiten estar.
Esta es la situación:
Tengo un producto configurable con varios productos simples. Estos productos simples deben tener la misma imagen de producto que el producto configurable. Actualmente tengo que subir la misma imagen a cada producto simple una y otra vez.
¿Hay alguna manera de vincular la imagen del producto configurable con los productos simples?
Algunos de mis productos tienen 30 productos simples en 1 producto configurable y es excesivo / molesto cargar la misma imagen 30 veces.
¡Espero que alguien me pueda ayudar con este problema!
¡Gracias por adelantado!
Inserte esto en su DOCROOT/app/design/frontend/<pachage>/<theme>/template/catalog/product/view/media.phtml
después de $_product = $this->getProduct();
$_parentIdArray = Mage::getModel(''catalog/product_type_configurable'')->getParentIdsByChild($_product->getId());
if(sizeof($_parentIdArray)==1 && Mage::getModel(''catalog/product'')->load($_parentIdArray[0])->getTypeId() == ''configurable''){
$_product = Mage::getModel(''catalog/product'')->load($_parentIdArray[0]);
}
Eso utilizará las imágenes que pertenecen al producto configurable padre si el producto simple tiene un único padre de tipo configurable.
EDITAR
Para usar esto en la vista de lista, abra DOCROOT/app/design/frontend/<pachage>/<theme>/template/catalog/product/list.phtml
e inserte el mismo bloque de código en 2 ubicaciones:
- línea 45 después de
<?php foreach ($_productCollection as $_product): ?>
(dentro de los envoltorios<?php ?>
) - línea 106 (aproximadamente, podría ser diferente en su tema) después de
<?php $i=0; foreach ($_productCollection as $_product): ?>
<?php $i=0; foreach ($_productCollection as $_product): ?>
Ambas ubicaciones son necesarias para tratar con la vista de cuadrícula y las versiones de vista de lista de la página.
HTH,
JD
Creo que la forma correcta de hacerlo es anular el asistente de imagen (app / core / Mage / Catalog / Helper / Image.php), para que en la función init, compruebe si tiene un producto simple, y si hacer, reemplazar eso con el producto configurable. Esto debería afectar el cambio para TODAS las plantillas.
Creo que la mejor manera es anular Catalog Image Helper (como dijo @stew). Para evitar problemas de rendimiento, podemos usar consultas sql sin procesar para recuperar el valor de imagen de los padres:
class Wfs_Catalog_Helper_Image extends Mage_Catalog_Helper_Image
{
public function init(Mage_Catalog_Model_Product $product, $attributeName, $imageFile=null)
{
parent::init($product, $attributeName, $imageFile);
if (!$product->getId() || $imageFile || $product->isConfigurable()) {
return $this;
}
$productImage = $product->getData($attributeName);
if (!$productImage || $productImage == ''no_selection'') {
// Get parent product''s attribute
$value = $this->getParentProductAttribute($product->getId(), $attributeName);
if ($value) {
$this->_getModel()->setBaseFile($value);
}
}
return $this;
}
public function getParentProductAttribute($productId, $attributeName)
{
$coreResource = Mage::getSingleton(''core/resource'');
$conn = $coreResource->getConnection(''core_read'');
$attrId = Mage::getSingleton(''eav/config'')
->getAttribute(Mage_Catalog_Model_Product::ENTITY, $attributeName)
->getId();
$select = $conn->select()
->from(array(''rel'' => $coreResource->getTableName(''catalog/product_relation'')), array())
->join(
array(''var'' => $coreResource->getTableName(''catalog_product_entity_varchar'')),
''var.entity_id = rel.parent_id'',
array(''value'')
)
->where(''rel.child_id = ?'', $productId)
->where(''var.attribute_id = ?'', $attrId);
return $conn->fetchOne($select);
}
}