Giáo trình magento part 3 – Giới thiệu về Magento

Tôi tên là Long và tôi mong muốn giúp các bạn có thể học nhanh nhất 1 framework hay 1 CMS. Nếu copy nhớ để nguồn
https://eavteam.wordpress.com Đây là tài liệu tôi đã chỉnh sửa và viết lại dựa trên chuỗi 8 bài cơ bản trong trang chủ magento đã được nói trong

Magento là gì? Một nền tảng thương mại điện tử mạnh mẽ trên toàn cầu và thay đổi bộ mặt thương mại điện tử mãi mãi.
Tất nhiên bạn đã biết điều đó. Magento cũng là 1 framework PHP có thể dùng để phát triển các ứng dụng web động hiện đại lien quan đến các chức năng thương mại điện tử
Đây là chuối bài viết về các tính năng trong magento. Đừng lo nếu bạn không theo dõi tất cả mọi thứ ngay.Khi đọc xong chuỗi bài giảng này các bạn sẽ có cái nhìn tổng quan về Magento. Và các lập trình viên làm việc trên các hệ thống cũ sẽ sớm phải ngưởng mộ bạn ( trang chủ nó chém gió thế ) :v

Code Organized in Modules
– Magento tổ chức code theo hướng Module (giống như chơi xếp hình ấy mỗi Module là 1 miếng ghép hehe)
– Trong Module thì tổ chức theo MVC và Hướng đối tượng OPP
=> Magento là hướng module MVC và OOP ; Các CMS khác cũng là hướng module hết(CMS nổi tiếng)
ví dụ 1 module có sẵn trong magento app/code/core/Mage/Checkout mở source code lên xem nhé

Your Code
Khi bạn muốn tùy chỉnh hay mở rộng Magento. bạn sẽ tạo Modules cho riêng bạn trong :
app/code/local/Package/Modulename
Package ( thường được cho là Namespace) là tên duy nhất để xác nhận công ty hay tổ chức của bạn. Ý tưởng là để mỗi member của cộng đồng Magento toàn thế giới sẽ sử dụng các tên Package của họ khi họ tạo modules trong trật tự để tránh sự xung đột với code của người khác:
Khi bạn tạo mới Module , bạn nên nói với Magento về nó . Nó sẽ hoàn thành bằng cách them file XML vào folder:
app/etc/modules
Có 2 loại files trong folder trên
1 là enable các module riêng lẻ, nó có tên dạng
Packagename_Modulename.xml
Thứ 2 là file có thể bật nhiều modules trong 1 Package/Namespace, và nó có tên Packagename_All.xml . Chú ý nó chỉ dùng cho core team với file Mage_All.xml.Không nên dùng vì nó phá đi tính module của magento

Configuration-Based MVC

Cấu hình dựa trên MVC
Magento là là hệ thống cấu hình dựa trên MVC. Khác với quy chuẩn MVC .
Trong hệ thống quy chuẩn dựa trên MVC, nếu bạn muốn thêm 1 Controller mới hay có thể 1 model mới, bạn sẽ tạo file/class, and hệ thống sẽ tự động lấy nó ra tự động.
Trong Magento để thêm class thì cần khai báo trong config và config sẽ chọn các class và file được thêm vào
mỗi Module có 1 file config.xml. File đó bao gồm toàn bộ cấu hình thích hợp cho module Magento. Khi chạy, tất cả các file được load vào 1 cây cấu hình lớn.
Ví dụ, bạn muốn dùng Models trong module của bạn. Bạn cần them vào ít code trong config.xml để nói với Magento bạn muốn dùng Models. Cũng như những class cơ bản nào cho tất cả các Models của bạn nên có

Controllers

Trong bất kì hệ thống PHP, lối vào hệ thống là 1 file PHP. Magento cũng không khác, và file đó là index.php
Tuy nhiên, bạn không bao giờ code trong index.php. Trong hệ thống MVC, index.php sẽ bao gồm code/calls để code những thứ sau:
1.Kiểm tra URL
2.Kiểm tra quyền, chuyển hướng Url vào Controller và Action
3.Khởi tạo Controller và gọi Action
1. Examines the URL
2. Based on some set of rules, turns this URL into a Controller class and an Action method (called Routing)
3. Instantiates the Controller class and calls the Action method (called dispatching)

Điều đó có nghĩa lối vào thực tế trong Magento ( hay bất kì MVC system nào ) cũng là phương thức trong controller file. Xem Url sau:

http://example.com/catalog/category/view/id/25
http://example.com/catalog(ten frontname của Module)/category(ten Controller)/view(ten cua action- method)/id/25
Mỗi phần của đường dẫn sau tên server được phân tích như sau.

Front Name – catalog
Phần đầu tiên của URL được gọi là front name. Nó nói với magento rằng module mà nó có thể tìm thấy Controller trong đó. Trong ví dụ trên, tên front là catalog, tương ứng với vị trí module là

app/code/core/Mage/Catalog

