28.02.2012

Magento: Auswahl der Versandart aus dem Checkout entfernen

In meinem letzten Artikel habe ich gezeigt, wie man in Magento eine standardmässige Versandart einstellen könnte, damit der Nutzer dies im Warenkorb nicht selbst machen muss.

Falls man ohnehin nur eine Versandart anbietet, könnte man das Ganze auch noch weiter treiben und die Auswahl der Versandart komplett aus dem Checkout verbannen. Und das geht so:

Zunächst müssen wir das config.xml aus dem letzen Artikel (Einstellen einer Standard Versandart in Magento) erweitern. Im Knoten <frontend> fügen wir ein:

<routers>
     <defaultshipping>
         <use>standard</use>
         <args>
             <module>Bozoo_DefaultShipping</module>
             <frontName>defaultshipping</frontName>
         </args>
    </defaultshipping>
</routers>

Und unter <global>:

<rewrite>
    <bozoo_checkout>
        <from>#^/checkout/onepage/#</from>
        <to>/defaultshipping/onepage/</to>
    </bozoo_checkout>
</rewrite>

<blocks>
    <defaultshipping>
        <class>BozooDefaultShipping_Block</class>
    </defaultshipping>
    <checkout>
        <rewrite>
            <onepage>Bozoo_DefaultShipping_Block_Onepage</onepage>
        </rewrite>
    </checkout>
</blocks>

Jetzt haben wir Magento mitgeteilt, dass wir einen eigenen Block anstatt des Magento-Blocks Onepage.php verwenden wollen und auch einen eigenen Controller. Dazu kommen wir jetzt. Wir legen das Verzeichnis /app/code/community/Bozoo/DefaultShipping/Block an und erstellen darin die PHP Klasse mit dem Namen Onepage.php und folgendem Inhalt:

class Bozoo_DefaultShipping_Block_Onepage extends Mage_Checkout_Block_Onepage
{
    public function getSteps()
    {
        Mage::log(Mage::getStoreConfig('defaultshipping/general/remove_shipping_from_checkout'));
        if(Mage::getStoreConfig('defaultshipping/general/remove_shipping_from_checkout') == true){
            $steps = array();
 
            if (!$this->isCustomerLoggedIn()) {
                $steps['login'] = $this->getCheckout()->getStepData('login');
            }

            $stepCodes = array('billing', 'shipping', 'payment', 'review');

            foreach ($stepCodes as $step) {
                $steps[$step] = $this->getCheckout()->getStepData($step);
            }
            return $steps;
        }
        
        return parent::getSteps();
     }
 }

Das Besondere darin ist eigentlich nur, dass der Step 'shipping_method' nicht mehr in dem Array enthalten ist. Ausserdem habe ich den kompletten Code in einer IF-Abfrage geklammert, die prüft, ob es laut Konfiguration überhaupt erwünscht ist, die Auswahl der Versandart aus dem Checkout zu entfernen. D.h., wir müssen also auch noch unsere Admin-Oberfläche aus dem vorangegangenen Artikel erweitern. In der Datei system.xml im Knoten <fields> fügen wir deshalb Folgendes ein:

<remove_shipping_from_checkout translate="label comment">
    <label>Remove Shipping from Onepage Checkout</label>
    <frontend_type>select</frontend_type>
    <source_model>adminhtml/system_config_source_yesno</source_model>
    <comment>Only for Onepage Checkout</comment>
    <sort_order>3</sort_order>
    <show_in_default>1</show_in_default>
    <show_in_website>1</show_in_website>
    <show_in_store>1</show_in_store>
</remove_shipping_from_checkout>

Jetzt benötigen wir noch eine Erweiterung des Controllers. Also legen wir unter /app/code/community/Bozoo/DefaultShipping/controllers die Datei OnepageController.php mit folgendem Inhalt an:

