Bei einem unsere Kunden will der Paymentfilter einfach nicht – aber der Kunde möchte die Zahlungsart Rechnungen für bestimmte Kundengruppen. Aus diesem Grund bleibt mir eine Entwicklung eines eigenen Payment-Moduls für Magento nicht erspart.

In Teil1 werden wir ein Rechnungsmodul mit minimum an Code erstellen. Dieses Modul werden wir dann Step by Step erweitern. Die Erklärungen schreibe ich als Kommentare in den Code.

1. Datei app\etc\modules\Mxperts_Invoice.xml

<?xml version="1.0"?>
<config>
    <modules>
<!-- Magento-Modul definieren -->
        <Mxperts_Invoice>
            <active>true</active>
            <!-- Daten sind in codePool\Mxperts\Invoice (app\code\local\Mxperts\Invoice) zu finden  -->
            <codePool>local</codePool>
            <!-- Abhaengigkeiten fure die korrekte Ausfuehrung des Moduls  -->
            <depends>
                <Mage_Payment />
            </depends>
            <!-- Versionierung, Wichtig fuer Datenbankupdates!!!  -->
            <version>0.1.0</version>
        </Mxperts_Invoice>
    </modules>
</config>

Mit dieser Datei registrieren wir unser Modul in Magento und können es unter System->Konfiguration->Erweitert komplett deaktivieren oder aktivieren.



2. Datei app\code\local\Mxperts\Invoice\etc\config.xml

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

<!-- Definition des Models/Alias - Mage::getModel('invoice/...')  -->
        <models>
            <invoice>
                <class>Mxperts_Invoice_Model</class>
            </invoice>
        </models>

<!-- Definition der Ressourcen  -->
        <resources>

<!-- Setup,Write,Read Ressourcen definbieren. (Nur Core-Funktionen) -->
            <invoice_setup>
                <setup>
<!-- Modul welches verwendet werden soll -->
                    <module>Mxperts_Invoice</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </invoice_setup>

            <invoice_write>
                <use>core_write</use>
            </invoice_write>

            <invoice_read>
                <use>core_read</use>
            </invoice_read>

        </resources>

    </global>

<!-- Standardeinstellung des Moduls -->
    <default>
        <payment>
            <invoice>
                <active>0</active>
                <model>invoice/invoice</model>
                <order_status>1</order_status>
                <title>Rechnung</title>
                <allowspecific>0</allowspecific>
            </invoice>
         </payment>
    </default>

</config>

Die system.xml stellt die Basis-Konfiguration für unser Modul. In der config.xml folgt nun die Konfiguration für das Magento-Backend.



3. Datei app\code\local\Mxperts\Invoice\etc\system.xml

<?xml version="1.0"?>
<config>
   <sections>
        <!-- Backend TAB payment -->
        <payment>
            <groups>
                <!-- invoice Fieldset -->
                <invoice translate="label" module="payment">
                    <!-- Titel im Backend -->
                    <label>Invoice</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>1</sort_order>
                    <!-- In der Standarkonfiguration anzeigen -->
                    <show_in_default>1</show_in_default>
                    <!-- In der Websitekonfiguration anzeigen -->
                    <show_in_website>1</show_in_website>
                    <!-- Nicht in der Storekonfiguration anzeigen -->
                    <show_in_store>0</show_in_store>

                    <!-- Nun folgend die Defenition der Backend-Eingabefelder -->
                    <fields>
                        <active translate="label">
                            <!-- Bezeichnung des Eingabefeldes -->
                            <label>Enabled</label>
                            <!-- Eingabetyp (text,select,mutliselect, text, texarea, etc...) -->
                            <frontend_type>select</frontend_type>
                            <!-- Model welches die Inhalte dere Auswahl liefert -->
                            <source_model>adminhtml/system_config_source_yesno</source_model>
                            <!-- Position im Backend -->
                            <sort_order>1</sort_order>
                            <!-- Kommentar -->
                            <comment><![CDATA[<b>Aktivieren</b> oder <b>Deaktivieren</b> des Moduls.]]></comment>
                            <!-- Anzeige der jeweiligen Konfig.-Bereiches -->
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </active>
                        <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>0</show_in_store>
                        </title>
                        <order_status translate="label">
                            <label>New order status</label>
                            <frontend_type>select</frontend_type>
                            <source_model>adminhtml/system_config_source_order_status</source_model>
                            <sort_order>4</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </order_status>
                        <sort_order translate="label">
                            <label>Sort order</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>5</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>0</show_in_store>
                        </sort_order>
                    </fields>
                </invoice>
            </groups>
        </payment>
    </sections>
</config>

Viele benutzen bei Ihrer Backendkonfiguration das Comment-Tag nicht. Dies möchte ich hier aber zeigen, da man damit dem Benutzer Hilfestellung geben kann. Durch die Verwendung von CDATA kann man auch HTML-Tags verwenden.

Im Backend sieht unser Modul dann wie folgt aus:
mxperts_invoice1_01

Die Daten der einzelnen Eingabefelder, sowie die Aktivierung des Moduls, werden in der Tabelle core_config_data ihrer Shopdatenbank gespeichert. Beim Entfernen des Moduls sollte man darauf achten, dass auch diese Einträge aus der Datenbank entfernt werden. Anbei ein Screenshot einer SQL-Abfrage die alle Werte mit dem Keyword invoice ausgibt.
mxperts_invoice1_03



Nachdem wir die Konfiguration vorgenommen haben, wird nun noch die Klasse für unser Payment-Modul erstellt.

4. Datei app\code\local\Mxperts\Invoice\Model\Invoice.php

<?php
class Mxperts_Invoice_Model_Invoice extends Mage_Payment_Model_Method_Abstract
{
    // Eindeutiger Bezeichner
    protected $_code = 'invoice';

    // Ausgabe des Titels aus dem Backend
    public function getCODTitle()
    {
        return $this->getConfigData('title');
    }
}



Das Modul sollte nun auch im Backend verfügbar sein.
mxperts_invoice1_02

Download des Moduls: mxperts_invoice_teil1.zip

In den nächsten Teilen werden wir unser Payment-Modul noch um einige Features erweitern.
Bis dahin viel Spaß beim Testen.

Johannes Teitge