2010-10-03 9 views
5

Veuillez noter que cette question concerne le coût d'expédition, et non le prix. Il y a une différence importante, c'est-à-dire quel est le coût de la méthode d'expédition encourue par le propriétaire du magasin, par opposition à ce qui est payé par le client.Accès aux frais de port dans le panier et/ou la commande de Magento

La table de base de données comprend un champ shipping_tableratecost, qui est rempli dans l'objet Mage_Shipping_Model_Carrier_Tablerate au cours du procédé collectRates. Cependant, ce champ n'est accessible nulle part ailleurs dans la pile, par ex. de l'adresse d'un devis.

J'ai besoin d'accéder à cette valeur sur la page du panier, et je ne trouve pas de toute façon pour y parvenir, autre que d'instancier un objet Mage_Shipping_Model_Rate_Request à passer en collectRates(). Cela semble inutilement inefficace étant donné que les données sont déjà chargées depuis la table et devraient être accessibles.

J'ai essayé d'observer l'événement <shipping_carrier_tablerate_load/>, mais il semble que l'événement _load n'est pas généré pour ce modèle.

J'ai également essayé d'accéder au taux de la citation:

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

je peux voir la valeur calculée price, mais cost est pas présent dans ce modèle.

À ce stade, je suis à court d'idées. Toutes les suggestions reçues avec gratitude!

Merci, Jonathan

Répondre

6

Tout d'abord, essayez de ne pas trop se soucier de la performance jusqu'à ce que vous voyez quelque part un goulot d'étranglement réel. Avoir foi dans la multitude de systèmes de mise en cache. Mettre plus cyniquement, Magento est déjà un peu une bête SQL, donc si vous avez un magasin bien réglé quelques requêtes supplémentaires ne feront pas de mal. Deuxièmement, le succès de la base de données pourrait même ne pas être un problème. Le modèle shipping/rate_request ne semble pas être sauvegardé par une base de données. Si vous regardez les deux fois il est utilisé dans le code de base

Mage_Shipping_Model_Shipping::collectRatesByAddress 
Mage_Sales_Model_Quote_Address::requestShippingRates 

vous pouvez voir le modèle shipping/rate_request est instancié, et peuplé de champs déjà chargés. De plus, tous les modèles utilisés dans Mage_Shipping_Model_Carrier_Tablerate::collectRates ne chargent rien à partir d'une base de données, ils font juste des calculs. Il est admirable que vous vouliez construire quelque chose d'aussi performant que possible dans le premier tour, mais il y a trop d'interactions complexes dans un système OO moderne pour savoir par magie la façon la plus performante de faire quelque chose. Faites ce que vous devez pour obtenir les informations dont vous avez besoin et gérer les performances (si nécessaire) lors d'une maintenance (ou si vous n'êtes pas assez chanceux pour avoir une version de maintenance, quand quelqu'un de puissant dans votre organisation se moque de la vitesse Troisièmement, lorsque le système ne fournit pas l'accès à quelque chose dont vous avez besoin, c'est à cela que sert le système de dérogation de classe. Quelque chose comme

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'); 

Vous appelez fondamentalement le même code qu'avant, mais en conservant les résultats pour un accès ultérieur. À propos d'aussi sûr qu'une dérogation peut être obtenue.

+0

Merci Alan, bonne réponse.Mon souci de revenir à la base de données était que ce modèle ne semble pas passer par le processus de chargement automatique standard, d'où l'absence de l'événement '$ model_load'. J'aime l'idée d'utiliser le 'Mage :: register' pour stocker la valeur. Est-ce que 'Mage :: register' stocke globalement ou juste pour ce' checkout/session'? Si c'est global, alors j'ai besoin de vérifier que le taux qui est enregistré inclut le 'dest_zip' utilisé pour le calculer. Mais c'est un détail de mise en œuvre. –

+0

P.S. La charge de base de données pour 'tablerate' est effectuée dans' Mage_Shipping_Model_Mysql4_Carrier_Tablerate_Collection :: __ construct() 'et est raisonnablement complexe car elle implique trois tables dans la jointure. –

+2

Ah, j'ai mal compris la question. Je pensais que vous vouliez l'utiliser pour la même demande. Je suis sûr que Mage :: register est une chose par requête .. les variables globales sans violer la portée globale. Aussi, FWIW, je viens de chercher ma base de code locale 1.4 et 1.4.1 et je n'ai pas trouvé l'évènement shipping_carrier_tablerate_load n'importe où. –

Questions connexes