Bagaimana cara membuat modul 'Hello World' sederhana di Magento?


305

Bagaimana hal-hal berikut dapat diselesaikan di Magento?

  • Tampilkan pesan "Hello World" menggunakan pendekatan controller / view / model. Jadi, jika saya pergi ke http://example.com/myControllersana akan menampilkan string 'Hello World'. Mampu menunjukkan string ini di dalam templat situs web saya (misalnya, tajuk, catatan kaki, dll.) Akan menjadi bonus.

  • Bagaimana cara menambahkan metode ke pengontrol ini (atau pengontrol baru jika perlu), yang berinteraksi dengan model, dan melakukan kueri Select * FROM articles where id='10'dan mengembalikan baris (berisi kolom id, title, content) ke pengontrol? Dan kemudian gunakan controller untuk menyertakan tampilan, yang akan menampilkan baris ini. Jadi akan http://example.com/myController/show_row(atau yang serupa) akan menampilkan baris dalam tampilan. (Tidak perlu mewah, hanya echo $row->id;atau sesuatu yang serupa akan bekerja.)

Informasi lain tentang struktur kode Magento juga akan sangat membantu.


6
Sepertinya sistem tidak merekomendasikan karunia Anda.
Alan Storm

2
Saya belum dapat membuka hadiah karena belum berusia 48 jam .. tapi saya akan membukanya sesegera mungkin dan saya akan menghadiahkannya pada jawaban terbaik
Klik Upvote

Ah, saya tidak tahu karunia hanya berlaku untuk posting lama, permintaan maaf.
Alan Storm

3
Sebagai seorang anak, ia selalu memiliki kecenderungan untuk menjadi penyihir; kodenya bekerja dengan cara yang sama.
vol7ron

Jawaban:


539

Pertama dan terutama, saya sangat menyarankan Anda membeli PDF / E-Book dari Arsitek PHP . Ini US $ 20, tetapi satu-satunya sumber daya "Begini cara Magento bekerja" yang dapat saya temukan. Saya juga mulai menulis tutorial Magento di situs web saya sendiri .

Kedua, jika Anda memiliki pilihan, dan bukan programmer yang berpengalaman atau tidak memiliki akses ke programmer yang berpengalaman (idealnya dalam PHP dan Java), pilih keranjang lain . Magento direkayasa dengan baik, tetapi direkayasa untuk menjadi solusi keranjang belanja yang dapat dibuat oleh programmer lain. Itu tidak direkayasa agar mudah dipahami oleh orang-orang yang pintar, tetapi bukan programmer.

Ketiga, Magento MVC sangat berbeda dari Ruby on Rails , Django , CodeIgniter , CakePHP , dll. Model MVC yang populer di kalangan pengembang PHP dewasa ini. Saya pikir ini didasarkan pada model Zend , dan semuanya sangat mirip Java OOP. Ada dua pengendali yang perlu Anda perhatikan. Modul / pengontrol frontName, dan kemudian pengontrol MVC.

Keempat, aplikasi Magento sendiri dibangun menggunakan sistem modul yang sama dengan yang akan Anda gunakan, jadi mencari-cari kode inti adalah taktik belajar yang berguna. Selain itu, banyak hal yang akan Anda lakukan dengan Magento adalah mengesampingkan kelas yang ada. Yang saya bahas di sini adalah menciptakan fungsionalitas baru, bukan mengesampingkan. Ingatlah ini ketika Anda melihat contoh kode di luar sana.

Saya akan mulai dengan pertanyaan pertama Anda, menunjukkan kepada Anda cara mengatur controller / router untuk menanggapi URL tertentu. Ini akan menjadi novel kecil. Saya mungkin punya waktu nanti untuk topik terkait model / template, tetapi untuk saat ini, saya tidak. Namun, saya akan berbicara singkat dengan pertanyaan SQL Anda.

Magento menggunakan arsitektur basis data EAV . Kapan pun memungkinkan, cobalah untuk menggunakan objek model yang disediakan sistem untuk mendapatkan informasi yang Anda butuhkan. Saya tahu itu semua ada di tabel SQL, tapi yang terbaik adalah tidak memikirkan mengambil data menggunakan query SQL mentah, atau Anda akan menjadi gila.

Penafian akhir. Saya telah menggunakan Magento selama sekitar dua atau tiga minggu, jadi emptor peringatan. Ini adalah latihan untuk meluruskan ini di kepala saya sebanyak itu untuk membantu Stack Overflow.

