Làm cách nào để tạo mô-đun 'Hello World' đơn giản trong Magento?


305

Làm thế nào sau đây có thể được thực hiện trong Magento?

  • Hiển thị thông báo "Hello World" bằng cách sử dụng phương pháp điều khiển / khung nhìn / mô hình. Vì vậy, nếu tôi đi đến http://example.com/myControllernó sẽ hiển thị chuỗi 'Hello World'. Có thể hiển thị chuỗi này trong mẫu trang web của tôi (ví dụ: tiêu đề, chân trang, v.v.) sẽ là một phần thưởng.

  • Làm cách nào để thêm phương thức vào bộ điều khiển này (hoặc bộ điều khiển mới nếu cần), tương tác với một mô hình và thực hiện truy vấn Select * FROM articles where id='10'và trả về hàng (chứa các cột id, title, content) cho bộ điều khiển? Và sau đó sử dụng bộ điều khiển để bao gồm một khung nhìn, sẽ hiển thị hàng này. Vì vậy, đi đến http://example.com/myController/show_row(hoặc một cái gì đó tương tự) sẽ hiển thị hàng trong một khung nhìn. (Không cần phải cầu kỳ, chỉ cần một echo $row->id;hoặc một cái gì đó tương tự sẽ hoạt động.)

Bất kỳ thông tin nào khác về cấu trúc mã của Magento cũng sẽ rất hữu ích.


6
Có vẻ như hệ thống không sắp xếp lại tiền thưởng của bạn.
Alan Storm

2
Tôi chưa thể mở tiền thưởng vì chưa đến 48 giờ .. nhưng tôi sẽ mở nó ngay khi có thể và tôi sẽ trao giải cho câu trả lời hay nhất
Nhấp vào Upvote

Ah, tôi không biết tiền thưởng chỉ áp dụng cho các bài viết cũ hơn, lời xin lỗi.
Alan Storm

3
Khi còn bé, anh luôn có một sự hấp dẫn đối với các pháp sư; mã của anh ấy hoạt động theo cùng một cách.
vol7ron

Câu trả lời:


539

Trước hết, tôi khuyên bạn nên mua PDF / E-Book từ PHP Architect . Đó là 20 đô la Mỹ, nhưng là tài nguyên "Đây là cách Magento hoạt động" đơn giản mà tôi có thể tìm thấy. Tôi cũng đã bắt đầu viết hướng dẫn Magento tại trang web của riêng mình .

Thứ hai, nếu bạn có một sự lựa chọn và không phải là một lập trình viên có kinh nghiệm hoặc không có quyền truy cập vào một lập trình viên có kinh nghiệm (lý tưởng là trong PHP Java), hãy chọn một giỏ hàng khác . Magento được thiết kế tốt, nhưng nó được thiết kế để trở thành một giải pháp giỏ hàng mà các lập trình viên khác có thể xây dựng các mô-đun trên đầu trang. Nó không được thiết kế để dễ hiểu bởi những người thông minh, nhưng không phải là lập trình viên.

Thứ ba, Magento MVC rất khác so với Ruby on Rails , Django , CodeIgniter , CakePHP , v.v. Mô hình MVC phổ biến với các nhà phát triển PHP ngày nay. Tôi nghĩ rằng nó dựa trên mô hình Zend và toàn bộ điều này rất giống với Java OOP. Có hai bộ điều khiển bạn cần quan tâm. Bộ điều khiển module / frontName và sau đó là bộ điều khiển MVC.

Thứ tư, bản thân ứng dụng Magento được xây dựng bằng cùng một hệ thống mô-đun mà bạn sẽ sử dụng, do đó, chọc vào mã lõi là một chiến thuật học tập hữu ích. Ngoài ra, rất nhiều điều bạn sẽ làm với Magento đang ghi đè các lớp hiện có. Những gì tôi trình bày ở đây là tạo ra chức năng mới, không ghi đè. Hãy ghi nhớ điều này khi bạn nhìn vào các mẫu mã ngoài kia.

