Jak utworzyć prosty moduł „Hello World” w Magento?


305

Jak można wykonać następujące czynności w Magento?

  • Wyświetl komunikat „Hello World” za pomocą kontrolera / widoku / modelu. Tak więc, gdybym do http://example.com/myControllerniego podszedł , pokazywałby ciąg „Hello World”. Możliwość pokazania tego ciągu w szablonie mojej witryny (na przykład nagłówek, stopka itp.) Będzie dodatkowym atutem.

  • Jak dodać metodę do tego kontrolera (lub nowego kontrolera, jeśli to konieczne), który współdziała z modelem i wykonuje zapytanie Select * FROM articles where id='10'i zwraca wiersz (zawierający kolumny id, title, content) do kontrolera? A następnie użyj kontrolera, aby dołączyć widok, który wyświetli ten wiersz. Więc przejście do http://example.com/myController/show_row(lub czegoś podobnego) spowoduje wyświetlenie wiersza w widoku. (Nie musisz być fantazyjny, wystarczyłoby echo $row->id;coś podobnego.)

Wszelkie inne informacje o strukturze kodu Magento również będą bardzo pomocne.


6
Wygląda na to, że system nie rekgonuje twojej nagrody.
Alan Storm

2
Nie mogę jeszcze otworzyć nagrody, ponieważ nie ma ona 48 godzin ... ale otworzę ją jak najszybciej i przyznam najlepszą odpowiedź
kliknij Upvote

Ach, nie wiedziałem, że nagrody przyznawane były tylko za starsze posty, przeprosiny.
Alan Storm

3
Jako dziecko zawsze miał skłonność do magents; jego kod działa w ten sam sposób.
vol7ron

Odpowiedzi:


539

Przede wszystkim gorąco polecam zakup PDF / E-Book od PHP Architect . Jest to 20 USD, ale jest to jedyny prosty zasób „Oto jak działa Magento”, jaki udało mi się znaleźć. Zacząłem też pisać samouczki Magento na mojej stronie internetowej .

Po drugie, jeśli masz wybór i nie jesteś doświadczonym programistą lub nie masz dostępu do doświadczonego programisty (najlepiej w PHP i Javie), wybierz inny koszyk . Magento jest dobrze zaprojektowany, ale został zaprojektowany tak, aby był koszykiem, na którym inni programiści mogą budować moduły. Nie został zaprojektowany tak, aby był łatwy do zrozumienia dla ludzi, którzy są sprytni, ale nie są programistami.

Po trzecie, Magento MVC bardzo różni się od Ruby on Rails , Django , CodeIgniter , CakePHP itp. Model MVC, który jest obecnie popularny wśród programistów PHP. Myślę, że jest oparty na modelu Zend , a całość jest bardzo podobna do Java OOP. Jest dwa kontrolery trzeba być zaniepokojony. Kontroler modułu / frontName, a następnie kontroler MVC.

Po czwarte, sama aplikacja Magento jest zbudowana przy użyciu tego samego systemu modułów, którego używasz, więc szukanie kodu źródłowego jest przydatną taktyką uczenia się. Ponadto wiele z tego, co będziesz robić z Magento, zastępuje istniejące klasy. Omawiam tutaj tworzenie nowych funkcji, a nie zastępowanie. Należy o tym pamiętać, patrząc na próbki kodu tam.

Zacznę od pierwszego pytania, które pokazuje, jak skonfigurować kontroler / router, aby odpowiadał na określony adres URL. To będzie mała powieść. Mogę mieć trochę czasu na tematy związane z modelem / szablonem, ale na razie nie. Będę jednak krótko mówić na twoje pytanie SQL.

Magento korzysta z architektury bazy danych EAV . O ile to możliwe, spróbuj użyć obiektów modelu dostarczonych przez system, aby uzyskać potrzebne informacje. Wiem, że wszystko jest w tabelach SQL, ale najlepiej nie myśleć o pobieraniu danych za pomocą surowych zapytań SQL, bo inaczej oszalejesz.

Ostateczne wyłączenie odpowiedzialności. Używam Magento od około dwóch lub trzech tygodni, więc zastrzegaj sobie coś. To jest ćwiczenie, które pozwala mi zrozumieć to tak samo, jak pomoc w przepełnieniu stosu.

Utwórz moduł