Buat modul

Semua penambahan dan penyesuaian pada Magento dilakukan melalui modul. Jadi, hal pertama yang perlu Anda lakukan adalah membuat modul baru. Buat file XML dengan app/modulesnama sebagai berikut

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 adalah namespace unik untuk modifikasi Anda, tidak harus nama perusahaan Anda, tetapi konvensi yang direkomendasikan magento saya. HelloWorldadalah nama modul Anda.

Bersihkan cache aplikasi

Sekarang file modul sudah ada, kita perlu memberi tahu Magento tentang hal itu (dan memeriksa pekerjaan kita). Dalam aplikasi admin

  1. Pergi ke Sistem-> Manajemen Cache
  2. Pilih Refresh dari menu All Cache
  3. Klik Simpan pengaturan Cache

Sekarang, kami memastikan bahwa Magento tahu tentang modul

  1. Pergi ke System-> Configuration
  2. Klik Tingkat Lanjut
  3. Di kotak pengaturan "Nonaktifkan modul keluaran", cari modul baru Anda bernama "MyCompanyName_HelloWorld"

Jika Anda dapat hidup dengan kinerja melambat, Anda mungkin ingin mematikan cache aplikasi saat mengembangkan / belajar. Tidak ada yang lebih membuat frustrasi daripada melupakan membersihkan cache dan bertanya-tanya mengapa perubahan Anda tidak muncul.

Atur struktur direktori

Selanjutnya, kita perlu mengatur struktur direktori untuk modul. Anda tidak akan memerlukan semua direktori ini, tetapi tidak ada salahnya mengatur semuanya sekarang.

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

Dan tambahkan file konfigurasi

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

dan di dalam file konfigurasi, tambahkan berikut ini, yang pada dasarnya merupakan konfigurasi "kosong".

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

Menyederhanakan masalah, file konfigurasi ini memungkinkan Anda memberi tahu Magento kode apa yang ingin Anda jalankan.

Menyiapkan router

Selanjutnya, kita perlu mengatur router modul. Ini akan membuat sistem tahu bahwa kami menangani URL apa pun dalam bentuk

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

Jadi, di file konfigurasi Anda, tambahkan bagian berikut.

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

Apa yang Anda katakan di sini adalah "URL apa pun dengan nama depan helloworld ...

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

harus menggunakan pengontrol frontName MyCompanyName_HelloWorld ".

Jadi, dengan konfigurasi di atas, ketika Anda memuat halaman helloworld di atas, Anda akan mendapatkan 404 halaman. Itu karena kami belum membuat file untuk controller kami. Ayo lakukan sekarang.

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

Sekarang coba muat halaman. Kemajuan! Alih-alih 404, Anda akan mendapatkan pengecualian PHP / Magento

Controller file was loaded but class does not exist

Jadi, buka file yang baru saja kita buat, dan rekatkan dalam kode berikut. Nama kelas harus didasarkan pada nama yang Anda berikan di router Anda.

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

Yang baru saja kita siapkan adalah module / frontName controller. Ini adalah pengontrol default dan aksi default modul. Jika Anda ingin menambahkan pengontrol atau tindakan, Anda harus ingat bahwa pohon bagian pertama dari URL Magento tidak dapat diubah mereka akan selalu berjalan seperti inihttp://example.com/magento/index.php/frontName/controllerName/actionName

Jadi jika Anda ingin mencocokkan url ini

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

Anda harus memiliki FooController, yang dapat Anda lakukan dengan cara ini:

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

Harap dicatat bahwa pengontrol IndexController default dan indexAction tindakan default dapat secara implisit tetapi harus eksplisit jika sesuatu datang setelahnya. Jadi http://example.com/magento/index.php/helloworld/fooakan cocok dengan kontroler FooController dan action indexAction dan BUKAN action fooAction dari IndexController. Jika Anda ingin memiliki fooAction, di controller IndexController Anda kemudian harus memanggil controller ini secara eksplisit seperti ini: http://example.com/magento/index.php/helloworld/index/fookarena bagian kedua dari url adalah dan akan selalu menjadi controllerName. Perilaku ini merupakan warisan Zend Framework yang dibundel dalam Magento.

Anda sekarang harus dapat menekan URL berikut dan melihat hasil pernyataan gema Anda

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

