Supprimer les étapes d'expédition dans Onepage Checkout

14

J'utilise CE 1.9.1.0.

J'essaie de supprimer les étapes Informations sur l'expédition et Méthode d'expédition de la commande à la page, mais sans succès.

Peut-être que quelqu'un pourrait m'aider ou me diriger dans la bonne direction?

JackWhite
la source
Le lien ci-dessus est pour le paiement en continu.
inrsaurabh

Réponses:

33

Voici ce que j'ai fait.
J'ai supprimé l'étape d'expédition et utilisé une méthode d'expédition par défaut qui, je le sais, sera toujours disponible.
Je ne sais pas si c'est ce dont vous avez besoin, mais vous pouvez au moins l'utiliser comme point de départ.
Voici mon idée.
J'ai créé un nouveau module avec un enable/disableparamètre de configuration de l'étape d'expédition, vous pouvez donc toujours réactiver l'étape d'expédition à partir de la system->configurationsection.

Créez donc le module StackExchange_Checkout.
Vous aurez besoin des fichiers suivants.

app/etc/modules/StackExchange_Checkout.xml - le dossier de déclaration

<?xml version="1.0"?>
<config>
    <modules>
        <StackExchange_Checkout>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Checkout />
            </depends>
        </StackExchange_Checkout>
    </modules>
</config>

app/code/local/StackExchange/Checkout/etc/config.xml- le fichier de configuration dans lequel vous définissez les modèles, les blocs et réécrivez le bloc de paiement en une page. Il définit également une méthode d'expédition par défaut.

<?xml version="1.0"?>
<config>
    <modules>
        <StackExchange_Checkout>
            <version>0.0.1</version>
        </StackExchange_Checkout>
    </modules>
    <global>
        <blocks>
            <checkout>
                <rewrite>
                    <onepage>StackExchange_Checkout_Block_Onepage</onepage><!-- rewrite the onepage chackout block -->
                </rewrite>
            </checkout>
        </blocks>
        <helpers>
            <stackexchange_checkout>
                <class>StackExchange_Checkout_Helper</class>
            </stackexchange_checkout>
        </helpers>
        <models>
            <stackexchange_checkout>
                <class>StackExchange_Checkout_Model</class>
            </stackexchange_checkout>
        </models>
    </global>
    <default>
        <checkout>
            <options>
                <hide_shipping>1</hide_shipping>
                <default_shipping>tablerate_bestway</default_shipping><!-- set the default shipping method code -->
            </options>
        </checkout>
    </default>
    <frontend>
        <routers>
            <checkout>
                <args>
                    <modules>
                        <StackExchange_Checkout before="Mage_Checkout">StackExchange_Checkout</StackExchange_Checkout>
                    </modules>
                </args>
            </checkout>
        </routers>
        <translate>
            <modules>
                <StackExchange_Checkout>
                    <files>
                        <default>StackExchange_Checkout.csv</default>
                    </files>
                </StackExchange_Checkout>
            </modules>
        </translate>
    </frontend>
</config>

app/code/local/StackExchange/Checkout/etc/system.xml - le fichier système qui place le drapeau activé / désactivé pour l'étape d'expédition

<?xml version="1.0"?>
<config>
    <sections>
        <checkout>
            <groups>
                <options>
                    <fields>
                        <hide_shipping translate="label" module="stackexchange_checkout">
                            <label>Hide shipping method step</label>
                            <frontend_type>select</frontend_type>
                            <source_model>adminhtml/system_config_source_yesno</source_model>
                            <sort_order>100</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </hide_shipping>
                        <default_shipping translate="label" module="stackexchange_checkout">
                            <label>Default shipping method code</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>110</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </default_shipping>
                    </fields>
                </options>
            </groups>
        </checkout>
    </sections>
</config>

app/code/local/StackExchange/Checkout/Helper/Data.php - l'aide qui vérifie si l'étape d'expédition doit être désactivée

<?php
class StackExchange_Checkout_Helper_Data extends Mage_Core_Helper_Abstract 
{
    const XML_HIDE_SHIPPING_PATH = 'checkout/options/hide_shipping';
    const XML_DEFAULT_SHIPPING_PATH = 'checkout/options/default_shipping';
    public function getHideShipping()
    {
        if (!Mage::getStoreConfigFlag(self::XML_HIDE_SHIPPING_PATH)){
            return false;
        }
        if (!$this->getDefaultShippingMethod()){
            return false;
        }
        return true;
    }
    public function getDefaultShippingMethod()
    {
        return Mage::getStoreConfig(self::XML_DEFAULT_SHIPPING_PATH);
    }
}

