Wenn Sie für Ihren Magento-Shop ein eigenes Modul zur Versandkostenberechnung benötigen, ist es schwierig geeignete Dokumentation zur Entwicklung von Versankosten-Modulen zu finden. Ich habe einen Kunden der eine eigene Logik zur Berechnung seiner Versandkosten hat. Also habe ich mir erst einmal im Core die Module angesehen sowie einige Module aus Magento-Connect installiert.

Hier zeige ich nun ein Basis-Modul mit eine Fantasieformel zur Berechnung der Versandkosten – also die Berechnungslogik können Sie beliebig anpassen.

dirs_shipping_module Das wird wieder ein weitere Mxperts-Modul mit der Bezeichnung ShipCalc. Natürlich können Sie Ihren eigenen Firemennamen sowie eine eigene Bezeichnung für die Versandkostenmethode wählen. Allerdings müssen Sie dann auf die Schreibweise der Klassen, Models/Namespaces, Verzeichnisse und Dateien achten. Wenn Sie das Modul an Ihre Bedürfnisse anpassen möchten empfehle ich das Step bei Step – angefangen bei der Firmenbezeichnung. Wenn Sie noch keine Erfahrung mit der Modulprogrammierung in Magento haben, sollten Sie sich zuerst damit befassen. Dazu gibt es unsere Reihe Extension Tutorial Teil1 – Teil10. Ich versuche trotzdem die Sourcen so geht es geht zu kommentieren.

Umsetzung:

1. Die Basis befindet sich in app\etc\modules\Mxperts_Shipcalc.xml

<?xml version="1.0"?>
<config>
  <modules>
<!-- Magento-Modul definieren -->
    <Mxperts_ShipCalc> <!-- Daten sind in codePool\Mxperts\ShipCalc zu finden  -->
      <active>true</active>
      <codePool>local</codePool> <!-- Daten sind in app\code\local zu finden  -->
    </Mxperts_ShipCalc>
  </modules>
</config>

2. Modulkonfiguration app\code\local\Mxperts\ShipCalc\etc\config.xml

<?xml version="1.0"?>
<config>

  <default>
    <carriers>
      <!-- Default Werte fuer das Backend -->
      <shipcalcmodule>
        <active>1</active>
	 		  <allowed_methods>shipcalc</allowed_methods>
			  <methods>shipcalc</methods>
        <sallowspecific>0</sallowspecific>
        <model>Mxperts_ShipCalc_Model_Carrier_ShippingMethod</model>
        <name>Ship Calc</name>
        <title>Ship Calc</title>
        <specificerrmsg>
Zur Zeit ist die Versandmethode nicht verfuegbar
        </specificerrmsg>
        <handling_type>F</handling_type>
      </shipcalcmodule>
    </carriers>
  </default>

	<modules>
<!-- Modulversion definbieren -->
    <Mxperts_ShipCalc>
<!-- Diese Version wird fuer Datenbankupdates verwendet -->
      <version>0.2.0</version>
    </Mxperts_ShipCalc>
  </modules>

  <global>

    <models>
<!-- Alias/Namespace fuer Mage::getModel() -->
      <shipcalcmodule>
<!-- Basis-Klasse -->
        <class>Mxperts_ShipCalc_Model</class>
      </shipcalcmodule>
    </models>

    <resources>
<!-- resource identifier -->
      <shipcalcmodule_setup>
<!--  Setup resource fuer upgrades definieren -->
        <setup>
<!-- Diese Modul fuer install/upgrade -->
          <module>Mxperts_ShipCalc</module>
        </setup>
<!-- Datenbankverbindung definieren -->
        <connection>
<!-- Vordefinierte Verbindung nutzen (core setup) -->
          <use>core_setup</use>
        </connection>
      </shipcalcmodule_setup>
    </resources>

  </global>

</config>

3. Backendkonfiguration app\code\local\Mxperts\ShipCalc\etc\system.xml

