Magento Import

Wenn beim Produktimport in Magento Optionen von Multiselect-Attributen fehlen:

Auch in der Community Edition in der Version 1.9.1.0 bleibt ein Bug bestehen, der den reibungslosen Import von Multiselect-Attributen verhindert. Das Problem: Nach dem Import von Produkten mit Multiselect-Attributen fehlen an machen Stellen einige Attribut-Optionen.

Auch wenn man die verschiedenen Optionen regelkonform auf einzelne Zeilen verteilt, gehen, scheinbar zufällig bzw. ohne erkennbares Muster, einige Optionen für das eine oder andere Produkt verloren. Die Ursache hierfür ist ein Bug in der Import-Logik, bei der im Zusammenhang mit einer Stapelverarbeitung Import-Zeilen verworfen werden. Die Lösung ist die Anpassung der Klasse Mage_ImportExport_Model_Import_Entity_Product, die in  \app\code\core\Mage\ImportExport\Model\Import\Entity\Product.php definiert wird. Nach Kopie ins das local-Verzeichnis ändern wir damit in \app\code\local\Mage\ImportExport\Model\Import\Entity\Product.php:

 

1) Zeile 1279 (ausgehend von Magento CE 1.9.1.0):

 

Code alt:

$priceIsGlobal = Mage::helper('catalog')->isPriceGlobal();
$productLimit = null;
$productsQty = null;

 

Code neu:

$productLimit = null;
$productsQty = null;
$previousType = null;
$previousAttributeSet = null;
$previousAttributes = null;

 

2) Zeile 1283:

 

Code alt:


while ($bunch = $this->_dataSourceModel->getNextBunch()) {
$entityRowsIn = array();
$entityRowsUp = array();
$attributes = array();
$websites = array();
$categories = array();
$tierPrices = array();
$groupPrices = array();
$mediaGallery = array();
$uploadedGalleryFiles = array();
$previousType = null;
$previousAttributeSet = null;

 

Code neu:

while ($bunch = $this->_dataSourceModel->getNextBunch()) {
$entityRowsIn = array();
$entityRowsUp = array();
$attributes = array();
$websites = array();
$categories = array();
$tierPrices = array();
$groupPrices = array();
$mediaGallery = array();
$uploadedGalleryFiles = array();
//$previousType = null;
//$previousAttributeSet = null;

 

3) Zeile 1413:

 

Code alt:

 

try {
$attributes = $this->_prepareAttributes($rowData, $rowScope, $attributes, $rowSku, $rowStore);

 

Code neu:

 

try {
//$attributes = $this->_prepareAttributes($rowData, $rowScope, $attributes, $rowSku, $rowStore);
$attributes = $this->_prepareAttributes($rowData, $rowScope, $attributes, $rowSku, $rowStore, $previousAttributes);

 

4) Zeile 1421:

 

Code alt:

 

$this->_saveProductEntity($entityRowsIn, $entityRowsUp)
->_saveProductWebsites($websites)
->_saveProductCategories($categories)
->_saveProductTierPrices($tierPrices)
->_saveProductGroupPrices($groupPrices)
->_saveMediaGallery($mediaGallery)
->_saveProductAttributes($attributes);

 

Code neu:

 

$this->_saveProductEntity($entityRowsIn, $entityRowsUp)
->_saveProductWebsites($websites)
->_saveProductCategories($categories)
->_saveProductTierPrices($tierPrices)
->_saveProductGroupPrices($groupPrices)
->_saveMediaGallery($mediaGallery)
->_saveProductAttributes($attributes);
$previousAttributes = $attributes;

 

5) Zeile 1470:

 

Code alt:

 

protected function _prepareAttributes($rowData, $rowScope, $attributes, $rowSku, $rowStore)
{

 

Code neu:

 

//protected function _prepareAttributes($rowData, $rowScope, $attributes, $rowSku, $rowStore)
protected function _prepareAttributes($rowData, $rowScope, $attributes, $rowSku, $rowStore, $previousAttributes)
{

 

6) Zeile 1506:

 

Code alt:

 

foreach ($storeIds as $storeId) {
if ('multiselect' == $attribute->getFrontendInput()) {
if (!isset($attributes[$attrTable][$rowSku][$attrId][$storeId])) {
$attributes[$attrTable][$rowSku][$attrId][$storeId] = '';
} else {
$attributes[$attrTable][$rowSku][$attrId][$storeId] .= ',';
}

 

Code neu:

 

foreach ($storeIds as $storeId) {
if ('multiselect' == $attribute->getFrontendInput()) {
if (!isset($attributes[$attrTable][$rowSku][$attrId][$storeId])
&& isset($previousAttributes[$attrTable][$rowSku][$attrId][$storeId])) {
$attributes[$attrTable][$rowSku][$attrId][$storeId] =
$previousAttributes[$attrTable][$rowSku][$attrId][$storeId].',';
}
if (!isset($attributes[$attrTable][$rowSku][$attrId][$storeId])) {
$attributes[$attrTable][$rowSku][$attrId][$storeId] = '';
} else {
$attributes[$attrTable][$rowSku][$attrId][$storeId] .= ',';
}

 

7) Fertig. Selbst herausgefunden? Nein. Vielen vielen Dank für diese Lösung an Paul Hachmang (siehe Thread unter https://github.com/avstudnitz/AvS_FastSimpleImport/issues/69)! Getestet in Magento CE 1.9.1.0.