2011-07-05 43 views
8

Trong Magento, nó có thể để có được những sản phẩm đơn giản liên quan đến một sản phẩm cấu hình bằng cách sử dụng các cuộc gọi sau đây:Lấy sản phẩm đơn giản thuộc sản phẩm cấu hình SAU sản phẩm cấu hình tiết kiệm

$childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProducts(null, $product); 

Tôi cố gắng để gọi chức năng này sau khi sản phẩm có thể định cấu hình được lưu, để tôi có thể nhận danh sách các sản phẩm đơn giản mới mà nó sử dụng. Vì vậy, tôi đang thực hiện cuộc gọi ở trên từ một phương thức được kích hoạt bởi sự kiện catalog_product_save_after. Tuy nhiên, sau khi cuộc gọi $childProducts lưu các sản phẩm đơn giản được liên kết với $product TRƯỚC hoạt động lưu, chứ không phải sau đó.

Làm cách nào để có được các sản phẩm đơn giản được liên kết với $product sau khi thao tác lưu?

Cảm ơn trước, mọi đề xuất đều được đánh giá cao.

Trả lời

7

Hệ thống OOP của Magento rất tốt, và sự tốt lành này đôi khi tạo ra vấn đề cho những người chưa đi sâu vào cấu trúc của nó.

Nếu bạn chặt chẽ theo phương pháp "getUsedProducts()" trong lớp "Mage_Catalog_Model_Product_Type_Configurable", bạn sẽ thấy rằng có một số "if" logic cung cấp, cùng với việc sử dụng tính chất của nó (như "_usedProducts", "_configurableAttributes") . Những điều này cản trở bạn nhận được kết quả thực tế, nhưng lỗi không phải của Magento, thay vào đó lỗi là do thiếu tài liệu Magento.

Hãy để tôi rõ ràng với bạn về vài dòng đầu tiên của phương pháp này: -

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); 
    } 
    .... 

Phương pháp này có 2 đối số - "$requiredAttributeIds" (Configurable Thuộc tính ID) & "$product" (đối tượng sản phẩm cấu hình).

Khi gọi phương thức này, bạn đang chuyển "null" cho thông số "$requiredAttributeIds", nhưng bạn đang cung cấp đối tượng Sản phẩm có thể định cấu hình chính xác "$product".

Lớp này có thuộc tính "_usedProducts" (để duy trì dữ liệu của các sản phẩm đơn giản cho trẻ em), được đặt cho mọi đối tượng Sản phẩm có thể định cấu hình. Nếu giá trị này đã được đặt trước đó, thì Magento sẽ trả lại cho bạn các giá trị đã có sẵn cho bạn. Đây là lý do chính khiến bạn nhận được sản phẩm dành cho trẻ em trước khi sản phẩm có thể định cấu hình được cập nhật.

Vì vậy, những gì bạn có thể làm là bạn có thể xóa Bộ nhớ cache đầy đủ, cùng với làm mới tất cả các quy trình Cache. Có thể sau đó kết quả của bạn sẽ hoạt động, bởi vì nội bộ Magento lưu trữ tất cả các dữ liệu sản phẩm được sử dụng trong bộ nhớ cache.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn câu trả lời chi tiết, tôi nghĩ điều này ít nhất đã khiến tôi đi đúng hướng. Tôi đã thử xóa bộ nhớ cache (nghĩa là xóa mọi thứ trong var/cache) nhưng tôi vẫn gặp phải sự cố tương tự. Điều kỳ lạ là nếu tôi lưu lại sản phẩm có thể định cấu hình được, tôi có thể thấy các sản phẩm đơn giản chính xác được liên kết với nó. Vì vậy, tôi phải tiết kiệm hai lần để có được hiệu ứng tôi đang tìm kiếm sau khi lưu một lần. Tôi cũng đã cố gắng tìm kiếm các lớp Mage_Catalog_Model_Product_Type_Configurable như bạn đề nghị, nhưng không tìm thấy nó trong app/code/core/Mage/Catalog/Model/Product/Type/Configurable. Làm thế nào bạn tìm thấy nó? – Epicurus

+0

Bạn đang sử dụng phiên bản Magento nào? –

+6

Tôi đang sử dụng Magento CE 1.5.1.0. Tôi đã tìm được tập tin (app/code/core/Mage/Catalog/Model/Product/Type/Configurable.php). Và bạn đã đúng, bộ nhớ cache thực sự là vấn đề.Tuy nhiên, chỉ cần xóa bộ nhớ cache là không đủ. Tôi đã phải bỏ thuộc tính '_cache_instance_products' một cách rõ ràng trước khi gọi' getUsedProducts() '. Tôi đã làm điều này bằng cách sử dụng 'Mage :: getModel ('catalog/product_type_configurable') -> getProduct ($ product) -> unsetData ('_ cache_instance_products');' – Epicurus

Các vấn đề liên quan