Pregunta

Tenga en cuenta que esta pregunta está relacionada con el coste de envío, no de precio. Hay una diferencia importante, es decir, lo que cobra $$ incurra el método de envío para el dueño de la tienda, en contraposición a lo que es $$ cargo es pagado por el cliente.

La tabla de base de datos shipping_tablerate incluye un campo cost, que se rellena en el objeto Mage_Shipping_Model_Carrier_Tablerate durante el método collectRates. Sin embargo, ese campo es cualquier otra cosa no se puede acceder en la pila, por ejemplo, desde la dirección de una cotización.

Me necesidad de acceder a ese valor en la página de compra, y no puedo encontrar de todas formas para lograrlo, aparte de crear una instancia de un objeto Mage_Shipping_Model_Rate_Request a pasar a collectRates(). Eso parece innecesariamente ineficaz dado que los datos ya se carga desde la mesa y debe ser accesible.

He tratado Observando el caso <shipping_carrier_tablerate_load/>, pero parece que el evento _load no es lanzada para ese modelo.

También he intentado acceder a la velocidad de la cita:

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

I puede ver el price calculada, sin embargo cost no está presente en ese modelo.

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

Gracias, Jonathan

¿Fue útil?

Solución

En primer lugar, no se trata de preocuparse demasiado por el rendimiento hasta que vea un cuello de botella en algún lugar real. Tener fe en la multitud de sistemas de almacenamiento en caché. Poner más cínicamente, Magento ya es un poco de una bestia de SQL, así que si usted tiene una tienda bien afinado algunas consultas adicionales no le hará daño.

En segundo lugar, la exitosa base de datos puede incluso no ser un problema. El shipping/rate_request modelo no parece estar respaldado por una base de datos. Si nos fijamos en las dos veces que se utiliza en el código del núcleo

Mage_Shipping_Model_Shipping::collectRatesByAddress
Mage_Sales_Model_Quote_Address::requestShippingRates

se puede ver se crea una instancia del modelo shipping/rate_request, y luego se rellena a partir de los campos ya cargadas. Además, todos los modelos utilizados en Mage_Shipping_Model_Carrier_Tablerate::collectRates no cargan cualquier cosa, desde una base de datos, que acaba de hacer cálculos.

Es admirable que usted quiere construir algo que es tan performante como sea posible en la primera circunda, pero hay demasiados complejas interacciones en un sistema OO moderna a mágicamente saber la forma mas potente que hacer algo. Haz lo que necesita para obtener la información que necesita, y la optimización del rendimiento mango (si es necesario) durante una versión de mantenimiento (o si no eres lo suficientemente afortunado de tener versión de mantenimiento, cuando alguien con poder en su organización se queja acerca de la velocidad en alguna parte )

En tercer lugar, cuando el sistema no proporciona acceso a algo yo necesidad, que es lo que el sistema de anulación clase es para. Algo así 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, se está llamando el mismo código que antes, pero guardando los resultados en alguna parte para acceso posterior. Sobre tan seguro como una anulación puede conseguir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top