Eigenes Versandkosten-Modul für Magento (Shipping-Modul Teil 1)

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.
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)
Dankeschön : ]
War diese Antwort hilfreich?
LikeDislikeVon mir auch! Und vor allem vielen Dank für die gute Auskommentierung im Code.
War diese Antwort hilfreich?
LikeDislikeHallo,
danke für diese “Extension” und die Erklärungen dazu, ich habe das als Basis genommen und wollte meine eigenen Modul darauf implentieren.
Dazu habe ich im system.xml weitere Felder angelegt und in der config.xml auch default Werte vorgegeben.
Im Backend wird dies auch schön angezeigt, aber die Werte werden nicht gespeichert… Was habe ich übersehen?
Grüße
Steffen
War diese Antwort hilfreich?
LikeDislikeWir haben einige Module auf diese Art und Weise entwickelt – hat bei uns immer funktioniert. Wie hast Du die Werte kontrolliert? Im Backend und in der Datenbank?
Viele Grüße
Johannes Teitge
War diese Antwort hilfreich?
LikeDislikeHallo,
wenn ich auf speichern klicke, und Werte im “neuen Modul” eintetragen habe ist dies nach Speichern wieder eingeklappt und die Default Werte drin.
In der Datenbank Tabelle steht kein einziger wert zum carrier “ShipCalc”…
Darf man bestimmte Feldtypen nur einmalig verwenden?
Hat wer ein Link zu Dokumentation von system.xml
Grüße
Steffen
War diese Antwort hilfreich?
LikeDislikeHallo,
ich habe diese Modul Anleitung über Google gefunden. Vielen Dank dafür.
Allerdings habe ich noch eine Frage bzw. einen Erweiterungsvorschlag. Ist es möglich das Modul so zu ändern das es die Versandkosten aus einem Attribute(z.B. shipping_cost) aus den Produkten ausließt?
Liebe Grüße
nafex
War diese Antwort hilfreich?
LikeDislikeHallo,
kann es sein das diese Anleitung nicht mit Magento 1.3 funktionert?
Liebe Grüße
nafex
War diese Antwort hilfreich?
LikeDislikeHallo!
Habe auch das Problem, dass dieses Modul in Magento 1.3 nicht funktioniert:
Undefined variable: price in [...]app/code/local/Mxperts/ShipCalc/Model/Carrier/ShippingMethod.php on line 36
gibt es dafür schon eine Lösung?
War diese Antwort hilfreich?
LikeDislikeGibt es die Möglichkeit ein Textfeld im Magento eine Formel zu hinterlegen? (EAN Creator)
War diese Antwort hilfreich?
LikeDislikeMoin,
Vielen Dank für dieses Tutorial. Meine Frage ist ähnlich wie die von nafex und zwar ob man Attribute des Produktes auslesen kann und das Modul daraufhin aggieren lassen.
z.B. hat ein Produkt ein Attribut namens Sperrgut. Wenn das true ist soll das Versandkostenmodul automatisch nen anderen Preis generieren.
Wäre das mit diesem Modul möglich?
Vielen Dank und Viele Grüße
War diese Antwort hilfreich?
LikeDislikeMich würde es interessieren, ob es eine Lösung gibt für das folgende Problem.
Und zwar sind einige Artikel im Shop vom Gewicht her als normales Paket versendbar, leider haben diese aber Maße die nur als Sonderversand durch gehen.
Je nach Anzahl der Artikel wird der Preis auch noch gestaffelt
13,10 19,10 22,50 28,10 35,90 35,90 50,60 56,20 67,50 73,10
Dies gilt aber wirklich nur für einige wenige Artikel, die nicht an der Artikelgruppe ausgemacht werden können.
Interessant wäre also eine Lösung die, die normalen Regeln bestehen lässt und nur für diese Artikel eine Sonderregelung ansetzt.
War diese Antwort hilfreich?
LikeDislike