Controller Name – category
Vị trí thứ 2 trong URL nói với Magento controller nào sẽ được dùng. Mỗi Module với nhiều controller có 1 folder riêng là controllers bao gồm các Controllers cho module. Trong ví dụ phía trên, Phần Url category được chuyển thành Controller file :
app/code/core/Mage/Catalog/controllers/CategoryController.php
// noi dung trong file co doan nay la quan trong
class Mage_Catalog_CategoryController extends Mage_Core_Controller_Front_Action
{
}

Các Controller trong ứng dụng rỏ hang Magento được kế thừa từ Mage_Core_Controller_Front_Action.
Action Name – view
View là Action -> ViewAction

class Mage_Catalog_CategoryController extends Mage_Core_Controller_Front_Action
{
public function viewAction()
{
//main entry point
}
}

Paramater/Value – id/25
Bất kỳ đoạn đường dẫn nào sau tên action sẽ được xem là key/value Của biến Get.
nếu bạn muốn module của bạn sử dụng Controller, bạn cần cấu hình chúng. Dưới đây là cụm cấu hình sẽ mở Controllers cho module Catalog

standard

Mage_Catalog
catalog

Đùng lo lắng quá về các chi tiết riêng ngay, nhưng chú ý
catalog
đây là tên khai báo cho URL . Tất cả Modules core chọn frontname như là tên module nó sẽ tương tự như tên module của bạn nhưng nó không bắt buộc

Multiple Routers
Các định tuyến mô tả ở trên cho ứng dung Magento ( thường gọi là frontend). Nếu Magento không tìm thấy Controller/Action hợp lệ cho URL, nó sẽ thử lại, Thời gian sử dụng là số giây thiết lập trong Routing rules cho Admin. Nếu Magento không tìm thấy Admin Controller.Action hợp lệ, nó dùng 1 controller đặc biệt với tên Mage_Cms_IndexController
CMS Controller kiểm tra Hệ quản lý nội dung Magento để tìm . Nếu không user sẽ được hiển thị trang 404
Ví dụ, trang magento index sử dụng CMS controller là cái thường xuyên làm rối người dùng

Context-Based URI Model Loading
Magento đưa ra 1 cách đặc biệt để tạo đối tượng Models, Helpers và Blocks sử dụng phương thức mặc định trong Mage class
Mage::getModel(‘catalog/product’);
Mage::helper(‘catalog/product’);
‘catalog/product ’ được gọi là 1 Grouped Class Name. Nó thường được gọi là URI. Phần thứ nhất của bất kỳ Grouped Class Name (catalog) được dùng để tìm kiếm module mà class tạm trú ở bên trong. Phần thứ 2 (product) is dùng để xác định class nào được load
example:
Mage::getModel(‘catalog/product’);
Mage_Catalog_Model_Product

Mage::helper(‘catalog/product’);
Mage_Catalog_Helper_Product

Magento Models

Magento giống 1 framework nhiều hơn Hiện nay, nó đưa ra ORM system. ORM giúp bạn thoát khỏi các nghiệp vụ viết SQL và cho phép bạn thao tác (manipulate) dữ liệu nguyên thủy thông qua PHP code. Ví dụ:

$model = Mage::getModel(‘catalog/product’)->load(27);
$price = $model->getPrice();
$price += 5;
$model->setPrice($price)->setSku(‘SK83293432′);
$model->save();

Trong ví dụ trên chúng ta gọi getPrice và setPrice trên sản phẩm của chúng ta. Tuy nhiên, Mage_Catalog_Model_ không có methods nào tên như thế. Bởi vì Magento ORM sử dụng PHP’s magic __call method để triển kahi getteers and setter
Nếu bạn muốn lấy tất cả data hiện có trong Model, gọi $product->getData() ; để lấy mảng của toàn bộ các thuộc tính

$model->setPrice($price)->setSku(‘SK83293432′);
Bạn nên chú ý, có thể (chain) vài lời gọi set method lại với nhau Bởi vì mỗi method trả về và khởi tạo 1 model

Magento’s ORM cũng có cách để truy vấn nhiều object thông qua Collections interface. Đoạn sau sẽ lấy cho chúng ta 1 collection của tất cả sản phẩm có giá 50$
$products_collection = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('price','5.00');
duyet cac object
foreach($products_collection as $product)
{
echo $product->getName();
}

Bạn có thể ngạc nhiên cái “addAttributeToSelect” để làm gì. Magento có 2 Loại nhóm của Model objects. 1 theo truyền thống 1 object 1 bảng. (Active Record style Model.)
Khi bạn khởi tạo Loại Models này, tất cả các thuộc tính tự động được lựa chọn

Loại Model thứ 2 là EntityAttribute Value EAV Model. EAV chia dữ liệu qua vài bảng trong database. Nó cung cấp cho hệ thống magento sự mềm dẻo để đưa ra thuộc tính sản phẩm mềm dẻo mà không cần thay đổi sơ đồ database mỗi lần them thuộc tính. Khi tạo 1 collection EAV objects, Magento sẽ duy trì (conservative ) số lượng cột nó sẽ truy vấn , vì thế bạn có thể sử dụng addAttributeToSelect để lấy các cột mà bạn muốn, hoặc addAttributeToSelect(‘*’) để lấy tất cả các cột

