2017-06-02 24 views
0

Magento 1.9.1.1からMagento 1.9.3.3にサイトをアップグレードしました。Magento1.9.3.3設定可能な製品スウォッチバグ

残念ながら、私たちのサイトは壊れているため、問題を調査しました。 エラー通知は次のとおりです。


Fatal error: Uncaught Error: Call to undefined method 

Mage_ConfigurableSwatches_Helper_Mediafallback :: attachProductChildrenAttributeMapping() /var/www/html/source/app/code/core/Mage/ConfigurableSwatches/Model/Observer.php:59スタックトレースで:#0/#1/var/www/html/source/app/code/var/www/html/source/app/code/core/Mage/Core/Model/App.php(1358):Mage_ConfigurableSwatches_Model_Observer-productListCollectionLoadAfter(オブジェクト(Varien_Event_Observer) #2/var/www/html/source/app /(/)/ CORE/Mage/Core/Application.php(1337):Mage_Core_Model_App-_callObserverMethod(オブジェクト(Mage_ConfigurableSwatches_Model_Observer)、 'productListColl ...'、オブジェクト(Varien_Event_Observer) Mage.php(448):Mage_Core_Model_App-dispatchEvent( 'catalog_block_p ... '、Array)#3 /var/www/html/source/app/code/core/Mage/Catalog/Block/Product/List.php(160):Mage :: dispatchEvent(' catalog_block_p ... ' 、Array)#4 /var/www/html/source/app/code/core/Mage/Core/Block/Abstract.php(922): のMage_Catalog_Block_Product_Li/var/www/html/source/app/code/coreコードブロックは、以下の通りであることをライン59


に/Mage/ConfigurableSwatches/Model/Observer.php。

public function productListCollectionLoadAfter(Varien_Event_Observer $observer) 
{ 
    if (!Mage::helper('configurableswatches')->isEnabled()) { // check if functionality disabled 
     return; // exit without loading swatch functionality 
    } 

    /* @var $mediaHelper Mage_ConfigurableSwatches_Helper_Mediafallback */ 
    $mediaHelper = Mage::helper('configurableswatches/mediafallback'); 

    /** @var $priceHelper Mage_ConfigurableSwatches_Helper_List_Price */ 
    $priceHelper = Mage::helper('configurableswatches/list_price'); 

    /* @var $collection Mage_Catalog_Model_Resource_Product_Collection */ 
    $collection = $observer->getCollection(); 

    if ($collection 
     instanceof Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Type_Configurable_Product_Collection) { 
     // avoid recursion 
     return; 
    } 

    $products = $collection->getItems(); 

    $mediaHelper->attachChildrenProducts($products, $collection->getStoreId()); 

    $mediaHelper->attachProductChildrenAttributeMapping($products, $collection->getStoreId()); 

    if ($priceHelper->isEnabled()) { 
     $priceHelper->attachConfigurableProductChildrenPricesMapping($products, $collection->getStoreId()); 
    } 

    $mediaHelper->attachGallerySetToCollection($products, $collection->getStoreId()); 

    /* @var $product Mage_Catalog_Model_Product */ 
    foreach ($products as $product) { 
     $mediaHelper->groupMediaGalleryImages($product); 
     Mage::helper('configurableswatches/productimg') 
      ->indexProductImages($product, $product->getListSwatchAttrValues()); 
    } 

} 

古いブロック(Magento1.9.1.0)が続きます。

public function productListCollectionLoadAfter(Varien_Event_Observer $observer) 
{ 
    if (!Mage::helper('configurableswatches')->isEnabled()) { // check if functionality disabled 
     return; // exit without loading swatch functionality 
    } 

    /* @var $helper Mage_ConfigurableSwatches_Helper_Mediafallback */ 
    $helper = Mage::helper('configurableswatches/mediafallback'); 

    /* @var $collection Mage_Catalog_Model_Resource_Product_Collection */ 
    $collection = $observer->getCollection(); 

    if ($collection 
     instanceof Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Type_Configurable_Product_Collection) { 
     // avoid recursion 
     return; 
    } 

    $products = $collection->getItems(); 

    $helper->attachChildrenProducts($products, $collection->getStoreId()); 

    $helper->attachConfigurableProductChildrenAttributeMapping($products, $collection->getStoreId()); 

    $helper->attachGallerySetToCollection($products, $collection->getStoreId()); 

    /* @var $product Mage_Catalog_Model_Product */ 
    foreach ($products as $product) { 
     $helper->groupMediaGalleryImages($product); 
     Mage::helper('configurableswatches/productimg') 
      ->indexProductImages($product, $product->getListSwatchAttrValues()); 
    } 

} 

サイト壊れた問題を解決するには、私は、System /カタログ/設定可能スウォッチ/一般設定を上の設定色見本を無効に。

次に、私たちのサイトが取得されました。もちろん、カラースウォッチ機能はもはや機能しませんでした。

この問題がコアバグかどうかを確認するために、ローカルサーバーに未処理のMagento 1.9.3.3をインストールしました。しかし、同じ問題です。

解決策はありますか?

答えて

2

にcatalog.xmlファイルにJSを追加し、我々は全体のカスタムモジュールをチェックします。

app\code\local\Mage\ConfigurableSwatches\Helper\Mediafallback.php 

新しいMagentoバージョンのMediafallback.phpが機能しないように、このカスタムモジュールが作成されました。 これは正しいオリジナルのコアPHPファイルです。

