Можно ли удалить этап доставки и информацию из оформления заказа в Magento для продукта с набором правил бесплатной доставки?

Для конкретного продукта у меня есть правило корзины покупок, которое делает его доставку бесплатной. Было бы логично не показывать информацию о доставке и обойти выбор способа доставки для такого товара. Есть какой-нибудь простой способ сделать это?


person jayarjo    schedule 31.08.2011    source источник
comment
Не имеет смысла пропускать поле адреса доставки, так как это физический продукт, верно? Я вижу желание пропустить выбор способа доставки, если у вас есть единственный вариант, и это бесплатная доставка. Есть ли у вас вариант использования, в котором у вас есть другие варианты, кроме бесплатных?   -  person Lee Saferite    schedule 01.09.2011
comment
Да, есть много вариантов, но для некоторых продуктов просто необходима бесплатная доставка, и было бы неплохо, если бы мы могли удалить любое упоминание о доставке из процесса оформления для таких продуктов.   -  person jayarjo    schedule 02.09.2011


Ответы (1)


Это легко сделать с помощью модуля расширения.

/app/etc/modules/YourCompany_SkipShipping.xml

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


/app/code/local/YourCompany/SkipShipping/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <YourCompany_SkipShipping>
            <version>0.0.1</version>
        </YourCompany_SkipShipping>
    </modules>
    <frontend>
        <routers>
            <checkout>
                <modules before="Mage_Checkout">YourCompany_SkipShipping<modules>
            </checkout>
        </routers>
    </frontend>
</config>


/app/code/local/YourCompany/SkipShipping/controllers/OnepageController.php

<?php
include "Mage/Checkout/controller/OnepageController.php"
class YourCompany_SkipShippingMethod_OnepageController 
    extends Mage_Checkout_OnepageController
{
    public function saveBillingAction()
    {
        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) {
                    $method = $this->getAutoShippingMethod($data, $customerAddressId);
                    if (!empty($method)) {
                        $result = $this->getOnepage()->saveShippingMethod($method);
                        if(!$result) {
                            Mage::dispatchEvent('checkout_controller_onepage_save_shipping_method', array(
                                'request'=>$this->getRequest(),
                                'quote'=>$this->getOnepage()->getQuote()
                            ));
                            $result['goto_section'] = 'payment';
                            $result['update_section'] = array(
                                'name' => 'payment-method',
                                'html' => $this->_getPaymentMethodsHtml()
                            );
                        }
                    } else {
                        $result['goto_section'] = 'shipping_method';
                        $result['update_section'] = array(
                            'name' => 'shipping-method',
                            'html' => $this->_getShippingMethodsHtml()
                        );

                        $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 ($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);

            if (!isset($result['error'])) {
                $method = $this->getAutoShippingMethod($data, $customerAddressId);
                if (!empty($method)) {
                    if(!$result) {
                        Mage::dispatchEvent('checkout_controller_onepage_save_shipping_method', array(
                            'request'=>$this->getRequest(),
                            'quote'=>$this->getOnepage()->getQuote()
                        ));
                        $result['goto_section'] = 'payment';
                        $result['update_section'] = array(
                            'name' => 'payment-method',
                            'html' => $this->_getPaymentMethodsHtml()
                        );
                    }                    
                } else {
                    $result['goto_section'] = 'shipping_method';
                    $result['update_section'] = array(
                        'name' => 'shipping-method',
                        'html' => $this->_getShippingMethodsHtml()
                    );
                }
            }
            $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
        }
    }

    public function getAutoShippingMethod($data, $customerAddressId)
    {
        // This is where you put your code to process the cart/order for orders that can auto-select shipping method

        // For now, skip
        return '';
    }
}

Я оставлю вам подробности того, как вы проверяете способ доставки, но если вы не можете понять это, оставьте комментарий, и я его тоже добавлю.

NB: все примеры основаны на Magento 1.5.

person Lee Saferite    schedule 02.09.2011
comment
Кстати, просто вопрос к вам как разработчику Magento (я уверен, что вы тот, кто) находите такой подход к расширению основной функциональности удобным или, по крайней мере, приемлемым? Я имею в виду, разве вы не думаете, что нужно писать слишком много, чтобы достичь такого малого в Magento? А что произойдет, если другие модули расширят тот же код? Есть ли какая-то система разрешения конфликтов для таких случаев? - person jayarjo; 03.09.2011
comment
То, как работает это конкретное расширение, не должно вызывать никаких проблем. Единственная проблема, которую я мог видеть, - это то, хотел ли другой модуль изменить поведение действия по выставлению счетов или доставке. Считаю ли я, что небольшая задача - это много работы? Да и нет. Это сложная задача с множеством крайних случаев. Я думаю, что Magento упрощает использование кода для решения некоторых из этих проблем, в то время как другие очень сложны. В любом случае, по мере того, как он созревает, он добавляет больше мест, в которых легко вносить изменения. - person Lee Saferite; 03.09.2011
comment
В этом случае было бы НАМНОГО проще, если бы они запускали события после обработки, но до возврата результата. Тогда мы могли бы просто прослушать событие и внести в него изменения. Это было бы очень ненавязчиво и хорошо сочеталось бы с другими модулями, поскольку связь была бы очень низкой. - person Lee Saferite; 03.09.2011