Wszystkie dodatki i dostosowania do Magento są dokonywane za pośrednictwem modułów. Pierwszą rzeczą, którą musisz zrobić, to stworzyć nowy moduł. Utwórz plik XML o app/modulesnazwie w następujący sposób

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 to unikalna przestrzeń nazw dla twoich modyfikacji, nie musi to być nazwa twojej firmy, ale to zalecana konwencja moja magento. HelloWorldto nazwa twojego modułu.

Wyczyść pamięć podręczną aplikacji

Teraz, gdy plik modułu jest na miejscu, będziemy musieli powiadomić Magento o tym (i sprawdzić naszą pracę). W aplikacji administratora

  1. Przejdź do System-> Zarządzanie pamięcią podręczną
  2. Wybierz Odśwież z menu Cała pamięć podręczna
  3. Kliknij Zapisz ustawienia pamięci podręcznej

Teraz upewniamy się, że Magento wie o module

  1. Przejdź do System-> Konfiguracja
  2. Kliknij Zaawansowane
  3. W polu ustawień „Wyłącz wyjście modułów” znajdź nowy moduł o nazwie „MyCompanyName_HelloWorld”

Jeśli możesz żyć ze spowolnieniem wydajności, możesz chcieć wyłączyć pamięć podręczną aplikacji podczas programowania / nauki. Nie ma nic bardziej frustrującego niż zapomnienie wyczyszczenia pamięci podręcznej i zastanowienie się, dlaczego zmiany się nie pojawiają.

Skonfiguruj strukturę katalogów

Następnie będziemy musieli skonfigurować strukturę katalogów dla modułu. Nie będziesz potrzebować wszystkich tych katalogów, ale konfigurowanie ich teraz nie zaszkodzi.

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

I dodaj plik konfiguracyjny

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

i w pliku konfiguracyjnym dodaj następujący tekst, który jest zasadniczo „pustą” konfiguracją.

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

Upraszczając rzeczy, ten plik konfiguracyjny pozwoli Ci powiedzieć Magento, jaki kod chcesz uruchomić.

Konfigurowanie routera

Następnie musimy skonfigurować routery modułu. Dzięki temu system będzie wiedział, że obsługujemy wszelkie adresy URL w formie

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

Tak więc w pliku konfiguracyjnym dodaj następującą sekcję.

<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>

Mówisz tutaj: „dowolny adres URL z nazwą frontu helloworld ...

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

powinien użyć kontrolera frontName MyCompanyName_HelloWorld ".

Tak więc, przy powyższej konfiguracji, po załadowaniu powyższej strony helloworld otrzymasz stronę 404. To dlatego, że nie stworzyliśmy pliku dla naszego kontrolera. Zróbmy to teraz.

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

Teraz spróbuj załadować stronę. Postęp! Zamiast 404 otrzymasz wyjątek PHP / Magento

Controller file was loaded but class does not exist

Otwórz plik, który właśnie utworzyliśmy, i wklej następujący kod. Nazwa klasy musi być oparta na nazwie podanej w routerze.

<?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";
    }
}

Właśnie skonfigurowaliśmy sterownik modułu / frontName. Jest to domyślny kontroler i domyślna akcja modułu. Jeśli chcesz dodać kontrolery lub akcje, musisz pamiętać, że pierwsza część drzewa adresu URL Magento jest niezmienna, zawsze będą iść w tę stronęhttp://example.com/magento/index.php/frontName/controllerName/actionName

Więc jeśli chcesz dopasować ten adres URL

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

Będziesz musiał mieć FooController, który możesz zrobić w ten sposób:

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';
    }
}

Należy pamiętać, że domyślny kontroler IndexController i domyślna akcja indexAction mogą być niejawne, ale muszą być jawne, jeśli coś po tym nastąpi. http://example.com/magento/index.php/helloworld/fooDopasuje więc kontroler FooController i akcję indexAction, a NIE akcję fooAction IndexController. Jeśli chcesz mieć fooAction, w kontrolerze IndexController musisz wtedy wywołać ten kontroler jawnie w następujący sposób: http://example.com/magento/index.php/helloworld/index/fooponieważ druga część adresu URL jest i zawsze będzie nazwą kontrolera. To zachowanie jest dziedzictwem Zend Framework zawartym w Magento.

Powinieneś teraz być w stanie trafić w poniższe adresy URL i zobaczyć wyniki swoich instrukcji echa

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

