2011-07-05 13 views
8

En Magento, es posible obtener los productos simples asociados a un producto configurable mediante la siguiente llamada:Obtener los productos simples que pertenecen al producto configurable DESPUÉS producto configurable ahorrar

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

Estoy tratando de llamar a esta función después de guardar el producto configurable, para poder obtener la nueva lista de productos simples que utiliza. Así que estoy haciendo la llamada anterior de un método que se desencadena por el evento catalog_product_save_after. Sin embargo, después de la llamada $childProducts almacena los productos simples que estaban asociados a $product ANTES de la operación de guardar, no DESPUÉS.

¿Cómo podría obtener los productos simples asociados a $product después de la operación de almacenamiento?

Gracias de antemano, cualquier sugerencia es apreciado.

Respuesta

7

sistema de programación orientada a objetos de Magento es muy buena, y esta bondad a veces crea problemas para los que todavía no han profundizado en su estructura.

Si usted sigue de cerca el método "getUsedProducts()" en la clase "Mage_Catalog_Model_Product_Type_Configurable", se verá que hay algunos "if" lógicas proporcionan, junto con el uso de sus propiedades (como "_usedProducts", "_configurableAttributes") . Esto le impide obtener el resultado real, pero la falla no es de Magento, sino que la falla se debe a la falta de documentación de Magento.

Déjeme claro acerca de las primeras líneas de este método: -

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

Este método tiene 2 argumentos - "$requiredAttributeIds" (configurable Atributo IDS) & "$product" (configurable producto objeto).

Al llamar a este método, está pasando "null" para el parámetro "$requiredAttributeIds", pero está proporcionando el objeto de producto configurable correcto "$product".

Esta clase tiene una propiedad "_usedProducts" (para mantener los datos de productos simples para niños), que se establece para cada objeto de producto configurable. Si este valor se estableció anteriormente, Magento le devolverá los valores ya disponibles. Esta es la razón principal por la que obtiene los productos secundarios antes de que se actualizara el producto configurable.

Por lo tanto, lo que puede hacer es que se puede borrar la caché de almacenamiento completa, junto con refrescante todos los procesos de caché. Puede ser que su resultado funcione, porque internamente Magento almacena todos estos datos de productos usados ​​en el caché.

Espero que ayude.

+0

Gracias por la respuesta detallada, creo que esto tiene, al menos, me puso en el camino correcto. Intenté borrar el caché (es decir, borrar todo en var/cache) pero sigo teniendo el mismo problema. Lo extraño es que si guardo el producto configurable de nuevo, puedo ver los productos simples correctos asociados. Así que tengo que guardar dos veces para obtener el efecto que estaba buscando después de guardar una vez. También probé en busca de la clase Mage_Catalog_Model_Product_Type_Configurable como usted sugiere, pero no pudo encontrarlo en app/código/core/Mago/Catálogo/modelo/producto/Tipo/configurable. ¿Cómo lo encontraste? – Epicurus

+0

¿Qué versión de Magento estás usando? –

+6

Estoy usando Magento CE 1.5.1.0. Logré encontrar el archivo (app/code/core/Mage/Catalog/Model/Product/Type/Configurable.php). Y tenías razón, el caché era realmente el problema.Sin embargo, simplemente borrar el caché no fue suficiente. Tuve que deshacer el atributo '_cache_instance_products' explícitamente antes de llamar a' getUsedProducts() '. Hice esto usando 'Mage :: getModel ('catalog/product_type_configurable') -> getProduct ($ product) -> unsetData ('_ cache_instance_products');' – Epicurus

Cuestiones relacionadas