app/code/local/StackExchange/Checkout/Block/Onepage.php - le bloc de paiement écrasé

<?php
class StackExchange_Checkout_Block_Onepage extends Mage_Checkout_Block_Onepage 
{
    protected function _getStepCodes()
    {
        if (!Mage::helper('stackexchange_checkout')->getHideShipping()){
            return parent::_getStepCodes();
        }
        return array_diff(parent::_getStepCodes(), array('shipping_method'));
    }
}

app/code/local/StackExchange/Checkout/controllers/OnepageController.php - remplacer le contrôleur onepage pour définir automatiquement la méthode d'expédition par défaut.

<?php
require 'Mage/Checkout/controllers/OnepageController.php';
class StackExchange_Checkout_OnepageController extends Mage_Checkout_OnepageController
{
    public function saveBillingAction()
    {
        if (!Mage::helper('stackexchange_checkout')->getHideShipping()){
            parent::saveBillingAction();
            return;
        }

        if ($this->_expireAjax()) {
            return;
        }
        if ($this->getRequest()->isPost()) {
            $data = $this->getRequest()->getPost('billing', array());
            $customerAddressId = $this->getRequest()->getPost('billing_address_id', false);

            if (isset($data['email'])) {
                $data['email'] = trim($data['email']);
            }
            $result = $this->getOnepage()->saveBilling($data, $customerAddressId);

            if (!isset($result['error'])) {
                /* check quote for virtual */
                if ($this->getOnepage()->getQuote()->isVirtual()) {
                    $result['goto_section'] = 'payment';
                    $result['update_section'] = array(
                        'name' => 'payment-method',
                        'html' => $this->_getPaymentMethodsHtml()
                    );
                } elseif (isset($data['use_for_shipping']) && $data['use_for_shipping'] == 1) {
                    //add default shipping method
                    $data = Mage::helper('stackexchange_checkout')->getDefaultShippingMethod();
                    $result = $this->getOnepage()->saveShippingMethod($data);
                    $this->getOnepage()->getQuote()->save();
                    /*
                    $result will have erro data if shipping method is empty
                    */
                    if(!$result) {
                        Mage::dispatchEvent('checkout_controller_onepage_save_shipping_method',
                            array('request'=>$this->getRequest(),
                                'quote'=>$this->getOnepage()->getQuote()));
                        $this->getOnepage()->getQuote()->collectTotals();
                        $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));

                        $result['goto_section'] = 'payment';
                        $result['update_section'] = array(
                            'name' => 'payment-method',
                            'html' => $this->_getPaymentMethodsHtml()
                        );
                    }


                    $result['allow_sections'] = array('shipping');
                    $result['duplicateBillingInfo'] = 'true';
                } else {
                    $result['goto_section'] = 'shipping';
                }
            }

            $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
        }
    }
    public function saveShippingAction()
    {
        if (!Mage::helper('stackexchange_checkout')->getHideShipping()){
            parent::saveShippingAction();
            return;
        }
        if ($this->_expireAjax()) {
            return;
        }
        if ($this->getRequest()->isPost()) {
            $data = $this->getRequest()->getPost('shipping', array());
            $customerAddressId = $this->getRequest()->getPost('shipping_address_id', false);
            $result = $this->getOnepage()->saveShipping($data, $customerAddressId);

            $data = Mage::helper('stackexchange_checkout')->getDefaultShippingMethod();
            $result = $this->getOnepage()->saveShippingMethod($data);
            $this->getOnepage()->getQuote()->save();

            if (!isset($result['error'])) {
                $result['goto_section'] = 'payment';
                $result['update_section'] = array(
                    'name' => 'payment-method',
                    'html' => $this->_getPaymentMethodsHtml()
                );
            }
            $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
        }
    }
}

Videz le cache et vous avez terminé.

Marius
la source
Je viens de l'implémenter, mais un message m'indique que ma méthode d'expédition n'est pas valide?
Vince Pettit
@VincePettit. J'ai indiqué dans la réponse que j'utilisais par défaut une méthode d'expédition toujours disponible dans mon cas. Peut-être que la méthode d'expédition que vous utilisez n'est pas toujours disponible.
Marius
Comment désactiver les informations d'expédition?
Magento 2
@Manojkothari je ne sais pas.
Marius
@Manojkothari si vous ajoutez un produit car les informations d'expédition de produit virtuel et la sélection d'expédition n'apparaîtront pas
Butterfly
7

Faites de votre produit un produit virtuel et il sera automatiquement supprimé.

