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


305

Wie kann Folgendes in Magento erreicht werden?

  • Zeigen Sie eine "Hallo Welt" -Nachricht mit einem Controller / View / Model-Ansatz an. Wenn ich dorthin gehen http://example.com/myControllerwürde, würde die Zeichenfolge 'Hello World' angezeigt. Die Möglichkeit, diese Zeichenfolge in der Vorlage meiner Website anzuzeigen (z. B. Kopf- und Fußzeile usw.), ist ein Bonus.

  • Wie füge ich diesem Controller (oder ggf. einem neuen Controller) eine Methode hinzu, die mit einem Modell interagiert, die Abfrage ausführt Select * FROM articles where id='10'und die Zeile (mit den Spalten id, title, content) an den Controller zurückgibt ? Verwenden Sie dann den Controller, um eine Ansicht einzuschließen, in der diese Zeile angezeigt wird. Wenn Sie also 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 ähnliches würde funktionieren.)

Alle anderen Informationen zur Codestruktur von Magento sind ebenfalls sehr hilfreich.


6
Sieht so aus, als würde das System Ihr Kopfgeld nicht rekgonisieren.
Alan Storm

2
Ich kann das Kopfgeld noch nicht öffnen, weil es nicht 48 Stunden alt ist. Aber ich werde es öffnen, sobald ich kann, und ich werde es der besten Antwort
zuweisen

Ah, ich wusste nicht, dass Kopfgelder nur für ältere Beiträge gelten, entschuldige.
Alan Storm

3
Als Kind hatte er immer eine Anziehungskraft auf Magente; Sein Code funktioniert genauso.
Vol7ron

Antworten:


539

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

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

Drittens unterscheidet sich Magento MVC stark von Ruby on Rails , Django , CodeIgniter , CakePHP usw. Das MVC-Modell, das heutzutage bei PHP-Entwicklern beliebt ist. Ich denke, es basiert auf dem Zend- Modell und das Ganze ist sehr Java OOP-ähnlich. 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 überschreiben Sie mit Magento häufig vorhandene Klassen. Was ich hier behandele, ist das Erstellen neuer Funktionen, nicht das Überschreiben. Denken Sie daran, wenn Sie sich die Codebeispiele ansehen.

Ich beginne mit Ihrer ersten Frage und zeige Ihnen, wie Sie einen Controller / Router einrichten, um auf eine bestimmte URL zu antworten. Dies wird ein kleiner Roman sein. Ich habe vielleicht später Zeit für die modell- / vorlagenbezogenen Themen, aber im Moment nicht. 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 zu erhalten. Ich weiß, dass alles in den SQL-Tabellen enthalten ist, 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 Vorbehalt. Dies ist eine Übung, um dies in meinem Kopf klar zu machen und um den Stapelüberlauf zu unterstützen.

Erstellen Sie ein Modul

Alle Ergänzungen und Anpassungen zu Magento erfolgen über Module. Als erstes müssen Sie ein neues Modul erstellen. Erstellen Sie eine XML-Datei app/modulesmit 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 ist mein Magento. HelloWorldist der Name Ihres Moduls.

Leeren 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-Verwaltung
  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 einer Leistungsabnahme leben können, möchten Sie möglicherweise den Anwendungscache während der Entwicklung / des 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 mitteilen, welchen Code 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 alle 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 ".

Wenn Sie also mit der obigen Konfiguration die helloworld-Seite oben laden, erhalten Sie eine 404-Seite. Das liegt daran, dass wir keine Datei für unseren Controller erstellt haben. Lass uns das jetzt machen.

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

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

Controller file was loaded but class does not exist

Öffnen Sie also die gerade 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 das Modul / FrontName-Controller. Dies ist der Standard-Controller und die Standardaktion des Moduls. Wenn Sie Controller oder Aktionen hinzufügen möchten, müssen Sie sich daran erinnern, dass der erste Teil einer Magento-URL unveränderlich ist und immer so abläufthttp://example.com/magento/index.php/frontName/controllerName/actionName