Tôi sẽ bắt đầu với câu hỏi đầu tiên của bạn, chỉ cho bạn cách thiết lập bộ điều khiển / bộ định tuyến để trả lời một URL cụ thể. Đây sẽ là một cuốn tiểu thuyết nhỏ. Tôi có thể có thời gian sau đó cho các chủ đề liên quan đến mô hình / mẫu, nhưng hiện tại, tôi không có. Tuy nhiên, tôi sẽ nói ngắn gọn với câu hỏi SQL của bạn.

Magento sử dụng kiến trúc cơ sở dữ liệu EAV . Bất cứ khi nào có thể, hãy cố gắng sử dụng các đối tượng mô hình mà hệ thống cung cấp để có được thông tin bạn cần. Tôi biết tất cả đều có trong các bảng SQL, nhưng tốt nhất đừng nghĩ đến việc lấy dữ liệu bằng các truy vấn SQL thô, hoặc bạn sẽ phát điên.

Từ chối trách nhiệm cuối cùng. Tôi đã sử dụng Magento được khoảng hai hoặc ba tuần, vì vậy hãy cẩn thận. Đây là một bài tập để có được điều này ngay trong đầu tôi cũng như giúp Stack Overflow.

Tạo một mô-đun

Tất cả các bổ sung và tùy chỉnh cho Magento được thực hiện thông qua các mô-đun. Vì vậy, điều đầu tiên bạn cần làm là tạo một mô-đun mới. Tạo một tệp XML app/modulescó tên như sau

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 là một không gian tên duy nhất cho các sửa đổi của bạn, nó không phải là tên công ty của bạn, nhưng đó là quy ước được đề xuất cho magento của tôi. HelloWorldlà tên của mô-đun của bạn.

Xóa bộ nhớ cache của ứng dụng

Bây giờ đã có tệp mô-đun, chúng tôi sẽ cần cho Magento biết về nó (và kiểm tra công việc của chúng tôi). Trong ứng dụng quản trị

  1. Chuyển đến Hệ thống-> Quản lý bộ đệm
  2. Chọn Làm mới từ menu Tất cả Bộ nhớ cache
  3. Nhấp vào Lưu cài đặt bộ nhớ cache

Bây giờ, chúng tôi đảm bảo rằng Magento biết về mô-đun

  1. Đi đến Hệ thống-> Cấu hình
  2. Nhấp vào Nâng cao
  3. Trong hộp cài đặt "Tắt đầu ra mô-đun", hãy tìm mô-đun mới của bạn có tên "MyCompanyName_HelloWorld"

Nếu bạn có thể sống với hiệu suất chậm lại, bạn có thể muốn tắt bộ đệm ứng dụng trong khi phát triển / học tập. Không có gì khó chịu hơn sau đó quên đi việc xóa bộ nhớ cache và tự hỏi tại sao những thay đổi của bạn không hiển thị.

Thiết lập cấu trúc thư mục

Tiếp theo, chúng ta sẽ cần thiết lập cấu trúc thư mục cho mô-đun. Bạn sẽ không cần tất cả các thư mục này, nhưng không có hại trong việc thiết lập tất cả chúng ngay bây giờ.

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

Và thêm một tập tin cấu hình

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

và bên trong tệp cấu hình, thêm phần sau, về cơ bản là cấu hình "trống".

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

Đơn giản hóa mọi thứ, tệp cấu hình này sẽ cho phép bạn nói với Magento mã bạn muốn chạy.

Thiết lập bộ định tuyến

Tiếp theo, chúng ta cần thiết lập bộ định tuyến của mô-đun. Điều này sẽ cho hệ thống biết rằng chúng tôi đang xử lý bất kỳ URL nào dưới dạng

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

Vì vậy, trong tệp cấu hình của bạn, thêm phần sau.

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

Điều bạn đang nói ở đây là "bất kỳ URL nào có tên trước của hellowworld ...

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

nên sử dụng bộ điều khiển frontName MyCompanyName_HelloWorld ".

Vì vậy, với cấu hình ở trên, khi bạn tải trang hellowworld ở trên, bạn sẽ nhận được một trang 404. Đó là bởi vì chúng tôi đã không tạo một tệp cho bộ điều khiển của chúng tôi. Hãy làm điều đó ngay bây giờ.

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

