it-swarm.com.de

Wie erstelle ich ein einfaches "Hello World" -Modul in Magento?

Wie kann in Magento Folgendes erreicht werden?

  • Zeigen Sie eine "Hello World" -Meldung mit einem Controller/View/Model-Ansatz an. Wenn ich also zu http://example.com/myController gehe, würde es die Zeichenfolge 'Hello World' zeigen. Die Möglichkeit, diese Zeichenfolge in der Vorlage meiner Website anzuzeigen (z. B. Kopfzeile, Fußzeile usw.), ist ein Bonus.

  • Wie füge ich diesem Controller (oder gegebenenfalls einem neuen Controller) eine Methode hinzu, die mit einem Modell interagiert, die Abfrage Select * FROM articles where id='10' ausführt und die Zeile (die die Spalten id, title, content enthält) an den Controller zurückgibt? Verwenden Sie dann den Controller, um eine Ansicht einzuschließen, die diese Zeile anzeigen würde. Wenn Sie zu http://example.com/myController/show_row (oder etwas Ähnlichem) gehen, wird die Zeile in einer Ansicht angezeigt. (Keine Notwendigkeit, ausgefallen zu sein, nur ein echo $row->id; oder etwas ähnliches würde funktionieren.)

Alle anderen Informationen über die Codestruktur von Magento sind ebenfalls hilfreich.

298
Click Upvote

In erster Linie empfehle ich den Kauf des PDF/E-Book von PHP Architect . Es kostet 20 US-Dollar, ist aber die einzige direkte Ressource, die ich finden konnte: "So funktioniert Magento". Ich habe auch angefangen zu schreiben Magento Tutorials auf meiner eigenen Website .

Zweitens, wenn Sie die Wahl haben und kein erfahrener Programmierer sind oder keinen Zugriff auf einen erfahrenen Programmierer haben (idealerweise in PHP und Java) , wähle einen anderen Wagen. Magento ist ausgereift, wurde jedoch als Einkaufswagenlösung entwickelt, auf die andere Programmierer Module aufbauen können. Es wurde nicht entwickelt, um von Leuten, die klug sind, aber keine Programmierer, leicht verstanden zu werden.

Drittens unterscheidet sich die MVC von Magento stark von der MVC Ruby on Rails , Django , CodeIgniter , CakePHP usw. Modell, das heutzutage bei PHP Entwicklern beliebt ist. Ich denke, es basiert auf dem Zend Modell und das Ganze ist sehr Java OOP-artig. Es gibt zwei Controller, um die Sie sich Sorgen machen müssen. Der Modul-/FrontName-Controller und dann der MVC-Controller.

Viertens wird die Magento-Anwendung selbst mit demselben Modulsystem erstellt, das Sie verwenden. Das Stöbern im Kerncode ist daher eine nützliche Lerntaktik. Außerdem ist eine Menge, was Sie mit Magento tun werden, überschreiben vorhandene Klassen. Was ich hier behandele, ist Erstellen neue Funktionalität, nicht überschreiben. Denken Sie daran, wenn Sie sich die Codebeispiele ansehen.

Ich werde mit Ihrer ersten Frage beginnen und Ihnen zeigen, wie Sie einen Controller/Router einrichten, um auf eine bestimmte URL zu antworten. Dies wird ein kleiner Roman sein. Vielleicht habe ich später Zeit für die modell-/vorlagenbezogenen Themen, aber im Moment habe ich keine. Ich werde jedoch kurz auf Ihre SQL-Frage eingehen.

Magento verwendet eine EAV Datenbankarchitektur. Versuchen Sie nach Möglichkeit, die vom System bereitgestellten Modellobjekte zu verwenden, um die benötigten Informationen abzurufen. Ich weiß, dass es in den SQL-Tabellen alles gibt, aber es ist am besten, nicht daran zu denken, Daten mit rohen SQL-Abfragen zu erfassen, sonst werden Sie verrückt.

Letzter Haftungsausschluss. Ich benutze Magento seit ungefähr zwei oder drei Wochen, also Vorsicht, Emptor. Dies ist eine Übung, um dies in meinem Kopf klar zu machen und um dem Stapelüberlauf zu helfen.

Erstellen Sie ein Modul

Alle Ergänzungen und Anpassungen von Magento erfolgen über Module. Als Erstes müssen Sie ein neues Modul erstellen. Erstellen Sie eine XML-Datei in app/modules mit folgendem Namen

