Acceder al costo de envío en el carro de Magento y / o en el proceso de pago

Tenga en cuenta que esta pregunta se refiere al costo de envío, no al precio. Existe una diferencia importante, es decir, qué cargo de $$ incurre el método de envío para el propietario de la tienda, en contraposición a lo que el cliente paga.

La tabla de base de datos shipping_tablerate incluye un campo de cost , que se rellena en el objeto Mage_Shipping_Model_Carrier_Tablerate durante el método collectRates . Sin embargo, ese campo no es accesible en ningún otro lugar de la stack, por ejemplo, desde la dirección de una cita.

Necesito acceder a ese valor en la página del carro, y no puedo encontrarlo de todos modos para lograrlo, aparte de crear una instancia de un objeto Mage_Shipping_Model_Rate_Request para pasarlo a collectRates() . Parece innecesariamente ineficaz dado que los datos ya están cargados de la tabla y deben ser accesibles.

Intenté observar el evento , pero parece que el evento _load no se lanzó para ese modelo.

También intenté acceder a la tarifa de la cita:

 $quote = Mage::getSingleton('checkout/cart')->getQuote(); $address = $quote->getShippingAddress(); $rate = $address->getShippingRateByCode($code ='tablerate_bestway'); 

Puedo ver el price calculado, sin embargo, el cost no está presente en ese modelo.

En esta etapa, me estoy quedando sin ideas. ¡Cualquier sugerencia recibida con gratitud!

Gracias, Jonathan

Primero, trate de no preocuparse demasiado por el rendimiento hasta que vea un cuello de botella real en alguna parte. Ten fe en la multitud de sistemas de almacenamiento en caché. Dicho de manera más cínica, Magento ya es un poco de una bestia SQL, así que si tienes una tienda bien ajustada, algunas consultas adicionales no dolerá.

En segundo lugar, el golpe de la base de datos podría no ser un problema. El modelo shipping/rate_request no parece estar respaldado por una base de datos. Si miras las dos veces, se usa en el código central

 Mage_Shipping_Model_Shipping::collectRatesByAddress Mage_Sales_Model_Quote_Address::requestShippingRates 

Puede ver que el modelo de shipping/rate_request se está instanciando y, luego, se ha shipping/rate_request desde campos ya cargados. Además, todos los modelos utilizados en Mage_Shipping_Model_Carrier_Tablerate::collectRates no cargan nada desde una base de datos, solo hacen cálculos.

Es admirable que desee construir algo que sea lo más eficiente posible en el primer bash, pero hay demasiadas interacciones complejas en un sistema OO moderno para conocer mágicamente la forma más efectiva de hacer algo. Haga lo que necesite para obtener la información que necesita y gestione la optimización del rendimiento (si es necesario) durante una versión de mantenimiento (o si no tiene la suerte de tener una versión de mantenimiento, cuando alguien con poder en su organización se queja de la velocidad en algún lugar )

Tercero, cuando el sistema no proporciona acceso a algo que usted necesita, para eso es el sistema de anulación de clase. Algo como

 class Package_Module_Model_Carriertablerate extends Mage_Shipping_Model_Carrier_Tablerate { public function getRate(Mage_Shipping_Model_Rate_Request $request) { $rate = parent::getRate($request); Mage::register('package_module_carriertablerates', $rate); return $rate; } } ... //later, retrieve the rate $rates = Mage::registry('package_module_carriertablerates'); 

Básicamente está llamando al mismo código que antes, pero guardando los resultados en algún lugar para un acceso posterior. Aproximadamente tan seguro como una anulación puede obtener.