Bây giờ hãy thử tải trang. Phát triển! Thay vì 404, bạn sẽ có ngoại lệ PHP / Magento

Controller file was loaded but class does not exist

Vì vậy, hãy mở tệp chúng ta vừa tạo và dán mã sau đây. Tên của lớp cần được dựa trên tên bạn đã cung cấp trong bộ định tuyến của mình.

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

Những gì chúng ta vừa thiết lập là bộ điều khiển module / frontName. Đây là bộ điều khiển mặc định và hành động mặc định của mô-đun. Nếu bạn muốn thêm bộ điều khiển hoặc hành động, bạn phải nhớ rằng phần đầu tiên của cây Magento là bất biến, chúng sẽ luôn đi theo cách nàyhttp://example.com/magento/index.php/frontName/controllerName/actionName

Vì vậy, nếu bạn muốn khớp url này

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

Bạn sẽ phải có một FooControll, bạn có thể làm theo cách này:

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

Xin lưu ý rằng bộ điều khiển mặc định IndexContoder và indexAction hành động mặc định có thể bằng cách ẩn nhưng phải rõ ràng nếu có thứ gì đó xuất hiện sau nó. Vì vậy, http://example.com/magento/index.php/helloworld/foosẽ khớp với bộ điều khiển FooContoder và indexAction hành động và KHÔNG phải là fooAction hành động của IndexContoder. Nếu bạn muốn có một fooAction, trong bộ điều khiển IndexContoder, sau đó bạn phải gọi bộ điều khiển này một cách rõ ràng theo cách này: http://example.com/magento/index.php/helloworld/index/foobởi vì phần thứ hai của url là và sẽ luôn là tên điều khiển. Hành vi này là sự kế thừa của Khung công tác Zend được gói trong Magento.

Bây giờ bạn có thể nhấn các URL sau và xem kết quả của báo cáo tiếng vang của bạn

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

Vì vậy, điều đó sẽ cung cấp cho bạn một ý tưởng cơ bản về cách Magento gửi đến bộ điều khiển. Từ đây, tôi khuyên bạn nên chọc vào các lớp trình điều khiển Magento hiện có để xem cách sử dụng các mô hình và hệ thống bố cục / mẫu.


4
Cảm ơn, điều này rất hữu ích. Vui lòng xem xét thêm một số thông tin về việc sử dụng mô hình / cơ sở dữ liệu và chế độ xem để câu trả lời của bạn có thể hoàn tất
Nhấp vào Upvote

7
đảm bảo rằng ứng dụng / code / local / MyCompanyName / HelloWorld / etc / config.xml có cùng trường hợp với xml nằm trong etc / mô-đun (MyCompanyName_HelloWorld KHÔNG mycompanyname_helloworld) nếu không sẽ có các mục trong phần phụ trợ!
Moak

8
Tôi vừa nhận được một nhận xét nhỏ về câu trả lời hoàn hảo của Alan: "Thứ chúng tôi vừa thiết lập là bộ điều khiển module / frontName. Đây không phải là bộ điều khiển MVC." Nó chính xác là cùng loại với bộ điều khiển như FooControll. Trong hành động chỉ mục ZF, IndexContoder được gọi theo mặc định, do đó, yêu cầu example.com/magento/index.php/helloworld sẽ gọi IndexContoder :: indexAction () trong mô-đun helloworld. Do đó, việc gọi ... / helloworld / foo sẽ cố gắng tìm FooControll trong mô-đun helloworld và gọi indexAction () trên đó. Để kích hoạt IndexControll :: fooAction (), bạn cần yêu cầu: ... / helloworld / index / foo.
Matus Zeman

2
đảm bảo bạn đã đọc phản hồi từ @Matus Zeman để hiểu lý do tại sao fooAction không được tìm thấy trên IndexContoder, đó chỉ là một thứ Zend Framework MVC / bộ định tuyến và bạn đã sử dụng url xấu, vì vậy bạn nên xóa "Đây không phải là Bộ điều khiển MVC "một phần trong câu trả lời của bạn.
regilero