Also, wenn Sie dieser URL entsprechen möchten

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

Sie benötigen einen FooController, den Sie folgendermaßen ausführen 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 Standard-Controller IndexController und die Standardaktion indexAction implizit sein können, aber explizit sein müssen, wenn etwas danach kommt. So http://example.com/magento/index.php/helloworld/foowird die Steuerung FooController und die Aktion index entsprechen und nicht die Handlung fooAction des Indexcontroller. Wenn Sie eine Funktion haben möchten, müssen Sie diesen Controller im Controller-IndexController explizit so aufrufen: http://example.com/magento/index.php/helloworld/index/fooDer zweite Teil der URL ist und bleibt der Controller-Name . Dieses Verhalten ist eine Vererbung des in Magento gebündelten 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 also eine grundlegende Vorstellung davon geben, wie Magento an einen Controller versendet. Von hier aus hatte ich empfohlen, in den vorhandenen Magento-Controller-Klassen zu stöbern, um zu sehen, wie Modelle und das Vorlagen- / Layoutsystem verwendet werden sollten.


4
Danke, das ist sehr hilfreich. Bitte erwägen Sie, einige Informationen zur Verwendung von Modell / Datenbank und Ansichten hinzuzufügen, damit Ihre Antwort vollständig sein kann
Klicken Sie auf Upvote

7
Stellen Sie sicher, dass die App / code / local / MyCompanyName / HelloWorld / etc / config.xml den gleichen Fall hat wie die XML in etc / modules (MyCompanyName_HelloWorld NOT mycompanyname_helloworld), da sonst Einträge im Backend vorhanden sind!
Moak

8
Ich habe nur einen kleinen Kommentar zu Alans perfekter Antwort: "Was wir gerade eingerichtet haben, ist der Modul- / FrontName-Controller. Dies ist NICHT der MVC-Controller." Es ist genau der gleiche Controllertyp wie der FooController. In ZF wird die Indexaktion in IndexController standardmäßig aufgerufen. Wenn Sie also example.com/magento/index.php/helloworld anfordern, wird IndexController :: indexAction () im Modul helloworld aufgerufen. Wenn Sie also ... / helloworld / foo aufrufen, wird versucht, FooController im helloworld-Modul zu finden und indexAction () darauf aufzurufen. Um IndexController :: fooAction () auszulösen, müssen Sie Folgendes anfordern: ... / helloworld / index / foo.
Matus Zeman

2
Stellen Sie sicher, dass Sie die Antwort von @Matus Zeman gelesen haben, um zu verstehen, warum fooAction nicht auf dem IndexController gefunden wurde. Es handelt sich lediglich um eine "normale" Zend Framework MVC / Router-Sache, und Sie haben die schlechte URL verwendet. Entfernen Sie daher das "Dies ist NICHT das" MVC-Controller "Teil Ihrer Antwort.
Regilero

2
@ hypervisor666 Aktivieren Sie den "Entwicklermodus" (google it). Wenn der Entwicklermodus aktiviert ist, stürzt Magento bei Fehlern in XML-Dateien ab.
Alan Storm

39

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

Zum Debuggen würde ich definitiv empfehlen , FirePHP zu verwenden und sich Ihre HTML-Quelle anzusehen, wenn etwas schief geht. Die Ole-Echo-Debug-Methode funktioniert nicht so gut.

Die allgemeine Architektur ist so unglaublich komplex, dass ich, selbst wenn ich sie vollständig verstanden hätte, ein Buch schreiben müsste, um sie zu behandeln. Das Beste, was ich tun kann, ist, Ihnen Ratschläge zu geben. Ich wünschte, jemand hätte mich gegeben, als ich anfing ...

Halten Sie sich von Kerndateien fern. Ändern Sie sie nicht, sondern schreiben Sie Ihr eigenes Modul und überschreiben Sie, was Sie benötigen.