cd /path/to/store/app
touch etc/modules/MyCompanyName_HelloWorld.xml
<?xml version="1.0"?>
<config>
     <modules>
        <MyCompanyName_HelloWorld>
            <active>true</active>
            <codePool>local</codePool>
        </MyCompanyName_HelloWorld>
     </modules>
</config>

MyCompanyName ist ein eindeutiger Namespace für Ihre Änderungen. Es muss nicht der Name Ihres Unternehmens sein, sondern die empfohlene Konvention my magento. HelloWorld ist der Name Ihres Moduls.

Löschen Sie den Anwendungscache

Nachdem die Moduldatei vorhanden ist, müssen wir Magento darüber informieren (und unsere Arbeit überprüfen). In der Admin-Anwendung

  1. Gehen Sie zu System-> Cache Management
  2. Wählen Sie im Menü Alle Caches die Option Aktualisieren
  3. Klicken Sie auf Cache-Einstellungen speichern

Jetzt stellen wir sicher, dass Magento über das Modul Bescheid weiß

  1. Gehen Sie zu System-> Konfiguration
  2. Klicken Sie auf Erweitert
  3. Suchen Sie im Einstellungsfeld "Modulausgabe deaktivieren" nach Ihrem neuen Modul mit dem Namen "MyCompanyName_HelloWorld".

Wenn Sie mit einem Leistungsabfall leben können, möchten Sie möglicherweise den Anwendungscache während des Entwickelns/Lernens deaktivieren. Nichts ist frustrierender, als das Löschen des Caches zu vergessen und sich zu fragen, warum Ihre Änderungen nicht angezeigt werden.

Richten Sie die Verzeichnisstruktur ein

Als nächstes müssen wir eine Verzeichnisstruktur für das Modul einrichten. Sie werden nicht alle diese Verzeichnisse benötigen, aber es schadet nicht, sie jetzt alle einzurichten.

mkdir -p app/code/local/MyCompanyName/HelloWorld/Block
mkdir -p app/code/local/MyCompanyName/HelloWorld/controllers
mkdir -p app/code/local/MyCompanyName/HelloWorld/Model
mkdir -p app/code/local/MyCompanyName/HelloWorld/Helper
mkdir -p app/code/local/MyCompanyName/HelloWorld/etc
mkdir -p app/code/local/MyCompanyName/HelloWorld/sql

Und fügen Sie eine Konfigurationsdatei hinzu

touch app/code/local/MyCompanyName/HelloWorld/etc/config.xml

fügen Sie in der Konfigurationsdatei Folgendes hinzu, bei dem es sich im Wesentlichen um eine "leere" Konfiguration handelt.

<?xml version="1.0"?>
<config>
    <modules>
        <MyCompanyName_HelloWorld>
            <version>0.1.0</version>
        </MyCompanyName_HelloWorld>
    </modules>
</config>

Mit dieser Konfigurationsdatei können Sie Magento den Code mitteilen, den Sie ausführen möchten.

Einrichten des Routers

Als nächstes müssen wir die Router des Moduls einrichten. Dadurch wird das System darüber informiert, dass wir URLs in Form von verarbeiten

http://example.com/magento/index.php/helloworld

Fügen Sie in Ihrer Konfigurationsdatei den folgenden Abschnitt hinzu.

<config>
<!-- ... -->
    <frontend>
        <routers>
            <!-- the <helloworld> tagname appears to be arbitrary, but by
            convention is should match the frontName tag below-->
            <helloworld>
                <use>standard</use>
                <args>
                    <module>MyCompanyName_HelloWorld</module>
                    <frontName>helloworld</frontName>
                </args>
            </helloworld>
        </routers>
    </frontend>
<!-- ... -->
</config>

Was Sie hier sagen, ist "jede URL mit dem Frontnamen von helloworld ...

http://example.com/magento/index.php/helloworld

sollte den frontName Controller MyCompanyName_HelloWorld verwenden ".

Mit der obigen Konfiguration erhalten Sie eine 404-Seite, wenn Sie die helloworld-Seite oben laden. Das liegt daran, dass wir keine Datei für unseren Controller erstellt haben. Machen wir das jetzt.

touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php

Versuchen Sie nun, die Seite zu laden. Fortschritt! Anstelle einer 404 erhalten Sie eine PHP/Magento-Ausnahme

Controller file was loaded but class does not exist

Öffnen Sie also die soeben erstellte Datei und fügen Sie den folgenden Code ein. Der Name der Klasse muss auf dem Namen basieren, den Sie in Ihrem Router angegeben haben.