2
@ hypervisor666 Bật "chế độ nhà phát triển" (google nó). Khi bật chế độ nhà phát triển, Magento sẽ gặp sự cố với bất kỳ lỗi nào trong các tệp XML.
Alan Storm

39

Tôi đã vật lộn với Magento trong tháng trước hoặc lâu hơn và tôi vẫn đang cố gắng tìm ra nó. Vì vậy, đây là một trường hợp của người mù dẫn đầu người mù. Có rất ít trong cách tài liệu và diễn đàn / wiki là hỗn loạn nhất. Không chỉ vậy, có một số giải pháp đã lỗi thời hoặc không còn tối ưu. Tôi không chắc chắn nếu bạn có một dự án hay chỉ đang cố gắng tìm ra nó, nhưng có lẽ sẽ dễ dàng hơn nếu bạn bắt đầu sửa đổi chức năng hiện có thay vì tạo ra một cái gì đó hoàn toàn mới. Vì vậy, tôi chắc chắn sẽ đi với "Các bài viết được đề xuất cho các nhà phát triển" trong wiki. Phương thức thanh toán mới là phương thức mở mắt thực sự.

Để gỡ lỗi, tôi chắc chắn khuyên bạn nên sử dụng FirePHP và xem xét nguồn HTML của bạn khi có sự cố. Phương pháp gỡ lỗi ole echo không thực sự hoạt động tốt.

Kiến trúc chung phức tạp đến mức khó tin, đến nỗi ngay cả khi tôi hoàn toàn hiểu nó, tôi vẫn cần viết một cuốn sách để che nó. Điều tốt nhất tôi có thể làm là cho bạn lời khuyên, tôi ước ai đó đã cho tôi khi tôi mới bắt đầu ...

Tránh xa các tập tin cốt lõi. Đừng sửa đổi chúng, thay vào đó hãy viết mô-đun của riêng bạn và ghi đè lên những gì bạn cần.

Magento sử dụng các tệp cấu hình bao gồm XML để quyết định những gì nó cần làm. Để có được nó chạy công cụ của riêng bạn trái với chức năng cốt lõi, bạn cần xml chính xác. Thật không may, không có hướng dẫn về cách xây dựng XML của bạn; bạn cần xem xét các ví dụ và làm một số thử nghiệm nghiêm túc. Để làm phức tạp mọi thứ, nội dung của các tệp này phần lớn là phân biệt chữ hoa chữ thường. Tuy nhiên, nếu bạn thành thạo những thứ này, bạn có thể ghi đè bất kỳ phần nào của chức năng cơ bản tạo nên một hệ thống rất mạnh.

Magento sử dụng các phương pháp thích Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper')để trở về đối tượng của các lớp học nhất định. Nó tìm thấy chúng theo mặc định trong không gian tên cốt lõi của nó. Nếu bạn muốn nó sử dụng của riêng bạn, bạn cần ghi đè những thứ này trong config.xmltệp của bạn .

Tên của các lớp của bạn phải tương ứng với thư mục họ đang ở.

Rất nhiều đối tượng trong Magento cuối cùng mở rộng một thứ gọi là a Varien_Object. Đây là một lớp mục đích chung (giống như một con dao quân đội Thụy Sĩ) và mục đích của nó trong cuộc sống là cho phép bạn xác định các phương thức / biến của riêng bạn một cách nhanh chóng. Ví dụ, bạn sẽ thấy nó được sử dụng như một mảng được tôn vinh để truyền dữ liệu từ phương thức này sang phương thức khác.

Trong quá trình phát triển, đảm bảo bộ nhớ đệm của bạn bị vô hiệu hóa. Nó sẽ làm cho magento cực kỳ chậm, nhưng nó sẽ giúp bạn tiết kiệm rất nhiều chấn thương đầu (từ việc đập nó trên bàn của bạn).

Bạn sẽ thấy $thisđược sử dụng rất nhiều. Nó có nghĩa là một lớp khác nhau tùy thuộc vào tập tin bạn nhìn thấy nó. get_class($this)là bạn của bạn, đặc biệt là kết hợp với FirePHP.

Ghi lại những thứ trên giấy. Rất nhiều. Có vô số thực tế nhỏ mà bạn sẽ cần 1-2 ngày sau khi bạn gặp chúng.