Magento verwendet Konfigurationsdateien, die aus XML bestehen, um zu entscheiden, was zu tun ist. Damit es im Gegensatz zur Kernfunktionalität eigene Inhalte ausführt, benötigen Sie die richtige XML. 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, unterscheidet der Inhalt dieser Dateien weitgehend zwischen Groß- und Kleinschreibung. Wenn Sie diese jedoch beherrschen, können Sie jeden Teil der Grundfunktionalität überschreiben, die ein sehr leistungsfähiges System ergibt.

Magento nutzt Methoden wie Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper')zu Objekten bestimmter Klassen zurück. Diese werden standardmäßig in ihrem Kernnamespace gefunden. Wenn Sie möchten, dass es Ihr eigenes verwendet, müssen Sie diese in Ihrer config.xmlDatei überschreiben .

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

Viele der Objekte in Magento erweitern letztendlich etwas, das als a bezeichnet wird Varien_Object. Dies ist eine Allzweckklasse (ähnlich wie ein Schweizer Taschenmesser), deren Lebenszweck darin besteht, Ihnen zu ermöglichen, Ihre eigenen Methoden / Variablen im laufenden Betrieb zu definieren. Sie werden beispielsweise sehen, dass es als verherrlichtes Array verwendet wird, 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 wird Ihnen viel Kopftrauma ersparen (davor, es auf Ihren Schreibtisch zu schlagen).

Sie werden sehen, $thisdass viel benutzt wird. Dies bedeutet eine andere Klasse, je nachdem, 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 die Verfolgung einer Methode Sie durch 5-10 verschiedene Klassen führt.

Lesen Sie die Designer - Handbuch hier . Es ist hauptsächlich für Grafikdesigner gedacht, aber Sie müssen verstehen, wo und warum die Ausgabe Ihres Moduls landen wird. Vergessen Sie dazu nicht, im Entwicklerbereich des Admin-Panels "Vorlagenpfad-Hinweise" zu aktivieren.

Es gibt noch mehr, aber ich werde hier aufhören, bevor daraus eine Dissertation wird.


Bitte
poste

Misa, du solltest dich wahrscheinlich hier bei Stackoverflow registrieren, wenn du deinen Cookie verloren hast, wäre dein ganzer Repräsentant weg;)
Klicke auf Upvote

Danke dir! Das ist sehr hilfreich. Ner
Ner

2

Ich werde Mage2Gen eher empfehlen . Dies hilft Ihnen bei der Erstellung des Boilerplates und Sie können sich nur auf die Kerngeschäftslogik konzentrieren. es hilft nur, die Dinge zu beschleunigen.


0

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

Deklaration des Moduls

Wir müssen das Modul mithilfe der Konfigurationsdatei deklarieren. Suchen Sie als Magento 2 nach dem Konfigurationsmodul im Verzeichnis etc des Moduls. Jetzt erstellen wir die Konfigurationsdatei module.xml.

Der Code sieht folgendermaßen 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 mithilfe der Magento Component Registrar-Klasse im Magento 2-System registriert werden. Jetzt erstellen wir die Datei register.php im Stammverzeichnis des Moduls:

app/code/Cloudways/Mymodule/registration.php

Der Kodex sieht folgendermaßen aus:

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

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

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

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


0

Ich habe versucht, mein Modul aus dem Magaplaza Hallo Welt Tutorial zu machen, aber etwas ist schief gelaufen. Ich habe den Code dieses Moduls https://github.com/astorm/magento2-hello-world von github importiert und es hat funktioniert. Aus diesem Modul habe ich eine Kategorie erstellt. Unterkategorien Ajax Select Dropdowns Modul. Folgen Sie nach der Installation im aap / code-Verzeichnis Ihrer magento2-Installation dieser URL. Http://www.example.com/hello_mvvm/hello/world Sie können den Code hier herunterladen https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns und lege es in deinen aap / code Ordner. als diese Befehle ausführen ...

php bin/magento setup:update
php bin/magento setup:static-content:deploy -f
php bin/magento c:c

Jetzt können Sie die Modulfunktionalität unter folgender URL überprüfen: http: // {{www.example.com}} / hello_mvvm / hello / world


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.