アプリの\コード\コア\メイジ\ ConfigurableSwatches \ヘルパー\ Mediafallback.php

public function attachProductChildrenAttributeMapping(array $parentProducts, $storeId, $onlyListAttributes = false) 
{ 
    /** @var $listSwatchAttr Mage_Eav_Model_Attribute */ 
    $listSwatchAttr = Mage::helper('configurableswatches/productlist')->getSwatchAttribute(); 
    $swatchAttributeIds = array(); 
    if (!$onlyListAttributes) { 
     $swatchAttributeIds = Mage::helper('configurableswatches')->getSwatchAttributeIds(); 
    } 
    if ($listSwatchAttr->getId()) { 
     $swatchAttributeIds[] = $listSwatchAttr->getId(); 
    } 
    if (empty($swatchAttributeIds)) { 
     return; 
    } 

    $parentProductIds = array(); 
    /* @var $parentProduct Mage_Catalog_Model_Product */ 
    foreach ($parentProducts as $parentProduct) { 
     $parentProductIds[] = $parentProduct->getId(); 
    } 

    $configAttributes = Mage::getResourceModel('configurableswatches/catalog_product_attribute_super_collection') 
     ->addParentProductsFilter($parentProductIds) 
     ->attachEavAttributes() 
     ->addFieldToFilter('eav_attributes.attribute_id', array('in' => $swatchAttributeIds)) 
     ->setStoreId($storeId) 
    ; 

    $optionLabels = array(); 
    foreach ($configAttributes as $attribute) { 
     $optionLabels += $attribute->getOptionLabels(); 
    } 

    // normalize to all lower case before we start using them 
    $optionLabels = array_map(function ($value) { 
     return array_map('Mage_ConfigurableSwatches_Helper_Data::normalizeKey', $value); 
    }, $optionLabels); 

    foreach ($parentProducts as $parentProduct) { 
     $mapping = array(); 
     $listSwatchValues = array(); 
     $listSwatchStockValues = array(); 

     /* @var $attribute Mage_Catalog_Model_Product_Type_Configurable_Attribute */ 
     foreach ($configAttributes as $attribute) { 
      /* @var $childProduct Mage_Catalog_Model_Product */ 
      if (!is_array($parentProduct->getChildrenProducts())) { 
       continue; 
      } 

      foreach ($parentProduct->getChildrenProducts() as $childProduct) { 

       // product has no value for attribute or not available, we can't process it 
       $isInStock = $childProduct->getStockItem()->getIsInStock(); 
       if (!$childProduct->hasData($attribute->getAttributeCode()) 
        || (!$isInStock && !Mage::helper('cataloginventory')->isShowOutOfStock())) { 
        continue; 
       } 
       $optionId = $childProduct->getData($attribute->getAttributeCode()); 

       // if we don't have a default label, skip it 
       if (!isset($optionLabels[$optionId][0])) { 
        continue; 
       } 

       // using default value as key unless store-specific label is present 
       $optionLabel = $optionLabels[$optionId][0]; 
       if (isset($optionLabels[$optionId][$storeId])) { 
        $optionLabel = $optionLabels[$optionId][$storeId]; 
       } 

       // initialize arrays if not present 
       if (!isset($mapping[$optionLabel])) { 
        $mapping[$optionLabel] = array(
         'product_ids' => array(), 
        ); 
       } 
       $mapping[$optionLabel]['product_ids'][] = $childProduct->getId(); 
       $mapping[$optionLabel]['label'] = $optionLabel; 
       $mapping[$optionLabel]['default_label'] = $optionLabels[$optionId][0]; 
       $mapping[$optionLabel]['labels'] = $optionLabels[$optionId]; 

       if ($attribute->getAttributeId() == $listSwatchAttr->getAttributeId() 
        && !in_array($mapping[$optionLabel]['label'], $listSwatchValues) 
       ) { 
        $listSwatchValues[$optionId]  = $mapping[$optionLabel]['label']; 
        $listSwatchStockValues[$optionId] = $isInStock; 
       } 
      } // end looping child products 
     } // end looping attributes 


     foreach ($mapping as $key => $value) { 
      $mapping[$key]['product_ids'] = array_unique($mapping[$key]['product_ids']); 
     } 

     if (count($listSwatchValues)) { 
      $listSwatchValues = array_replace(array_intersect_key($optionLabels, $listSwatchValues), 
       $listSwatchValues); 
     } 
     $parentProduct->setChildAttributeLabelMapping($mapping) 
      ->setListSwatchAttrValues($listSwatchValues) 
      ->setListSwatchAttrStockValues($listSwatchStockValues); 
    } // end looping parent products 
} 

また、これらの記事は、多分私たちのソリューションを助けます。

https://magento.stackexchange.com/questions/45948/how-to-use-magento-1-9-1-0-configurable-swatches-in-default-package-theme-or-a https://magento.stackexchange.com/questions/142404/configurable-swatches-not-working-after-1-9-3-upgrade

1

は、この問題を解決するためにcatalog_product_viewセクション

<action method="addJs"><script>varien/product_options.js</script></action> 
+0

申し訳ありませんが、ハズレ。同じエラーが発生しました。何か考えていますか? –

+0

最近、色見本に同じ問題があり、product_options.jsを追加して問題が解決しました。 – hardik

+0

上記を確認してくださいJSはあなたのプロジェクトに含まれていますか? – hardik

関連する問題