<?php
class MyCompanyName_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        echo "We're echoing just to show that this is what's called, normally you'd have some kind of redirect going on here";
    }
}

Was wir gerade eingerichtet haben, ist der Modul/FrontName-Controller. Dies ist die Standardsteuerung und die Standardaktion des Moduls. Wenn Sie Controller oder Aktionen hinzufügen möchten, müssen Sie sich daran erinnern, dass der erste Teil des Baums einer Magento-URL unveränderlich ist. Sie gehen immer so vor http://example.com/magento/index.php/frontName/controllerName/actionName

Also, wenn Sie mit dieser URL übereinstimmen möchten

http://example.com/magento/index.php/helloworld/foo

Sie müssen einen FooController haben, was Sie folgendermaßen tun können:

touch app/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
<?php
class MyCompanyName_HelloWorld_FooController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        echo 'Foo Index Action';
    }

    public function addAction(){
        echo 'Foo add Action';
    }

    public function deleteAction(){
        echo 'Foo delete Action';
    }
}

Bitte beachten Sie, dass der Standardcontroller IndexController und die Standardaktion indexAction implizit sein können, aber explizit sein müssen, wenn etwas danach kommt. Also wird http://example.com/magento/index.php/helloworld/foo mit dem Controller FooController und der Action indexAction und NICHT mit der Action fooAction des IndexControllers übereinstimmen. Wenn Sie eine fooAction haben möchten, müssen Sie im Controller IndexController diesen Controller explizit folgendermaßen aufrufen: http://example.com/magento/index.php/helloworld/index/foo, da der zweite Teil der URL der ControllerName ist und immer sein wird. Dieses Verhalten ist eine Vererbung des in Magento enthaltenen Zend Framework.

Sie sollten nun in der Lage sein, die folgenden URLs aufzurufen und die Ergebnisse Ihrer Echoanweisungen anzuzeigen

http://example.com/magento/index.php/helloworld/foo
http://example.com/magento/index.php/helloworld/foo/add
http://example.com/magento/index.php/helloworld/foo/delete

Das sollte Ihnen eine grundlegende Vorstellung davon geben, wie Magento an einen Controller versendet. Von hier aus habe ich empfohlen, in den vorhandenen Magento-Controller-Klassen zu stöbern, um zu sehen, wie Modelle und das Vorlagen-/Layout-System verwendet werden sollten.

534
Alan Storm

Ich habe den letzten Monat mit Magento gerungen und versuche immer noch, es herauszufinden. Das ist also ein Fall, in dem Blinde die Blinden führen. Es gibt wenig Dokumentation und das Forum/Wiki ist bestenfalls chaotisch. Darüber hinaus gibt es mehrere Lösungen, die entweder veraltet oder bei weitem nicht optimal sind. Ich bin mir nicht sicher, ob Sie ein Projekt haben oder nur versuchen, es herauszufinden, aber es ist wahrscheinlich einfacher, wenn Sie anfangen, vorhandene Funktionen zu ändern, als etwas völlig Neues zu erstellen. Dafür würde ich auf jeden Fall mit den "Empfohlenen Artikeln für Entwickler" im Wiki gehen. Die neue Zahlungsmethode One war ein echter Augenöffner.

Für das Debuggen empfehle ich auf jeden Fall mit FirePHP und Ihre HTML-Quelle, wenn etwas schief geht. Die alte Echo-Debug-Methode funktioniert nicht so gut.

Die allgemeine Architektur ist so verwirrend komplex, dass ich, selbst wenn ich sie vollständig verstanden hätte, ein Buch darüber schreiben müsste. Das Beste, was ich tun kann, ist, Ihnen Ratschläge zu geben, die mir jemand gegeben hätte, als ich anfing ...

Halten Sie sich von Kerndateien fern. Ändern Sie sie nicht, schreiben Sie stattdessen Ihr eigenes Modul und überschreiben Sie, was Sie brauchen.

Magento verwendet Konfigurationsdateien, die aus XML bestehen, um zu entscheiden, was zu tun ist. Damit es Ihre eigenen Sachen im Gegensatz zur Kernfunktionalität ausführen kann, benötigen Sie die richtige XML-Datei. Leider gibt es keine Anleitung zum Erstellen von XML. Sie müssen sich Beispiele ansehen und einige ernsthafte Tests durchführen. Um die Sache zu komplizieren, wird beim Inhalt dieser Dateien weitgehend zwischen Groß- und Kleinschreibung unterschieden. Wenn Sie diese jedoch beherrschen, können Sie jeden Teil der Grundfunktionalität außer Kraft setzen, die zu einem sehr leistungsfähigen System führt.

