web-dev-qa-db-fra.com

Comment puis-je obtenir la méthode d'expédition choisie par l'utilisateur lors de la commande?

Je souhaite obtenir le nom du mode d'expédition choisi par l'utilisateur lors du paiement. Est-ce que quelqu'un sait comment récupérer cette information?

Cela va l'obtenir dans une certaine mesure mais il est mis en cache: 

Mage :: getSingleton ('checkout/session') -> getQuote () -> getShippingAddress () -> getShippingDescription (); 

Lorsque je suis à la caisse et que je retourne à l'onglet Expédition et que je change d'expédition, il conserve toujours l'ancienne méthode d'expédition. J'ai besoin de savoir comment obtenir l'actuel.

15
Chris

Avant-propos

Construit à partir de Magento app/code/core/Mage/Checkout/Block/Onepage/Shipping/Méthode/Available.php et autres:

app/design/frontend/base/default/template/checkout/onepage/shipping_method/available.phtml utilise ce code pour déterminer le mode d'expédition sélectionné:

$this->getAddressShippingMethod()

app/code/core/Mage/Checkout/Block/Onepage/Shipping/Method/Available.php développe ce code en ceci:

return $this->getAddress()->getShippingMethod();

Faisons des recherches et développons-le encore plus profondément:

$this->getQuote()->getShippingAddress()->getShippingMethod();

Le bloc parent développe la méthode getQuote ():

return $this->getCheckout()->getQuote();

Et plus profond:

public function getChechout() {
    return Mage::getSingleton('checkout/session');
}

La fusion de tout ce code nous donne ceci:

Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress()->getShippingMethod()

Cela vous donne le code de méthode d'expédition . Donnant cela, vous pouvez le manipuler comme bon vous semble. Ces données sont stockées dans la base de données. Par conséquent, lorsque vous modifiez la méthode d’expédition, le code change également.


De plus en plus profond!

Si vous avez déjà créé votre propre méthode d’expédition, sachez qu’elle a la méthode appelée collectRates ()

Il remplit un ensemble de modèles shipping/rate_result_method, le stocke dans l'instance de modèle shipping/rate_result et le renvoie (vous pouvez obtenir chaque instance de modèle à l'aide de Mage :: getModel (<model i 'ai nommé>);).

Pourtant, remarque: une instance peut contenir plusieurs instances de rate_result_method, alors que le code de la méthode d'expédition est le même pour toutes ces instances!

Ainsi, pour obtenir la description, vous devez obtenir l’une des instances rate_result_method et récupérer son methodTitle ou carrierTitle.

Après une petite recherche, j'ai trouvé comment récupérer tous ces taux:

Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress()->getShippingRatesCollection()

Cela vous fournira une collection de tous les tarifs pour le mode d'expédition sélectionné. Vous pouvez l'utiliser avec getItems () et obtenir un hachage. Ou vous pouvez utiliser getFirstItem () et l’utiliser comme modèle. 

Quoi qu'il en soit, supposons que vous ayez récupéré un élément de cette collection et que vous l'avez stocké dans la variable $ rate:

$rate->getCarrier(); // This will provide you with the carrier code
$rate->getCarrierTitle(); // This will give you the carrier title
$rate->getCode(); // This will give you **current shipping method** code
$rate->getMethod(); // This will provide you with the **shipping method** code
$rate->getMethodTitle(); // This will tell you current shipping method title
$rate->getMethodDescription(); // And this is the description of the current shipping method and **it could be NULL**

C'est tout, les gars!

Je suis vraiment désolé pour mon anglais médiocre et pour mon étrange flux mental. J'espère que cela vous aidera ou aidera quelqu'un d'autre. Merci!

74
shybovycha

Juste au cas où vous en auriez encore besoin. Vous pouvez obtenir le mode d'expédition à partir de la commande par:

$order->getShippingMethod();

Bien sûr, la façon dont vous obtenez votre commande $ dépend du contexte . Vous pouvez également obtenir une description par:

$order->getShippingDescription();
5
Taras
shipping method in magento

$methods = Mage::getSingleton('shipping/config')->getActiveCarriers();
$options = array();
foreach($methods as $_code => $_method)
{
    if(!$_title = Mage::getStoreConfig("carriers/$_code/title"))
        $_title = $_code;

    $options[] = array('value' => $_code, 'label' => $_title . " ($_code)");
}
echo "<xmp>";
print_r($options);
echo "</xmp>";
1
Rahul Shinde

Dans votre contrôleur de paiement, vous devez ajouter des étapes supplémentaires pour enregistrer votre devis si vous souhaitez que ces informations vous soient accessibles.
J'ai ajouté quelques '$ quote-> save ();' entrées pour que cela fonctionne, cependant, je ne peux pas dire de façon définitive quelle entrée est celle qui a fait le correctif. Je ne parviens pas non plus à trouver le lien sur les forums Magento, mais j'espère vous avoir donné une longueur d'avance sur ce qui se passe.

0
ʍǝɥʇɐɯ

Vous pouvez remplacer la fonction saveShippingMethodAction() dans le Mage_Checkout_OnepageController ou l'étendre et enregistrer la méthode dans le registre en insérant:

Mage::register('blahShippingMethod', $this->getRequest()->getPost('shipping_method'));  

et appelez-le quand vous en avez besoin: Mage::registry('blahShippingMethod');

N'oubliez pas de le désélectionner lorsque vous n'en avez plus besoin, car vous rencontrerez une erreur si vous essayez de réinitialiser une tâche alors qu'elle a déjà été définie.

Mage::unregister('blahShippingMethod');
0
Iain Ballantyne