<?xml version="1.0"?>
<config>
   <sections>
    <carriers>
        <groups>
            <shipcalcmodule translate="label" module="shipping">
                <label>Mxperts Shipping Calculation</label>
                <frontend_type>text</frontend_type>
                <sort_order>13</sort_order>
                <show_in_default>1</show_in_default>
                <show_in_website>1</show_in_website>
                <show_in_store>1</show_in_store>
                   <fields>
                        <active translate="label">
                            <label>Enabled</label>
                            <frontend_type>select</frontend_type>
                            <source_model>adminhtml/system_config_source_yesno</source_model>
                            <sort_order>1</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </active>

						            <sort_order translate="label">
                            <label>Sort order</label>
                            <frontend_type>text</frontend_type>
                            <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>
                        </sort_order>

                        <title translate="label">
                            <label>Title</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>2</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </title>

						            <methodtitle translate="label">
                            <label>Method Title</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>2</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </methodtitle>

                        <handling translate="label">
                            <label>Handling fee</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>12</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </handling>

						            <handling_type translate="label">
                            <label>Calculate Handling Fee</label>
                            <frontend_type>select</frontend_type>
                            <source_model>shipping/source_handlingType</source_model>
                            <sort_order>10</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </handling_type>

                        <sallowspecific translate="label">
                            <label>Ship to applicable countries</label>
                            <frontend_type>select</frontend_type>
                            <sort_order>90</sort_order>
                            <frontend_class>shipping-applicable-country</frontend_class>
                            <source_model>adminhtml/system_config_source_shipping_allspecificcountries</source_model>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </sallowspecific>

                        <specificcountry translate="label">
                            <label>Ship to Specific countries</label>
                            <frontend_type>multiselect</frontend_type>
                            <sort_order>91</sort_order>
                            <source_model>adminhtml/system_config_source_country</source_model>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </specificcountry>

                        <specificerrmsg translate="label">
                            <label>Displayed Error Message</label>
                            <frontend_type>textarea</frontend_type>
                            <sort_order>80</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </specificerrmsg>

                    </fields>
                </shipcalcmodule>
            </groups>
        </carriers>
    </sections>
</config>

Dies ist die Definition der einzelnen Felder zur Konfiguration im Backend. Die Werte finden Sie nach der Installation in der Datenbank unter der Tabelle core_config_data. Studieren Sie auch die Verwendung des Alias shipcalcmodule – z.b. der Status des Moduls wird in der Datenbank unter carriers/shipcalcmodule/active, Wert 1 oder 0 abgespeichert. Gerade wenn Sie den Alias anpassen müssen Sie darauf achten, dass dieser durchgängig angepasst wird.

4. Nun noch unsere Klasse app\code\local\Mxperts\ShipCalc\Model\Carrier\ShippingMethod.php

<?php
class Mxperts_ShipCalc_Model_Carrier_ShippingMethod extends Mage_Shipping_Model_Carrier_Abstract
{

  protected $_code = 'shipcalcmodule'; // Unser Versandkostencode/Alias

  public function collectRates(Mage_Shipping_Model_Rate_Request $request)
  {
    // Wenn das Modul inaktiv ist -> abbrechen
    if (!Mage::getStoreConfig('carriers/'.$this->_code.'/active'))
        return false;

	  $handling = 0;

	  if(Mage::getStoreConfig('carriers/'.$this->_code.'/handling') >0) {
		  $handling = Mage::getStoreConfig('carriers/'.$this->_code.'/handling');
	  }

	  if(Mage::getStoreConfig('carriers/'.$this->_code.'/handling_type') == 'P' && $request->getPackageValue() > 0) {
		  $handling = $request->getPackageValue()*$handling;
		}

 	  $method = Mage::getModel('shipping/rate_result_method'); // Instanz der Mage_Shipping_Model_Rate_Result_Method (app\code\core\Mage\Shipping\Model\Rate\Result\Method.php)

	  $method->setCarrier($this->_code);
    $method->setCarrierTitle(Mage::getStoreConfig('carriers/'.$this->_code.'/title'));

    $method->setMethod('shipcalc');
    $method->setMethodTitle(Mage::getStoreConfig('carriers/'.$this->_code.'/methodtitle'));

    // Hier nun unsere Fantasieformel. Quersumme aller Produkt Basisipreise aus dem Warenkorb / (Anzal Produkte * 10)
    $sess = Mage::getSingleton('checkout/session');
    $items = $sess->getQuote()->getAllItems();

    foreach($items as $item) {
      $price += $item->getBaseCalculationPrice();
    }
    $price = $price / (count($items)*10);

    $method->setCost($handling+$price);
    $method->setPrice($handling+$price);

    $result = Mage::getModel('shipping/rate_result'); // Instanz der Klasse Mage_Shipping_Model_Rate_Result (app\code\core\Mage\Shipping\Model\Rate\Result.php)
    $result->append($method);

    return $result;

  }
}

Nun muss man nur noch das Modul auf den Server kopieren, im Backend konfigurieren … und fertig.

Testen kann man das Modul auf unserem neuen Testshop www.demo-store.de.

Download der fertigen Moduls: mxperts_Shipcalc.zip

Nun wünsche ich viel Spaß beim Erstellen eigener Versandkostenmodule
Johannes Teitge

Teil2: Verandkosten nach Kundengruppen (Shipping-Modul Teil 2)