Magento verwendet Methoden wie Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper'), um Objekte bestimmter Klassen zurückzugeben. Es findet diese standardmäßig in seinem Core-Namespace. Wenn Sie möchten, dass es Ihr eigenes verwendet, müssen Sie diese in Ihrer config.xml -Datei überschreiben.

Der Name Ihrer Klassen muss dem Ordner entsprechen, in dem sie sich befinden.

Viele der Objekte in Magento erweitern letztendlich das so genannte Varien_Object. Dies ist eine Allzweckklasse (ähnlich wie ein Schweizer Taschenmesser) und ihr Lebenszweck ist es, Ihnen zu ermöglichen, Ihre eigenen Methoden/Variablen im laufenden Betrieb zu definieren. Beispielsweise wird es als verherrlichtes Array verwendet, um Daten von einer Methode an eine andere zu übergeben.

Stellen Sie während der Entwicklung sicher, dass das Caching deaktiviert ist. Es wird Magento unerträglich langsam machen, aber es erspart Ihnen eine Menge Kopfverletzungen (davor, es auf Ihren Schreibtisch zu hämmern).

Sie werden feststellen, dass $this häufig verwendet wird. Es bedeutet eine andere Klasse, abhängig davon, welche Datei Sie sehen. get_class($this) ist dein Freund, besonders in Verbindung mit FirePHP.

Schreiben Sie die Dinge auf Papier. Viel. Es gibt unzählige kleine Faktoide, die Sie 1-2 Tage nach Ihrer Begegnung brauchen werden.

Magento liebt OO. Seien Sie nicht überrascht, wenn Sie bei der Verfolgung einer Methode 5-10 verschiedene Klassen durchlaufen.

Lesen Sie die Anleitung des Designers hier . Es ist hauptsächlich für Grafikdesigner gedacht, aber Sie benötigen es, um zu verstehen, wo und warum die Ausgabe Ihres Moduls landet. Vergessen Sie dazu nicht, "Vorlagenpfad-Hinweise" im Entwicklerbereich des Admin-Panels zu aktivieren.

Es gibt noch mehr, aber ich höre hier auf, bevor daraus eine Dissertation wird.

38

Ich werde eher Mage2Gen empfehlen, dies wird Ihnen helfen, die Boilerplate zu generieren und Sie können sich einfach auf die Kerngeschäftslogik konzentrieren. es hilft nur die Dinge zu beschleunigen. 

2
Sajid

Ein Magento-Modul ist eine Gruppe von Verzeichnissen, die Blöcke, Controller, Helfer und Modelle enthalten, die zum Erstellen einer bestimmten Geschäftsfunktion erforderlich sind. Es ist die Anpassungseinheit in der Magento-Plattform. Magento-Module können so erstellt werden, dass sie mehrere Funktionen mit unterstützender Logik ausführen, um die Benutzererfahrung und das Erscheinungsbild des Geschäfts zu beeinflussen. Es hat einen Lebenszyklus, in dem sie installiert, gelöscht oder deaktiviert werden können. Aus Sicht der Händler und Erweiterungsentwickler sind Module die zentrale Einheit der Magento-Plattform.

Modulerklärung

Wir müssen das Modul mithilfe der Konfigurationsdatei deklarieren. Als Magento 2 nach Konfigurationsmodul im Verzeichnis etc des Moduls suchen. Nun erstellen wir die Konfigurationsdatei module.xml.

Der Code sieht so aus:

<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Cloudways_Mymodule" setup_version="1.0.0"></module> </config>

Registrierung des Moduls Das Modul muss im Magento 2-System mithilfe der Registrar-Klasse "Magento Component" registriert werden. Jetzt erstellen wir die Datei registration.php im Stammverzeichnis des Moduls:

app/code/Cloudways/Mymodule/registration.php

Der Kodex wird so aussehen:

?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Cloudways_Mymodule',
__DIR__
);

Modulstatus prüfen Nachdem Sie die obigen Schritte ausgeführt haben, hätten wir ein einfaches Modul erstellt. Jetzt prüfen wir den Status des Moduls und ob es aktiviert oder deaktiviert ist, indem Sie die folgende Befehlszeile verwenden:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

Teilen Sie Ihr Feedback, sobald Sie den gesamten Prozess durchlaufen haben

0