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 và 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/modules
có 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. HelloWorld
là 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ị
- Chuyển đến Hệ thống-> Quản lý bộ đệm
- Chọn Làm mới từ menu Tất cả Bộ nhớ cache
- 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
- Đi đến Hệ thống-> Cấu hình
- Nhấp vào Nâng cao
- 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/foo
sẽ 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/foo
bở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.