Jadi, itu seharusnya memberi Anda ide dasar tentang bagaimana Magento dikirim ke controller. Dari sini saya merekomendasikan untuk melihat-lihat di kelas kontroler Magento yang ada untuk melihat bagaimana model dan sistem template / layout harus digunakan.


4
Terima kasih, ini sangat membantu. Silakan pertimbangkan untuk menambahkan beberapa info tentang penggunaan model / database dan tampilan sehingga jawaban Anda dapat lengkap
Klik Upvote

7
pastikan bahwa app / code / local / MyCompanyName / HelloWorld / etc / config.xml memiliki case yang sama dengan xml yang terletak di etc / modules (MyCompanyName_HelloWorld BUKAN mycompanyname_helloworld) jika tidak akan ada entri di backend!
Moak

8
Saya mendapat sedikit komentar tentang jawaban sempurna Alan: "Apa yang baru saja kita siapkan adalah modul / pengontrol frontName. Ini BUKAN pengontrol MVC." Ini adalah jenis pengontrol yang persis sama dengan FooController. Dalam tindakan indeks ZF di IndexController disebut secara default, jadi meminta example.com/magento/index.php/helloworld akan memanggil IndexController :: indexAction () dalam modul helloworld. Dengan demikian memanggil ... / helloworld / foo akan mencoba menemukan FooController di modul helloworld dan memanggil indexAction () di atasnya. Untuk memicu IndexController :: fooAction () Anda perlu meminta: ... / helloworld / index / foo.
Matus Zeman

2
pastikan Anda membaca respons dari @Matus Zeman untuk memahami mengapa fooAction tidak ditemukan di IndexController, itu hanya hal biasa Zend Framework MVC / router dan Anda menggunakan url yang buruk, jadi Anda harus menghapus "Ini BUKAN Kontroler MVC "bagian dari jawaban Anda.
regilero

2
@ hypervisor666 Nyalakan "mode pengembang" (google it). Dengan mode pengembang aktif, Magento akan macet jika ada kesalahan dalam file XML.
Alan Storm

39

Saya telah bergulat dengan Magento selama sebulan terakhir ini dan saya masih berusaha mencari tahu. Jadi ini adalah kasus orang buta menuntun orang buta. Ada sedikit cara dokumentasi dan forum / wiki kacau di terbaik. Bukan hanya itu, tetapi ada beberapa solusi yang sudah usang atau jauh dari optimal. Saya tidak yakin apakah Anda memiliki proyek atau hanya berusaha mencari tahu, tetapi mungkin lebih mudah jika Anda mulai dengan memodifikasi fungsionalitas yang ada sebagai lawan menciptakan sesuatu yang sama sekali baru. Untuk itu saya pasti akan pergi dengan "Artikel yang disarankan untuk pengembang" di wiki. Metode pembayaran baru adalah pembuka mata yang nyata.

Untuk debugging, saya pasti akan merekomendasikan menggunakan FirePHP dan melihat sumber HTML Anda ketika ada masalah. Metode debug ole echo tidak benar-benar berfungsi dengan baik.

Arsitektur umum begitu rumit, sehingga bahkan jika saya benar-benar memahaminya, saya perlu menulis buku untuk menutupinya. Yang terbaik yang bisa saya lakukan adalah memberi Anda saran, saya berharap seseorang memberi saya ketika saya pertama kali mulai ...

Tinggal jauh dari file inti. Jangan memodifikasinya, tulis modul Anda sendiri dan timpa apa yang Anda butuhkan.

Magento menggunakan file config yang terdiri dari XML untuk memutuskan apa yang perlu dilakukan. Untuk menjalankannya sendiri, bukan fungsi inti, Anda perlu xml yang benar. Sayangnya tidak ada panduan tentang cara membangun XML Anda; Anda perlu melihat contoh dan melakukan beberapa pengujian serius. Untuk mempersulit hal-hal, isi dari file-file ini sebagian besar case-sensitive. Namun, jika Anda menguasainya, Anda dapat mengganti bagian mana pun dari fungsi dasar yang membuat sistem menjadi sangat kuat.

Magento menggunakan metode seperti Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper')untuk kembali objek dari kelas-kelas tertentu. Ia menemukan ini secara default di namespace intinya. Jika Anda ingin menggunakan milik Anda sendiri, Anda harus menimpanya di config.xmlfile Anda .

Nama kelas Anda harus sesuai dengan folder tempat mereka berada.