To powinno dać ci podstawowy pomysł na to, jak Magento wysyła do kontrolera. Odtąd poleciłem zajrzeć do istniejących klas kontrolerów Magento, aby zobaczyć, jak należy używać modeli i systemu szablonów / układu.


4
Dzięki, to jest bardzo pomocne. Rozważ dodanie informacji o używaniu modelu / bazy danych i widoków, aby Twoja odpowiedź była kompletna
kliknij Upvote

7
upewnij się, że aplikacja / code / local / MyCompanyName / HelloWorld / etc / config.xml ma taki sam przypadek jak plik xml znajdujący się w etc / modules (MyCompanyName_HelloWorld NOT myfompanyname_helloworld), w przeciwnym razie będą wpisy w backend!
Moak,

8
Mam tylko mały komentarz do doskonałej odpowiedzi Alana: „Właśnie skonfigurowaliśmy kontroler moduł / frontName. To NIE jest kontroler MVC”. Jest to dokładnie ten sam typ kontrolera, co FooController. W ZF akcja indeksu w IndexController jest wywoływana domyślnie, więc żądanie example.com/magento/index.php/helloworld wywoła IndexController :: indexAction () w module helloworld. W ten sposób wywołanie ... / helloworld / foo spróbuje znaleźć FooController w module helloworld i wywołać na nim indexAction (). Aby uruchomić IndexController :: fooAction (), musisz poprosić: ... / helloworld / index / foo.
Matus Zeman

2
upewnij się, że przeczytałeś odpowiedź @Matus Zeman, aby zrozumieć, dlaczego nie znaleziono fooAction w IndexController, jest to po prostu „normalna” rzecz Zend Framework MVC / router i użyłeś złego adresu URL, więc powinieneś usunąć „To NIE jest Kontroler MVC ”część twojej odpowiedzi.
regilero

2
@ hypervisor666 Włącz „tryb programisty” (google it). Przy włączonym trybie programisty Magento zawiesza się przy wszelkich błędach w plikach XML.
Alan Storm

39

Walczyłem z Magento od około miesiąca i wciąż próbuję to rozgryźć. Jest to przypadek niewidomego prowadzącego niewidomego. Dokumentacja jest niewielka, a forum / wiki jest w najlepszym razie chaotyczne. Ponadto istnieje kilka rozwiązań, które są albo przestarzałe, albo dalekie od optymalnych. Nie jestem pewien, czy masz projekt, czy po prostu próbujesz go rozgryźć, ale prawdopodobnie łatwiej jest zacząć od zmodyfikowania istniejącej funkcjonalności zamiast tworzenia czegoś zupełnie nowego. W tym celu zdecydowanie skorzystam z „Zalecanych artykułów dla programistów” na wiki. Nowa metoda płatności była naprawdę atrakcyjna.

Do debugowania zdecydowanie polecam użycie FirePHP i sprawdzenie źródła HTML, gdy coś pójdzie nie tak. Metoda debugowania ole echo nie działa tak dobrze.

Ogólna architektura jest tak zadziwiająco złożona, że ​​nawet jeśli ją całkowicie rozumiem, musiałbym napisać książkę na jej temat. Najlepsze, co mogę zrobić, to dać ci radę, jakiej życzyłby mi ktoś, kiedy zaczynałem ...

Unikaj podstawowych plików. Nie modyfikuj ich, zamiast tego napisz własny moduł i zastąp to, czego potrzebujesz.

Magento korzysta z plików konfiguracyjnych składających się z XML, aby zdecydować, co należy zrobić. Aby uruchomić własne rzeczy w przeciwieństwie do podstawowych funkcji, potrzebujesz poprawnego kodu XML. Niestety nie ma instrukcji, jak zbudować ci XML; musisz spojrzeć na przykłady i przeprowadzić poważne testy. Aby skomplikować sprawę, w zawartości tych plików rozróżniana jest wielkość liter. Jednak jeśli je opanujesz, możesz zastąpić dowolną część podstawowej funkcjonalności, która tworzy bardzo wydajny system.

Magento używa metod, takich jak Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper')aby powrócić obiekty niektórych klas. Znajduje je domyślnie w swojej głównej przestrzeni nazw. Jeśli chcesz, aby używał własnego, musisz zastąpić je w swoim config.xmlpliku.

Nazwa twoich klas musi odpowiadać folderowi, w którym się znajdują.