require_once 'Mage/Checkout/controllers/OnepageController.php';
class Bozoo_DefaultShipping_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'])) {

                if($data['use_for_shipping'] != 0){
                $method = Mage::getStoreConfig('defaultshipping/general/default_shipping_method');
                $result = $this->getOnepage()->saveShippingMethod($method);
                }

                if (!isset($result['error'])) {

                    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) {
                        $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 ($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 = Mage::getStoreConfig('defaultshipping/general/default_shipping_method');
                $result = $this->getOnepage()->saveShippingMethod($method);

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

Hier setzen wir zur Sicherheit nochmal die Default Versandart, falls diese aus irgendwelchen Gründen nicht vorhanden sein sollte und setzen die richtigen 'sections", da die Section "Auswahl der Versandart" ja übersprungen werden soll.

Da wir auch das Javascript Magentos überschreiben müssen, müssen wir Magento jetzt noch mitteilen, dass wir ebenfalls ein neues View verwenden wollen. Dazu fügen wir unserer Layoutkonfiguration bozoo_defaultshipping.xml noch folgendes hinzu:

<checkout_onepage_index>
        <reference name="checkout.onepage">
            <action ifconfig="defaultshipping/general/remove_shipping_from_checkout" method="setTemplate">
                <template>bozoo/defaultshipping/checkout/onepage.phtml</template>
            </action>
        </reference>
        
        <reference name="checkout.progress">
            <action ifconfig="defaultshipping/general/remove_shipping_from_checkout" method="setTemplate">
                <template>bozoo/defaultshipping/checkout/onepage/progress.phtml</template>
            </action>
        </reference>
    </checkout_onepage_index>
    
    <checkout_onepage_progress>
        <reference name="root">
            <action ifconfig="defaultshipping/general/remove_shipping_from_checkout" method="setTemplate">
                <template>bozoo/defaultshipping/checkout/onepage/progress.phtml</template>
            </action>
        </reference>
    </checkout_onepage_progress>

 

Auch hier, wird wieder geprüft, ob dies laut Konfiguration erwünscht ist. Jetzt benötigen wir natürlich noch die beiden Views. Zunächst zu /app/design/frontend/default/default/template/bozoo/defaultshipping/checkout/onepage.phtml

<div class="page-title">
    <h1><?php echo $this->__('Checkout') ?></h1>
</div>
<script type="text/javascript" src="<?php echo $this->getJsUrl('varien/accordion.js') ?>"></script>
<script type="text/javascript" src="<?php echo $this->getSkinUrl('js/opcheckout.js') ?>"></script>

<script type="text/javascript" src="<?php echo $this->getJsUrl('bozoo/defaultshipping.js') ?>"></script>
<script type="text/javascript">countryRegions = <?php echo $this->helper('directory')->getRegionJson() ?></script>
<ol class="opc" id="checkoutSteps">
<?php $i=0; foreach($this->getSteps() as $_stepId => $_stepInfo): ?>
<?php if (!$this->getChild($_stepId) || !$this->getChild($_stepId)->isShow()): continue; endif; $i++ ?>
    <li id="opc-<?php echo $_stepId ?>" class="section<?php echo !empty($_stepInfo['allow'])?' allow':'' ?><?php echo !empty($_stepInfo['complete'])?' saved':'' ?>">
        <div class="step-title">
            <span class="number"><?php echo $i ?></span>
            <h2><?php echo $_stepInfo['label'] ?></h2>
            <a href="#"><?php echo $this->__('Edit') ?></a>
        </div>
        <div id="checkout-step-<?php echo $_stepId ?>" class="step a-item" style="display:none;">
            <?php echo $this->getChildHtml($_stepId) ?>
        </div>
    </li>
<?php endforeach ?>
</ol>
<script type="text/javascript">
//<![CDATA[
    var accordion = new Accordion('checkoutSteps', '.step-title', true);
    <?php if($this->getActiveStep()): ?>
    accordion.openSection('opc-<?php echo $this->getActiveStep() ?>');
    <?php endif ?>
    
    var checkout = new Bozoo(accordion,{
        progress: '<?php echo $this->getUrl('checkout/onepage/progress') ?>',
        review: '<?php echo $this->getUrl('checkout/onepage/review') ?>',
        saveMethod: '<?php echo $this->getUrl('checkout/onepage/saveMethod') ?>',
        failure: '<?php echo $this->getUrl('checkout/cart') ?>'}
    );
//]]>
</script>

 

und /app/design/frontend/default/default/template/bozoo/defaultshipping/checkout/onepage/progress.phtml

<div class="block block-progress opc-block-progress">
    <div class="block-title">
        <strong><span><?php echo $this->__('Your Checkout Progress') ?></span></strong>
    </div>
    <div class="block-content">
        <dl>
        <?php if ($this->getCheckout()->getStepData('billing', 'is_show')): ?>
        <?php if($this->getCheckout()->getStepData('billing', 'complete')): ?>
            <dt class="complete">
                <?php echo $this->__('Billing Address') ?> <span class="separator">|</span> <a href="#billing" onclick="checkout.accordion.openSection('opc-billing'); return false;"><?php echo $this->__('Change') ?></a>
            </dt>
            <dd class="complete">
                <address><?php echo $this->getBilling()->format('html') ?></address>
            </dd>
        <?php else: ?>
            <dt>
                <?php echo $this->__('Billing Address') ?>
            </dt>
        <?php endif; ?>
        <?php endif; ?>

        <?php if ($this->getCheckout()->getStepData('shipping', 'is_show')): ?>
        <?php if($this->getCheckout()->getStepData('shipping', 'complete')): ?>
            <dt class="complete">
                <?php echo $this->__('Shipping Address') ?> <span class="separator">|</span> <a href="#payment" onclick="checkout.accordion.openSection('opc-shipping');return false;"><?php echo $this->__('Change') ?></a>
            </dt>
            <dd class="complete">
                <address><?php echo $this->getShipping()->format('html') ?></address>
            </dd>
        <?php else: ?>
            <dt>
                <?php echo $this->__('Shipping Address') ?>
            </dt>
        <?php endif; ?>
        <?php endif; ?>

        <?php if ($this->getCheckout()->getStepData('payment', 'is_show')): ?>
        <?php if($this->getCheckout()->getStepData('payment', 'complete')): ?>
            <dt class="complete">
                <?php echo $this->__('Payment Method') ?> <span class="separator">|</span> <a href="#payment" onclick="checkout.accordion.openSection('opc-payment'); return false;"><?php echo $this->__('Change') ?></a>
            </dt>
            <dd class="complete">
                <?php echo $this->getPaymentHtml() ?>
            </dd>
        <?php else: ?>
            <dt>
                <?php echo $this->__('Payment Method') ?>
            </dt>
        <?php endif; ?>
        <?php endif; ?>
        </dl>
    </div>
</div>

Innerhalb der progress.html wird das überschriebene Javascript gezogen und die Variable checkout wie folgt instanziiert:

var checkout = new Bozoo(accordion,{
        progress: '<?php echo $this->getUrl('checkout/onepage/progress') ?>',
        review: '<?php echo $this->getUrl('checkout/onepage/review') ?>',
        saveMethod: '<?php echo $this->getUrl('checkout/onepage/saveMethod') ?>',
        failure: '<?php echo $this->getUrl('checkout/cart') ?>'}
    );

Jetzt noch das neue Javascript /js/bozoo/defaultshipping.js

var Bozoo = Class.create(Checkout, {
    initialize: function($super,accordion, urls){
        $super(accordion, urls);
        this.steps = ['login','billing', 'shipping', 'payment', 'review'];
    }
});

und damit wären wir fertig..

 

 

 

«Magento: Auswahl der Versandart aus dem Checkout entfernen» kommentieren

 
 

Suche

Werbung

© 2012 bozoo.com