Magento yêu OO. Đừng ngạc nhiên nếu theo dõi một phương pháp sẽ đưa bạn qua 5-10 lớp khác nhau.

Đọc hướng dẫn của nhà thiết kế ở đây . Nó chủ yếu dành cho các nhà thiết kế đồ họa, nhưng bạn cần nó để hiểu nơi và lý do đầu ra từ mô-đun của bạn sẽ kết thúc. Vì vậy, đừng quên bật "Gợi ý đường dẫn mẫu" trong phần nhà phát triển của bảng quản trị.

Có nhiều hơn, nhưng tôi sẽ dừng lại ở đây trước khi điều này biến thành một luận văn.


Vui lòng gửi thêm nếu bạn có thể, tất cả thông tin đều rất hữu ích :)
Nhấp vào Upvote

Misa, có lẽ bạn nên đăng ký tại đây trên Stackoverflow, nếu bạn mất cookie, tất cả đại diện của bạn sẽ biến mất;)
Nhấp vào Upvote

Cảm ơn bạn! Điều này rất hữu ích. Ner
Ner

2

Tôi sẽ khuyên bạn nên giới thiệu Mage2Gen , điều này sẽ giúp bạn tạo ra bản tóm tắt và bạn chỉ có thể tập trung vào logic kinh doanh cốt lõi. nó chỉ giúp tăng tốc mọi thứ


0

Mô-đun Magento là một nhóm các thư mục chứa các khối, bộ điều khiển, trợ giúp và mô hình cần thiết để tạo một tính năng lưu trữ cụ thể. Nó là đơn vị tùy biến trong nền tảng Magento. Mô-đun Magento có thể được tạo để thực hiện nhiều chức năng với logic hỗ trợ để ảnh hưởng đến trải nghiệm người dùng và diện mạo cửa hàng. Nó có vòng đời cho phép chúng được cài đặt, xóa hoặc vô hiệu hóa. Từ quan điểm của cả thương nhân và nhà phát triển mở rộng, các mô-đun là đơn vị trung tâm của nền tảng Magento.

Tuyên bố mô-đun

Chúng ta phải khai báo mô-đun bằng cách sử dụng tệp cấu hình. Khi Magento 2 tìm kiếm mô-đun cấu hình trong thư mục vv của mô-đun. Vì vậy, bây giờ chúng ta sẽ tạo tệp cấu hình mô-đun.

Mã sẽ trông như thế này:

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

Đăng ký mô-đun Mô-đun phải được đăng ký trong hệ thống Magento 2 bằng cách sử dụng lớp Đăng ký thành phần Magento. Bây giờ chúng ta sẽ tạo tệp register.php trong thư mục gốc của mô-đun:

app/code/Cloudways/Mymodule/registration.php

Mã sẽ trông như thế này:

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

Kiểm tra trạng thái mô-đun Sau khi làm theo các bước trên, chúng tôi sẽ tạo ra một mô-đun đơn giản. Bây giờ chúng ta sẽ kiểm tra trạng thái của mô-đun và liệu nó được bật hay tắt bằng cách sử dụng dòng lệnh sau:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

Chia sẻ phản hồi của bạn khi bạn đã trải qua quá trình hoàn tất


0

Tôi đã cố gắng để làm cho mô-đun của tôi từ magaplaza xin chào thế giới hướng dẫn, nhưng đã xảy ra lỗi. Tôi đã nhập mã của mô-đun này https://github.com/astorm/magento2-hello-world từ github và nó đã hoạt động. từ mô-đun đó, tôi đã tạo cho nó một danh mục con thể loại ajax chọn thả xuống Mô-đun. Sau khi cài đặt nó trong thư mục aap / code của bản cài đặt magento2 của bạn, hãy theo URL này .. http://www.example.com/hello_mvvm/hello/world Bạn có thể tải xuống mã của nó từ đây https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns và đặt nó trong thư mục aap / code của bạn. hơn là chạy các lệnh này ...

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

Bây giờ bạn có thể kiểm tra chức năng mô-đun bằng URL sau http: // {{www.example.com}} / hello_mvvm / hello / world


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.