29. Februar 2016

#Magento

#Versandmethode

Erstellen einer benutzerdefinierten Versandmethode in Magento

Auch wenn Magento sehr viele Versandarten mit den größeren Versanddienstleistern anbietet, braucht man hin und wieder noch eigene Versandmethoden wie beispielsweise die Abholung (In-Store Pickup). In einigen Fällen braucht man noch die eigene Logik für den Versand oder die Berechnung der Kosten, sodass es keine andere Alternative gibt, als eine eigene Methode zu definieren und zu entwicklen.

Wie auch immer das Szenario ist, es ist relativ einfachm eine Versandmethode als Modul in Magento zu erstellen. Hierzu braucht man nur die dazugehörigen Konfigurationsdateien und ein Modell, das die Logik der Versandmethode implementiert. In diesem Artikel werden wir genau dieses umsetzen am Beispiel einer relativ einfachen Versandmethode „Abholung“.

An der Stelle sei vorrausgesetzt, dass der Modulerstellungsprozess von Magento klar ist.

Auf einen Blick

Es wird ein einfaches Versandmodul mit dem Namen „Abholung“ erstellt. Hier eine Liste der Dateien, die für das Modul benötigt werden:

  • app/etc/modules/CodingPioneers_All.xml: Eine Datei, um das Modul zu aktivieren
  • app/code/local/CodingPioneers/Customshippingmethod/etc/config.xml: Die Modul-Konfiguration, welche die Versandmethode nach den Magento-Konventionen deklariert
  • app/code/local/CodingPioneers/Customshippingmethod/etc/system.xml: Die Konfigurationsdatei, die die Backend-Konfigurationsmöglichkeiten des Moduls beschreibt
  • app/code/local/CodingPioneers/Customshippingmethod/Model/Demo.php: Das Modell zur Berechnung der Gebühren
  • app/code/local/CodingPioneers/Customshippingmethod/Helper/Data.php: Eine unterstützdende Datei, die von dem Magento Übersetzungssystem genutzt wird

Anlegen von Dateien und Verzeichnissen

Zunächst wird die Datei zur Modulaktivierung benötigt. Über die Autoloading-Hooks im Magento werden dann per Namenskonvention die erforderlichen weiteren Dateien hinzugeladen. Diese Datei wird wie folgt angelegt:

"app/etc/modules/CodingPioneers_All.xml"

Danach muss nachfolgender Text in die Dateien eingefügt werden. Als Namespace dient hier „CodingPioneers“ und „Abholung“ als Modulname. Dies aktiviert das Modul „Abholung“.

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

Als Nächstes muss die Modul-Konfigurationsdatei "app/code/local/CodingPioneers/Abholung/etc/config.xml" angelegt werden und folgender Inhalt eingefügt werden:

<?xml version="1.0"?>
<config>   <modules>     <CodingPioneers_Abholung>       <version>1.0</version>     </CodingPioneers_Abholung>   </modules>   <global>     <models>       <CodingPioneers_Abholung>         <class>CodingPioneers_Abholung_Model</class>       </CodingPioneers_Abholung>     </models>     <helpers>       <CodingPioneers_Abholung>         <class>CodingPioneers_Abholung_Helper</class>       </CodingPioneers_Abholung>     </helpers>   </global>   <default>     <carriers>       <CodingPioneers_Abholung>         <active>1</active>         <sallowspecific>1</sallowspecific>         <model>CodingPioneers_Abholung/demo</model>         <name>Abholung</name>         <price>0.00</price>         <title>Abholung</title>       </CodingPioneers_Abholung>     </carriers>   </default> </config>

In der Datei "config.xml" wurden zunächst das Modell und die Helferklasse in der Sektion <global> deklariert. Das in diesem Beitrag wichtige Tag <carriers> wurde unter der Sektion <default> deklariert. Dieses teilt Magento mit, dass eine neue Versandmethode angehängt wird, wie diese unter dem Tag <CodingPioneers_Abholung> deklariert wurde. Dieser sollte zwingend einzigartig sein, um nicht mit anderen Versandmethoden in Konflikt zu geraten.

Andere wichtige Tags sind <sallowspecific> und <model>. Der Tag <sallowspecific> steht für „Versende an alle ausgewählten Länder“. Dies erlaubt, dass die zutreffenden Länder ausgewählt werden können, für die die Versandmethode verfügbar sein soll. Der Tag <model> definiert den Ort des Modells für diese Versandmethode.

Als nächstes muss die Datei "system.xml" angelegt werden. Datei stellt die Back-End-Einstellungen für diese Versandmethode zur Verfügung. Dazu wird die Datei "app/code/local/CodingPioneers/Abholung/etc/system.xml" mit dem folgendem Inhalt angelegt:

<?xml version="1.0" encoding="UTF-8"?>
<config>   <sections>     <carriers>       <groups>         <CodingPioneers_Abholung translate="label">           <label>CodingPioneers Demo Shipping Method</label>           <sort_order>1</sort_order>           <show_in_default>1</show_in_default>           <show_in_website>0</show_in_website>           <show_in_store>0</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>0</show_in_website>               <show_in_store>0</show_in_store>             </active>             <title translate="label">               <label>Shipping Method Name</label>               <frontend_type>text</frontend_type>               <sort_order>20</sort_order>               <show_in_default>1</show_in_default>               <show_in_website>0</show_in_website>               <show_in_store>0</show_in_store>             </title>             <sallowspecific translate="label"               <label>For selected countries only</label>               <frontend_type>select</frontend_type>               <frontend_class>shipping-applicable-country</frontend_class>
        <source_model>adminhtml/system_config_source_shipping_allspecificcountries</source_model>               <sort_order>30</sort_order>               <show_in_default>1</show_in_default>               <show_in_website>0</show_in_website>               <show_in_store>0</show_in_store>             </sallowspecific>             <specificcountry translate="label">               <label>Ship to Specific Countries</label>               <frontend_type>multiselect</frontend_type>               <sort_order>31</sort_order>               <source_model>adminhtml/system_config_source_country</source_model>               <show_in_default>1</show_in_default>               <show_in_website>0</show_in_website>               <show_in_store>0</show_in_store>               <can_be_empty>1</can_be_empty>             </specificcountry>           </fields>         </CodingPioneers_Abholung>       </groups>     </carriers>   </sections> </config>

Dies erzeugt das Formular zur Konfiguration mit den Feldern wie unter dem <fields>-Tag zu sehen. Auf diesen Punkt können wir später noch einmal zurück.

Nun zur Datei mit dem Modell "app/code/local/CodingPioneers/Abholung/Model/Demo.php" mit folgendem Inhalt:

<?php
// app/code/local/CodingPioneers/Abholung/Model
class CodingPioneers_Abholung_Model_Demo
  extends Mage_Shipping_Model_Carrier_Abstract
  implements Mage_Shipping_Model_Carrier_Interface
{
  protected $_code = 'CodingPioneers_Abholung';
 
  public function collectRates(Mage_Shipping_Model_Rate_Request $request)
  {
    $result = Mage::getModel('shipping/rate_result');
    $result->append($this->_getDefaultRate());
 
    return $result;
  }
 
  public function getAllowedMethods()
  {
    return array(
      'CodingPioneers_Abholung' => $this->getConfigData('name'),
    );
  }
 
  protected function _getDefaultRate()
  {
    $rate = Mage::getModel('shipping/rate_result_method');
     
    $rate->setCarrier($this->_code);
    $rate->setCarrierTitle($this->getConfigData('title'));
    $rate->setMethod($this->_code);
    $rate->setMethodTitle($this->getConfigData('name'));
    $rate->setPrice($this->getConfigData('price'));
    $rate->setCost(0);
     
    return $rate;
  }
}

Um an der Stelle ein wenig mehr ins Detail zu gehen: Es wurde die $_code Variable auf ‚CodingPioneers_Abholung‘ gesetzt, welche vorher in der Datei "config.xml" gesetzt wurde. Die Methode getAllowedMethods übergibt einen Array von Versandmethoden im Frontend im Bezahlprozess. In diesem Fall wurde nur eine Versandmethode deklariert, daher wird nur diese zurückgegeben.

Weiter wird die Funktion collectRates von Magento aufgerufen, um die Versandpreise für die verschiedenen Versandoptionen zu berechnen. Die Implementierung ist gemäß der Magento-Konvention. Wirklich wichtig ist hier die Funktion _getDefaultRate, in der die Logik zur Berechnung für die Versandoption beschrieben ist. Auch wenn wir in diesem Fall nur einen festen Preis in der Datei "config.xml" angegeben haben. Je nach Bedürfnissen kann dies an die eigenen Anforderungen angepasst werden.

Zuletzt muss noch die Helfer-Datei "app/code/local/CodingPioneers/Abholung/Helper/Data.php" angelegt werden, welche vom Magento-Übersetzungssystem genutzt wird:

<?php
class CodingPioneers_Abholung_Helper_Data extends Mage_Core_Helper_Abstract
{
}


Nun sollten alle Dateien dort sein, wo sie hingehören und es sollte funktionieren! Um das zu prüfen, müssen Sie sich im Backend einloggen, das Modul aktivieren und den Cache leeren. Unter System ⇒ Konfituration ⇒ Verkäufe ⇒ Versandarten sollten Sie die Versandart mit dem Titel „Abholung“ gelistet sehen.

Im Frontend kann man die Versandmethode nutzen, wenngleich es sich hier nur um ein wirklich einfaches Beispiel handelt, um die Implementierung zu demonstrieren.