マゼンタのOOPシステムは非常に優れています。この優しさは、まだ構造に深く入り込んでいない人にとっては問題を引き起こすことがあります。
あなたが密接に「Mage_Catalog_Model_Product_Type_Configurable
」クラスのメソッド「getUsedProducts()
」に従うならば、あなたは(「_configurableAttributes
」、「_usedProducts
」のような)そのプロパティの使用方法とともに、提供されるいくつかの「if
」論理があることがわかります。これらは実際の結果を得るのを妨げますが、障害はMagentoではなく、代わりにMagentoのマニュアルがないためです。
このメソッドの最初の数行について、あなたは私が明らかにしてみましょう: - "$requiredAttributeIds
"(設定可能な属性のID)& "$product
"(設定可能な製品オブジェクト) -
Varien_Profiler::start('CONFIGURABLE:'.__METHOD__);
if (!$this->getProduct($product)->hasData($this->_usedProducts)) {
if (is_null($requiredAttributeIds) and is_null($this->getProduct($product)->getData($this->_configurableAttributes))) {
// If used products load before attributes, we will load attributes.
$this->getConfigurableAttributes($product);
// After attributes loading products loaded too.
Varien_Profiler::stop('CONFIGURABLE:'.__METHOD__);
return $this->getProduct($product)->getData($this->_usedProducts);
}
....
このメソッドは、2つの引数を持っています。
このメソッドを呼び出すときは、パラメータ "$requiredAttributeIds
"に "null
"を渡していますが、正しい構成可能な製品オブジェクト "$product
"を指定しています。
このクラスには、Configurable Productオブジェクトごとに設定された(子単純な製品のデータを維持するための)プロパティ "_usedProducts
"があります。この値が以前に設定されている場合、Magentoはすでに使用可能な値を返します。これは、構成可能な製品が更新される前に子製品を入手する主な理由です。
したがって、すべてのキャッシュ・プロセスをリフレッシュするとともに、キャッシュ・ストレージ全体をクリアすることができます。内部でMagentoがこれらの使用済み製品データをすべてキャッシュに保存するため、結果が有効になることがあります。
希望します。
詳細な回答をいただきありがとうございます。私はこれが少なくとも私を正しい方向に向けると思います。キャッシュをクリアしてみました(つまり、var/cache内のすべてを削除しています)が、同じ問題が発生しています。奇妙なことは、設定可能な製品を再度保存すると、関連する正しいシンプルな製品が表示されることです。だから私は一度貯蓄した後に探していた効果を得るために2回節約しなければならない。私はあなたの提案のようなMage_Catalog_Model_Product_Type_Configurableクラスを探してみましたが、app/code/core/Mage/Catalog/Model/Product/Type/Configurableで見つけられませんでした。どうやって分かったの? – Epicurus
使用しているMagentoのバージョンはどれですか? –
Magento CE 1.5.1.0を使用しています。私はファイル(app/code/core/Mage/Catalog/Model/Product/Type/Configurable.php)を見つけることができました。そして、あなたは正しいです、キャッシュは確かに問題でした。しかし、単にキャッシュをクリアするだけでは不十分でした。 'getUsedProducts()'を呼び出す前に '_cache_instance_products'属性を明示的に設定解除する必要がありました。私は 'Mage :: getModel( 'catalog/product_type_configurable') - > getProduct($ product) - > unsetData( '_ cache_instance_products'); ' – Epicurus