Wiele obiektów w Magento ostatecznie rozszerza coś o nazwie a Varien_Object. Jest to klasa ogólnego przeznaczenia (coś w rodzaju szwajcarskiego noża wojskowego), a jej celem w życiu jest umożliwienie definiowania własnych metod / zmiennych w locie. Na przykład zobaczysz, że jest używany jako gloryfikowana tablica do przesyłania danych z jednej metody do drugiej.

Podczas programowania upewnij się, że buforowanie jest wyłączone. Sprawi, że magento będzie niesamowicie powolny, ale pozwoli ci zaoszczędzić wiele urazów głowy (od uderzenia go w biurko).

Będziesz $thisczęsto używany. Oznacza inną klasę w zależności od tego, jaki plik ją widzisz. get_class($this)jest twoim przyjacielem, szczególnie w połączeniu z FirePHP.

Zanotuj rzeczy na papierze. Dużo. Istnieje niezliczona ilość faktoidów, których będziesz potrzebować 1-2 dni po ich spotkaniu.

Magento kocha OO. Nie zdziw się, jeśli śledzenie metody poprowadzi cię przez 5-10 różnych klas.

Przeczytaj przewodnik projektanta tutaj . Jest przeznaczony głównie dla projektantów graficznych, ale musisz go zrozumieć, gdzie i dlaczego skończy się wyjście z twojego modułu. W tym celu nie zapomnij włączyć opcji „Wskazówki dotyczące ścieżki szablonu” w sekcji dla programistów panelu administracyjnego.

Jest więcej, ale zatrzymam się tutaj, zanim przerodzi się w rozprawę.


Proszę pisać więcej, jeśli możesz, wszystkie informacje są bardzo pomocne :)
Kliknij Upvote

Misa, prawdopodobnie powinieneś zarejestrować się tutaj na Stackoverflow, jeśli zgubisz plik cookie, nie będzie już twojego przedstawiciela;)
Kliknij Upvote

Dziękuję Ci! To jest bardzo pomocne. Ner
Ner

2

Raczej polecę Mage2Gen , to pomoże ci wygenerować podstawkę i możesz skupić się na podstawowej logice biznesowej. po prostu pomaga to przyspieszyć.


0

Moduł Magento to grupa katalogów zawierających bloki, kontrolery, pomocniki i modele, które są potrzebne do utworzenia określonej funkcji sklepu. Jest to jednostka dostosowywania w platformie Magento. Moduły Magento można tworzyć w celu wykonywania wielu funkcji z logiką wspierającą, wpływającą na wrażenia użytkownika i wygląd sklepu. Ma cykl życia, który pozwala na ich instalację, usuwanie lub wyłączanie. Z perspektywy zarówno handlowców, jak i twórców rozszerzeń moduły są jednostką centralną platformy Magento.

Deklaracja modułu

Musimy zadeklarować moduł za pomocą pliku konfiguracyjnego. Jako Magento 2 wyszukaj moduł konfiguracji w katalogu etc modułu. Teraz stworzymy plik konfiguracyjny module.xml.

Kod będzie wyglądał następująco:

<?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>

Rejestracja modułu Moduł musi być zarejestrowany w systemie Magento 2 przy użyciu klasy Magento Component Registrar. Teraz utworzymy plik register.php w głównym katalogu modułu:

app/code/Cloudways/Mymodule/registration.php

Kod będzie wyglądał następująco:

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

Sprawdź status modułu Po wykonaniu powyższych kroków utworzylibyśmy prosty moduł. Teraz sprawdzimy status modułu i to, czy jest włączony, czy wyłączony za pomocą następującego wiersza poleceń:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

Podziel się swoją opinią po zakończeniu całego procesu


0

Próbowałem zrobić mój moduł z samouczka magaplaza hello world, ale coś poszło nie tak. Zaimportowałem kod tego modułu https://github.com/astorm/magento2-hello-world z github i działało. z tego modułu utworzyłem go podkategorie kategorii ajax select drops drops Moduł. Po zainstalowaniu go w katalogu aap / code instalacji magento2 postępuj zgodnie z tym adresem URL. Http://www.example.com/hello_mvvm/hello/world Możesz pobrać jego kod stąd https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns i umieść go w folderze aap / code. niż uruchomić te polecenia ...

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

Teraz możesz sprawdzić funkcjonalność modułu za pomocą następującego adresu URL http: // {{www.example.com}} / hello_mvvm / hello / world


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.