Siddharth Vaghasia
la source
1
Notez que dans ce cas, vous devrez changer tous les produits du site en virtuels, ce qui est une folle quantité de travail et fonctionnera probablement causant des problèmes avec d'autres processus Magento standard.
David Manners
2
Idéalement, c'est la bonne chose à faire si vous ne voulez pas que les informations d'expédition soient collectées car c'est à cela que sert le produit virtuel et je ne pense pas que cela causera des problèmes avec d'autres processus standard.
Siddharth Vaghasia
Cela vaut également pour les produits téléchargeables. Voyez ici .
quickshiftin
7

J'ai une meilleure solution que celle de @marius qui n'a besoin d'aucune réécriture.

Vous devez toujours créer votre propre module, il y a des tonnes de tutoriels pour ça donc je ne l'expliquerai pas ici. Vous devez créer un observateur et le déclencher via le config.xml. Vous devrez peut-être adapter le modèleapp/design/frontend/base/default/template/checkout/onepage.phtml

Dans votre config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Namepace_Module>
            <version>1.0.0</version>
        </Namepace_Module>
    </modules>

    ....

    <frontend>
        <events>
            <controller_action_postdispatch_checkout_onepage_saveBilling>
                <observers>
                    <namespace_module_skip_shipping_method>
                        <type>singleton</type>
                        <class>namespace_module/observer</class>
                        <method>controllerActionPostdispatchCheckoutOnepageSaveBilling</method>
                    </namespace_module_skip_shipping_method>
                </observers>
            </controller_action_postdispatch_checkout_onepage_saveBilling>

            <controller_action_postdispatch_checkout_onepage_saveShipping>
                <observers>
                    <namespace_module_skip_shipping_method>
                        <type>singleton</type>
                        <class>namespace_module/observer</class>
                        <method>controllerActionPostdispatchCheckoutOnepageSaveBilling</method>
                    </namespace_module_skip_shipping_method>
                </observers>
            </controller_action_postdispatch_checkout_onepage_saveShipping>
        </events>
    </frontend>
</config>

Dans ton Model/Observer.php

class Namepsace_Module_Model_Observer {
/**
     * @param Varien_Event_Observer $observer
     */
    public function controllerActionPostdispatchCheckoutOnepageSaveBilling(Varien_Event_Observer $observer)
    {
        if (!Mage::helper('namespace_module')->skipShippingMethod()) {
            return;
        }

        /* @var $controller Mage_Checkout_OnepageController */
        $controller = $observer->getEvent()->getControllerAction();
        $response = Mage::app()->getFrontController()->getResponse()->getBody(true);

        if (!isset($response['default'])) {
            return;
        }

        $response = Mage::helper('core')->jsonDecode($response['default']);

        if ($response['goto_section'] == 'shipping_method') {
            $response['goto_section'] = 'payment';
            $response['update_section'] = array(
                'name' => 'payment-method',
                'html' => $this->_getPaymentMethodsHtml()
            );

            $controller->getResponse()->setBody(Mage::helper('core')->jsonEncode($response));
        }
    }

    /**
     * @return string
     * @throws Mage_Core_Exception
     */
    protected function _getPaymentMethodsHtml()
    {
        $layout = Mage::getModel('core/layout');
        $update = $layout->getUpdate();
        $update->load('checkout_onepage_paymentmethod');
        $layout->generateXml();
        $layout->generateBlocks();

        return $layout->getOutput();
    }
}
Sylvain Rayé
la source
semble moins compliqué. Existe-t-il un moyen de vérifier s'il existe plusieurs méthodes d'expédition et de ne sauter l'étape que s'il en existe une?
Bernhard Prange
Pouvez-vous donner le code complet avec explication?
Prashant Patil
-4

Je cherchais une solution plus facile depuis quelques jours car je ne voulais pas jouer avec les fichiers core de mage. J'ai donc trouvé ma propre solution.

Inspectez le div de la méthode d'expédition et recherchez le fichier css. Dans mon dossier,

"pub / static / frontend / myTheme / themeName / en_US / css / stye-m.css"

après cela, j'ai écrasé le css actuel, bien sûr j'ai fait une sauvegarde de mon fichier d'origine.

css:

.step-title, .totals.shipping.incl {display: none! important;} # checkout-shipping-method-load {display: none! important;}

Aussi, je voudrais savoir si des fichiers sont efficaces avec cette méthode. Je n'ai rencontré aucun problème jusqu'à présent.

Zeeshu
la source
1
Ce fichier est généré automatiquement par le déploiement de fichiers statiques de Magentos. Les modifications seront perdues dès que les fichiers seront à nouveau générés.
Fabian Schmengler
2
ce n'est pas une question magento 2
Jalpesh Patel