Banyak objek di Magento pada akhirnya memperluas sesuatu yang disebut Varien_Object. Ini adalah kelas tujuan umum (jenis seperti pisau tentara swiss) dan tujuannya dalam hidup adalah untuk memungkinkan Anda menentukan metode / variabel Anda sendiri dengan cepat. Sebagai contoh, Anda akan melihatnya digunakan sebagai array yang dimuliakan untuk meneruskan data dari satu metode ke metode lainnya.

Selama pengembangan, pastikan caching Anda dinonaktifkan. Ini akan membuat magento sangat lambat, tetapi itu akan menyelamatkan Anda dari banyak trauma kepala (dari membenturkannya di meja Anda).

Anda akan melihat $thisbanyak digunakan. Ini berarti kelas yang berbeda tergantung pada file apa yang Anda lihat. get_class($this)adalah teman Anda, terutama dalam hubungannya dengan FirePHP.

Tuliskan semuanya di atas kertas. Banyak. Ada banyak factoids kecil yang Anda butuhkan 1-2 hari setelah Anda bertemu mereka.

Magento mencintai OO. Jangan kaget jika melacak suatu metode akan membawa Anda melewati 5-10 kelas yang berbeda.

Baca panduan desainer di sini . Sebagian besar dimaksudkan untuk desainer grafis, tetapi Anda perlu memahami di mana dan mengapa output dari modul Anda akan berakhir. Untuk itu jangan lupa nyalakan "Petunjuk jalur templat" di bagian pengembang panel admin.

Masih ada lagi, tetapi saya akan berhenti di sini sebelum ini berubah menjadi disertasi.


Silakan posting lebih banyak jika Anda bisa, semua info sangat membantu :)
Klik Upvote

Misa, Anda mungkin harus mendaftar di sini di Stackoverflow, jika Anda kehilangan cookie Anda, semua perwakilan Anda akan hilang;)
Klik Suara positif

Terima kasih! Ini sangat membantu. Ner
Ner

2

Saya lebih suka merekomendasikan Mage2Gen , ini akan membantu Anda menghasilkan boilerplate dan Anda hanya bisa fokus pada logika bisnis inti. itu hanya membantu mempercepat hal-hal.


0

Modul Magento adalah sekelompok direktori yang berisi blok, pengontrol, pembantu, dan model yang diperlukan untuk membuat fitur toko tertentu. Ini adalah unit penyesuaian di platform Magento. Modul Magento dapat dibuat untuk melakukan banyak fungsi dengan logika yang mendukung untuk memengaruhi pengalaman pengguna dan tampilan etalase. Ini memiliki siklus hidup yang memungkinkan mereka untuk diinstal, dihapus, atau dinonaktifkan. Dari perspektif pedagang dan pengembang ekstensi, modul adalah unit utama dari platform Magento.

Deklarasi Modul

Kita harus mendeklarasikan modul dengan menggunakan file konfigurasi. Ketika Magento 2 mencari modul konfigurasi di direktori modul. Jadi sekarang kita akan membuat file konfigurasi module.xml.

Kode akan terlihat seperti ini:

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

Pendaftaran Modul Modul harus didaftarkan di sistem Magento 2 dengan menggunakan kelas Magento Component Registrar. Sekarang kita akan membuat file registration.php di direktori root modul:

app/code/Cloudways/Mymodule/registration.php

Kode akan terlihat seperti ini:

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

Periksa Status Modul Setelah mengikuti langkah-langkah di atas, kita akan membuat modul sederhana. Sekarang kita akan memeriksa status modul dan apakah itu diaktifkan atau dinonaktifkan dengan menggunakan baris perintah berikut:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

Bagikan umpan balik Anda setelah Anda melalui proses yang lengkap


0

Saya mencoba membuat modul saya dari tutorial halo dunia magaplaza, tetapi ada yang salah. Saya mengimpor kode modul ini https://github.com/astorm/magento2-hello-world dari github dan berhasil. dari modul itu, saya membuatnya menjadi kategori subkategori ajax pilih drop down Modul. Setelah menginstalnya di direktori aap / code dari instalasi magento2 Anda, ikuti URL ini .. http://www.example.com/hello_mvvm/hello/world Anda dapat mengunduh kodenya dari sini https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns dan letakkan di folder aap / code Anda. daripada menjalankan perintah ini ...

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

Sekarang Anda dapat memeriksa fungsionalitas modul dengan URL berikut http: // {{www.example.com}} / hello_mvvm / hello / world


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.