Helpers
Magento’s Helper classed bao gồm các methods đa dụng sẽ cho phép bạn thực hiện các công việc chung trên object và biến .ví dụ:
$helper = Mage::helper(‘catalog’);
. Mỗi module có 1 data Helper class mặc định. Đoạn sau tương đương với ở trên
$helper = Mage::helper(‘catalog/data’);
Tất cả Helpers kế thừa từ Mage_Core_Helper_Abstract

Layouts
V trong Magento MVC khác
Magento Layout là 1 đối tượng bao gồm nested/tree cái này là dạng cây collection của Block object. Mỗi Block object sẽ render 1 miếng riêng của HTML. Đối tượng block làm việc thông qua sự kết hợp PHP code và bao gồm .phtml template files => layout cũng được ghép lại từ nhiều mảnh(Bọn này nó thích chơi xếp hình )
Blocks object lấy dữ liệu từ Models
Một cách nghĩ khác là class Block cũng thường là các controllers nhỏ và .phtml và view của nó
Khi gọi:
$this->loadLayout();
$this->renderLayout();
Magento đọc các config layout và đưa ra 1 cây các block sau đó các block mới được chạy để tạo ra mã html của toàn trang web. Chúng ta có thể chọn view và layout nào khá dễ dàng bằng cách tùy chỉnh config. Khó hiểu bỏ qua làm nhiều sẽ hiểu haizz

Bình thường nó có 1 cái khung layout rồi việc chung ta làm là can thiệp vào cái khung đấy, thêm block, xóa block ….
Đây là thêm block bằng PHP trong controller
public function indexAction()
{
$this->loadLayout();
$block = $this->getLayout()->createBlock('adminhtml/system_account_edit')
$this->getLayout()->getBlock('content')->append($block);
$this->renderLayout();
}

Nhưng thông thường dùng XML layout system

config trên nói với magento là với catalog Module, trong category Controller , và default Action() them vào catalog/navigation Block vào ”left” , sử dụng catalog/navigation/left.phtml template.

Một thứ quan trọng cuối cùng về Blocks. Bạn thường nhìn thấy code này trong template
$this->getChildHtml(‘order_items’)
Đó là cách Block renders ra cấu trúc nested Block. Tuy nhiên Block phải render block con (được khai báo dạng con trong file layout). Trong ví dụ trên. Catalog/navigation Block không có nested Block. Có nghĩa là bất kì lời gọi đến $this->getChildHtml() trong left.phtml will render as blank.
Nếu gọi thế này thì sẽ có con :v

From the catalog/navigation Block, we’d be able to call
$this->getChildHtml(‘foobar’);

Observers
Như bất kỳ 1 hệ thống hướng đối tượng nào, Magento cung cấp Event/Observer pattern cho người dùng cuối có thể vào bên trong system. Với action bất kì Page request ( Lưu Model, User login) Magento sẽ phát ra 1 tín hiệu sự kiện

singleton
mymodule/observer
iSpyWithMyLittleEye

đoạn code dưới chạy mỗi lần login
class Packagename_Mymodule_Model_Observer
{
public function iSpyWithMyLittleEye($observer)
{
$data = $observer->getData();
//code to check observer data for out user,
//and take some action goes here
}
}

Class Overrides
Cuối cùng ,Magento cung cấp khả năng thay thế Model, Helper, Block classes từ core module bằng file của ban. Đố là tính năng tương tự Duck Typing Or Monkey Patching trong ngôn ngữ Ruby hoặc Python
$product = Mage::getModel(‘catalog/product’); để ghi đè model core này cần làm

// thêm class này trong module của mình
class Packagename_Modulename_Model_Foobazproduct extends Mage_Catalog_Model_Product
{
}

thêm đoạn sau vào config.xml của module

Packagename_Modulename_Model_Foobazproduct

Xin phép dịch ngu đoạn này cho các bạn bởi vì mình thấy dịch kiểu này khá hay
Tổng kết bài học
Chúng tôi hy vọng bạn thích tour thần tốc gồm nhiều của nhiều tính năng mà hệ thống magento cung cấp cho developers. Nó có thể có 1 chút quá tải (tràn ngập) , đặc biệt nếu đây là kinh nghiệm đầu tiên với hệ thống hiện đại hướng đối tượng của PHP. Nếu bạn bắt đầu và nhận được sự chán nản, hãy thở sâu, Nhắc nhở bản thân rằng nó là mới và mọi thứ mới đều khó, Nhưng cuối cùng nó sẽ thay đổi cách bạn code. Một lần bạn vượt qua được học hành vòng vèo , bạn sẽ thấy bản thân bạn ghét sự trở lại với thứ khác, những hệ thống kém sức mạnh .

You may also like...

2 Responses

  1. enqtran says:

    Ngắn gọn dễ đọc hiểu, mong team sẽ có thêm nhiều bài viết hữu ích như thế này :)

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">