Magento là gì?




Nó là nền tảng thương mại điện tử trực tuyến mạnh mẽ nhất trên thế giới hiện nay và đang thay đổi bộ mặt của thương mại điện tử tiên tiến.
Tất nhiên, bạn đã biết điều đó. Nhưng có thể bạn không nhận ra là Magento cũng là một PHP Framework theo định hướng đối tượng (OOP) vì thế mà có thể được sử dụng để phát triển các ứng dụng web hiện đại, năng động và khai thác vào các tính năng thương mại điện tử mạnh mẽ của Magento.

Đây là bài đầu tiên trong một loạt bài viết trong đó chúng ta sẽ đi trên một hành trình tham quan các tính năng của hệ thống Magento framework. Đừng lo lắng nếu bạn không thể làm theo tất cả mọi thứ ngay lập tức. Khi bạn nghiên cứu hệ thống càng sâu tất cả mọi thứ trong bài viết này sẽ bắt đầu có ý nghĩa, và bạn sẽ sớm bị đồng nghiệp ghen tị vì họ đang phải mắc kẹt khi làm việc với các hệ thống PHP truyền thống.

Magento - Sức mạnh nằm trong tầm tay bạn


Mỗi doanh nghiệp cần có qui mô để việc cạnh tranh trực tuyến được hiệu quả. Bây giờ, với Magento, ngay cả những doanh nghiệp nhỏ nhất cũng có thể tiếp cận với giải pháp thương mại điện tử doanh nghiệp. Magento cung cấp sức mạnh và tính linh hoạt của Magento – nền tảng đáng tin cậy của nhiều thương hiệu trên thế giới - ở một mức giá mà bất kỳ doanh nghiệp nào cũng có thể đủ khả năng đầu tư. Magento chăm sóc tất cả các phần mềm, máy chủ, lưu trữ và bảo mật, do đó bạn có thể tập trung vào phát triển cửa hàng trực tuyến của bạn.

1. Tối ưu hóa cho các doanh nghiệp

Magento được thiết kế cho các doanh nghiệp nhỏ không có các nguồn lực kỹ thuật để xây dựng và tùy chỉnh các cửa hàng trực tuyến của họ. Chúng tôi làm cho nó trở nên dễ dàng cho các thương gia nhỏ và mới phát triển không cần tùy chỉnh phức tạp hoặc mở rộng bằng cách sử dụng các công cụ làm web đơn giản để nhanh chóng được trực tuyến.



2. Tuân thủ PCI
Magento phù hợp với nền tảng thương mại điện tử PCI-DSS cấp 1, cung cấp cho các thương gia, khách hàng sự tự tin và an ninh để mua bán trực tuyến.

3. Tự động nâng cấp
- Magento được nâng cấp thường xuyên để cung cấp cho doanh nghiệp các tính năng mới nhất được thiết lập để sử dụng trong các cửa hàng trực tuyến của họ.
- Magento xử lý các quá trình nâng cấp, do đó các thương gia không cần phải lo lắng về nó.
- Bản cập nhật của Magento sẽ không bao giờ phá vỡ template hoặc cửa hàng của bạn.


Tổ chức Code trong Modules

Magento tổ chức Code của nó vào các module riêng biệt. Trong một mô hình PHP Model-View-Controller (MVC) điển hình, tất cả Controller được đặt trong một folder, và tất cả Models trong một thư mục khác, v.v. Trong Magento, những file được nhóm lại dựa vào chức năng của chúng và được đặt trong cùng folder với nhau, cả Controller và Model, được gọi là Module.

Code của Magento

Ví dụ, ta sẽ tìm thấy Controller, Model, Helper, Block, v.v. liên quan đến chức năng Checkout của Magento trong
app/code/core/Mage/Checkout
Và ta sẽ tìm thấy Controller, Model, Helper, Block, v.v liên quan đến chức năng Google Checkout trong
app/code/core/Mage/GoogleCheckout
Code của bạn

Khi bạn muốn tùy biến hoặc mở rộng Magento, không nên chỉnh sửa các file lõi trực tiếp, hoặc thậm chí đặt Controller, Model, Helper, Block, v.v. mới bên cạnh code của Magento, bạn nên tạo ra các module của riêng bạn trong phân vùng riêng
app/code/local/Package/Modulename
Package (thường được gọi là Namespace) là một tên duy nhất xác định công ty hoặc tổ chức của bạn, hay đơn giản là chính bạn. Mục đích là mỗi thành viên của cộng đồng Magento trên toàn thế giới sẽ sử dụng tên Package của riêng mình khi tạo module để tránh xung đột với code của những người khác.

Khi tạo mới một Module, nên nhớ cần phải khai báo với Magento. Điều này được thực hiện bằng cách thêm một tập tin XML vào thư mục:
app/etc/modules
Có hai loại file trong thư mục này, loại đầu tiên khai báo một Module cá nhân, và được đặt tên theo hình thức : Packagename_Modulename.xml
Loại thứ hai khai báo tất cả các module từ một Packages (Namespace), và được đặt tên theo hình thức: Packagename_All.xml

Configuration-Based MVC

Magento là một hệ thống configuration-based MVC . Thiết nghĩ nên có sự thay thế thành một hệ thống convention-based MVC.

Vậy nền tảng Configuration-based MVC Convention-based MVC ra sao? Khác nhau thế nào?

Trong một hệ thống dùng Convention-based MVC, nếu bạn muốn thêm một Controller hoặc Model, bạn chỉ phải tạo ra các file/class, và hệ thống sẽ tự động tích hợp nó.
Trong một hệ thống dùng Configuration-based MVC, giống như Magento, ngoài việc bổ sung thêm file/class, bạn thường cần phải cho hệ thống biết về class mới, hoặc một nhóm class một cách rõ ràng . Trong Magento, mỗi module có một file có tên config.xml. File này có chứa tất cả các cấu hình có liên quan cho một Module Magento. Khi chạy, tất cả những file này được nạp vào mạng lưới file cấu hình.

Ví dụ, muốn sử dụng Model trong Module tùy chỉnh của bạn? Bạn sẽ cần phải thêm một số mã vào config.xml để nói với Magento bạn muốn sử dụng Model này cũng như những class cơ sở để cho tất cả Model của bạn thực thi.

1
2
3
4
5
<models>
     <packagename>
          <class>Packagename_Modulename_Model</class>
    <packagename>
</models>
Tương tự cho Helper, Block, Route cho Controller, Even Handler, v.v. Hầu như bất cứ lúc nào bạn muốn khai thác sức mạnh của hệ thống Magento, bạn sẽ cần phải thực hiện một số thay đổi hoặc bổ sung vào tập tin cấu hình của bạn.

Controllers

Trong bất kỳ hệ thống PHP nào, hệ thống vẫn luôn yêu cầu một file PHP để truy xuất. Magento cũng không ngoại lệ, và tập tin đó là index.php.
Tuy nhiên, không bao giờ CODE trong index.php. Trong một hệ thống MVC, index.php sẽ chứa code/call để thực thi tác vụ:

       1. Kiểm tra địa chỉ URL
       2. Dựa trên một số thiết lập các quy tắc, biến URL này vào một class điều khiển và một Action method (được gọi là định tuyến – Routing)
      3. Khởi tạo ngay các Controller và gọi các Action method (được gọi là quá trình dispatching)

Điều này có nghĩa là các điểm vào thực tế trong Magento (hoặc bất kỳ hệ thống dựa trên MVC) là một phương thức trong một file Controller. Hãy xem xét URL sau đây:
http://example.com/catalog/category/view/id/25
Mỗi phần con của đường dẫn (path) sau domain được phân tích như sau.

Front Name – catalog

Phần đầu tiên của URL được gọi là Front Name. Điều này, nhiều hơn hoặc ít hơn, nói với Magento module nào mà nó có thể tìm thấy một Controller. Trong ví dụ trên, front-name là catalog, tương ứng với các Module đặt tại:
app/code/core/Mage/Catalog

Controller Name – category

Phần thứ hai của URL cho Magento biết Controller nào nó nên sử dụng. Mỗi Module với những Controller có một thư mục riêng có tên là ‘controller’, trong đó có chứa tất cả các Controller cho một mô-đun. Trong ví dụ trên, phần URL category được dịch sang file Controller:
app/code/core/Mage/Catalog/controllers/CategoryController.php
Trông giống như

1
2
3
class Mage_Catalog_CategoryController extends Mage_Core_Controller_Front_Action
{
}
Tất cả các Controller trong ứng dụng giỏ hàng của Magento được extend từ Mage_Core_Controller_Front_Action.

Action Name – view

Thứ ba trong URL của chúng ta là Action Name. Trong ví dụ của chúng ta, nó là “view”. Từ “view” được sử dụng để tạo ra các Action Method. Vì vậy, trong ví dụ của chúng ta, “view” sẽ biến thành “viewAction”

1
2
3
4
5
6
7
class Mage_Catalog_CategoryController extends Mage_Core_Controller_Front_Action
{
    public function viewAction()
    {
        //main entry point
    }
}
Nếu bạn quen thuộc với Zend Framework, bạn sẽ nhận ra những quy ước đặt tên ở đây.

Paramater/Value – id/25

Bất kỳ phần đường dẫn sau khi tên hành động sẽ được coi là key/giá trị biến – phương thức GET. Vì vậy, trong ví dụ của chúng tôi, “id/25″ có nghĩa là sẽ có một biến GET được đặt tên là “id”, với giá trị là “25″.

Như đã đề cập trước đó, nếu bạn muốn Module của bạn sử dụng Controller, bạn sẽ cần phải cấu hình chúng. Dưới đây là đoạn cấu hình cho phép điều khiển module Catalog

1
2
3
4
5
6
7
8
9
10
11
<frontend>
    <routers>
        <catalog>
            <use>standard</use>
            <args>
                <module>Mage_Catalog</module>
                <frontName>catalog</frontName>
            </args>
        </catalog>
    </routers>
</frontend>
Đừng lo lắng nếu bạn không hiểu những thẻ tag đó, nhưng lưu ý <frontName>catalog</frontName>

Đây là phần khai báo liên kết một Module với một frontname URL. Hầu hết các Module cốt lõi của Magento chọn một frontname như là tên Module của chúng, nhưng điều này là không bắt buộc.

Multiple Routers

Việc mô tả định tuyến (routing) ở trên dùng cho ứng dụng giỏ hàng của Magento (thường được gọi là frontend). Nếu Magento không tìm thấy một Controller/Action phù hợp cho một URL, nó sẽ cố gắng lần nữa, lần này sử dụng bộ định tuyến thứ 2 cho ứng dụng Admin. 

Nếu Magento vẫn không tìm thấy một Controller/Action của Admin phù hợp, nó sẽ dùng một Controller đặc biệt tên là  Mage_Cms_IndexController.

Controller CMS kiểm tra hệ thống Quản lý nội dung của Magento để xem nếu có bất kỳ nội dung cần phải được nạp vào. Nếu nó tìm thấy, nó sẽ tải vào hệ thống, nếu không người dùng sẽ được chuyển hướng (forward) tới một trang 404.

Ví dụ, trang chính Magento “index” là một trong những trang sử dụng điều khiển CMS, mà thường có thể ném truy xuất mới đến cho một vòng lặp.

Context-Based URI Model Loading

Bây giờ chúng ta đang ở điểm truy xuất vào Action, chúng ta sẽ muốn bắt đầu khởi tạo (instantiate) các class để thực thi. Magento cung cấp một cách đặc biệt để khởi tạo các Model, Helper và Block bằng cách sử dụng các phương pháp factory trên lớp Mage global. 

Ví dụ:

1
2
Mage::getModel('catalog/product');
Mage::helper('catalog/product');
Chuỗi “catalog/product” được gọi là một Grouped Class Name. Nó cũng thường được gọi là một URI. Phần đầu tiên của bất kỳ Grouped Class Name (trong trường hợp này là catalog), được sử dụng để lookup (tra cứu) Module mà các class cư trú. Phần thứ hai (‘product’) được sử dụng để xác định class nào được nạp.

Vì thế, trong các ví dụ trên, ‘catalog’ phân giải tới Module app/code/core/Mage/Catalog.
Có nghĩa là class của chúng ta sẽ bắt đầu với Mage_Catalog.

Và, product được thêm vào để có tên class cuối cùng

1
2
3
4
5
Mage::getModel('catalog/product');
Mage_Catalog_Model_Product
Mage::helper('catalog/product');
Mage_Catalog_Helper_Product
Những quy định này được ràng buộc bởi những gì đã được thiết lập trong tập tin cấu hình của mỗi Module. Khi bạn tạo Module riêng, bạn sẽ có Grouped Classnames riêng để làm việc với Magento Mage::getModel('myspecialprefix/modelname');.
Bạn không phải dùng Group Class Names để instant các class của mình. Tuy nhiên, nó có những ưu điểm nhất định, và chúng ta sẽ tìm hiểu sau.

Magento Models

Magento, giống như hầu hết các framework, cung cấp một hệ thống Object Relational Mapping (ORM). Những ORM này giúp bạn bớt được việc phải viết câu lệnh SQL và cho phép bạn thao tác với dữ liệu thuần thông qua code PHP. Ví dụ:

1
2
3
4
5
$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 đang gọi các method “getPrice” và ”setPrice” trong Product. Tuy nhiên, lớp Mage_Catalog_Model_Product không có method với các tên này. Đó là bởi vì ORM sử dụng _get và _set – những method ma thuật.

Việc gọi method $product->getPrice(); sẽ “get” thuộc tính Model “price”.
Và gọi $product->setPrice(); sẽ “set” thuộc tính Model “price”. All of this assumes the Model class doesn’t already have methods named getPrice or setPrice. If it does, the magic methods will be bypassed. If you’re interested in the implementation of this, checkout the Varien_Object class, which all Models inherit from. Tất cả điều này giả định các class Model chưa có method có tên là getPrice hoặc setPrice. Nếu có, các phương pháp ma thuật sẽ được bỏ qua. Nếu bạn đang quan tâm đến việc thực hiện, kiểm tra class Varien_Object, và tất cả các Model kế thừa từ nó.

Nếu bạn muốn lấy tất cả dữ liệu trên một Model, gọi hàm $product->getData(); sẽ trả về một array (mảng) chứa các thuộc tính.

Cũng nên lưu ý rằng nó có thể kết chuỗi lại với nhau nhiều lần để thiết lập – set method:
$model->setPrice($price)->setSku('SK83293432');

Đó là bởi vì mỗi thiết lập – set method sẽ trả lại và instance của Model. Đây là một pattern (mô hình mẫu) bạn sẽ thấy được sử dụng khá nhiều trong hệ thống codebase của Magento.

ORM của Magento cũng có một cách để truy vấn nhiều các Object – đối tượng thông qua một giao diện Collections. Sau đây sẽ cho chúng ta một tập hợp của tất cả các sản phẩm với giá 5.00$

1
2
3
4
$products_collection = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('price','5.00');
Một lần nữa, bạn sẽ nhận thấy Magento triển khai một giao diện chuỗi. Collections sử dụng thư viện chuẩn PHP để thực hiện các Object có mảng như các thuộc tính.

1
2
3
4
foreach($products_collection as $product)
{
    echo $product->getName();
}
Bạn có lẽ sẽ thắc mắc method ”addAttributeToSelect” là gì. Magento có hai loại rộng của các Model object. Loại đầu tiên là một loại Model truyền thống “Một Object, một Bảng” theo chuẩn Active Record. Khi bạn khởi tạo các Model này, tất cả các thuộc tính sẽ được tự động lựa chọn.

Loại thứ hai là một Entity Attribute Value (EAV). EAV Model phân tán dữ liệu qua nhiều table khác nhau trong cơ sở dữ liệu. Điều này cho phép hệ thống Magento sự linh hoạt để cung cấp hệ thống sản phẩm các thuộc tính linh hoạt mà không cần phải làm một sự thay đổi lược đồ mỗi khi bạn thêm một thuộc tính. Khi tạo ra một collection của các đối tượng EAV, Magento thận trọng với số lượng các cột nó sẽ truy vấn, vì vậy bạn có thể sử dụng addAttributeToSelect để có được các cột mà bạn muốn, hoặc addAttributeToSelect (‘*’) để có được tất cả các cột.

Helpers

Các class Helper trong Magento chứa các method hữu ích mà sẽ cho phép bạn thực hiện những tác vụ phổ biến trên các object và các biến. Ví dụ:
$helper = Mage::helper('catalog');

Bạn sẽ nhận thấy chúng ta đã để lại phần thứ hai của grouped class name. Mỗi Module có một class Data Helper mặc định. Dưới đây là tương đương với ví dụ trên:
$helper = Mage::helper('catalog/data');

Hầu hết Helpers kế thừa từ Mage_Core_Helper_Abstract, mà sẽ cho bạn nhiều method mặc định hữu ích.

1
2
$translated_output =  $helper->__('Magento is Great'); //gettext style translations
if($helper->isModuleOutputEnabled()): //is output for this module on or off?

Layout


Chúng ta đã xem về Controller, Model, Helper. Trong một hệ thống PHP MVC điển hình, sau khi thao tác với các Model chúng ta sẽ:

        1. Thiết lập một vài giá trị tới View
        2. Hệ thống sẽ load một “outer” mặc định về HTML layout
        3. The system would then load our view inside that outer layout
        4. Hệ thống sau đó sẽ load View của chúng ta ra bên ngoài

Tuy nhiên, nếu bạn nhìn vào một action của Magento Controller điển hình, bạn sẽ không thấy bất kì đâu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * View product gallery action
 */
public function galleryAction()
{
    if (!$this->_initProduct()) {
        if (isset($_GET['store']) &amp;&amp; !$this->getResponse()->isRedirect()) {
            $this->_redirect('');
        elseif (!$this->getResponse()->isRedirect()) {
            $this->_forward('noRoute');
        }
        return;
    }
    $this->loadLayout();
    $this->renderLayout();
}
Thay vào đó, Controller action kết thúc với việc gọi 2 hàm

1
2
$this->loadLayout();
$this->renderLayout();
Vì vậy, ”V” trong MVC Magento đã khác với những gì bạn từng sử dụng, trong đó bạn cần render layout một cách rõ ràng.

Layout chính nó cũng khác. Giao diện Magento là một đối tượng – object có chứa một tập object “Block” lồng nhau/ hay như cấu trúc cây. Mỗi đối tượng Block sẽ thực thi một chút render của HTML. Các Block làm điều này thông qua một sự kết hợp của code PHP, và bao gồm cả file PHP template .phtml.

Block có nghĩa là để tương tác với hệ thống Magento để lấy dữ liệu từ Model, trong khi các file template phtml sẽ phát sinh code HTML cần thiết cho một trang.

Ví dụ, phần Block header của trang app/code/core/Mage/Page/Block/Html/Head.php dùng file head.phtml page/html/head.phtml.
Hiểu cách khác, các class Block trông như là mini-controller, và file .phtml là các View.

Mặc định, khi bạn gọi hàm

1
2
$this->loadLayout();
$this->renderLayout();
Magento sẽ load một Layout với một skeleton site structure – cấu trúc khung của trang web. Đó chính là Structure Blocks cung cấp cho bạn html,head, và body, cũng như là code HTML để thiết lập một Layout đơn hoặc đa dạng. Thêm vào đó, có những Content Blocks khác như là navigation, default welcome message, v.v.

“Structure” và “Content” là những phần có thể thiết kế tùy ý trong hệ thống Layout. Một Block không được làm một cách lập trình tự động hóa nếu là Structure hoặc Content, nhưng sẽ hữu ích nếu nghĩ một Block là một cái gì đó khác.

Để thêm Content vào Layout, bạn cần phải khai báo với hệ thống Magento chẳng hạn như
"Hey, Magento, add these additional Blocks under the "content" Block of the skeleton"
hoặc giả
"Hey, Magento, add these additional Blocks under the "left column" Block of the skeleton"
Điều này được hoàn tất một cách lập trình hóa trong một Controller action

1
2
3
4
5
public function indexAction()
{
    $block $this->getLayout()->createBlock('adminhtml/system_account_edit')
    $this->getLayout()->getBlock('content')->append($block);
}
nhưng thông thường (ít ra là trong trường hợp ứng dụng giỏ hàng phía frontend), là dùng hệ thống XML Layout.

Những file Layout XML trong một theme cho phép bạn, trong mỗi một Controller cơ bản, xóa những Block mà sẽ thường hay được render, hoặc thêm Block vào những vùng skeleton mặc định. Ví dụ, xem xét file Layout XML:

1
2
3
4
5
<catalog_category_default>
    <reference name="left">
        <block type="catalog/navigation" name="catalog.leftnav" after="currency" template="catalog/navigation/left.phtml"/>
    </reference>    
</catalog_category_default>
Nó nói rằng trong Module catalog, trong Controller category, và Action mặc định, thêm vào Block catalog/navigation vào phần “left” (bên trái) của Structure Block, dùng file template catalog/navigation/left.phtml

Một điều quan trong cuối cùng là về Blocks. Bạn thường thấy code trong những template giống như:
$this->getChildHtml('order_items')

Đây là chỉ ra một Block render một nested Block (những Block luồng vào nhau) như thế nào. Tuy nhiên, một Block chỉ có thể render một child Block nếu child Block được khai báo thêm vào như là một nested Block trong file Layout XML. Trong ví dụ trên, Block catalog/navigation không có nested Block. 

Điều này nghĩa là bất kì hàm gọi nào tới $this->getChildHtml() trong file left.phtml sẽ render ra rỗng (blank).

Tuy nhiên, nếu, chúng ta có

1
2
3
4
5
6
7
<catalog_category_default>
    <reference name="left">
        <block type="catalog/navigation" name="catalog.leftnav" after="currency" template="catalog/navigation/left.phtml">
            <block type="core/template" name="foobar" template="foo/baz/bar.phtml"
        </block>
    </reference>    
</catalog_category_default>
Từ catalog/navigation Block, chúng ta sẽ có thể gọi hàm
$this->getChildHtml('foobar');

Observers

Giống như bất kì hệ thống hướng đối tượng – object-oriented nào, Magento thực thi một Event/Observer patterm cho người dùng để bắt sự kiện.

Khi tạo Module của bạn, bạn có thể “listen” cho những event này. Giả sử bạn muốn nhận được một email mỗi khi một khách hàng nào đó đăng nhập vào cửa hàng. Bạn có thể lắng nghe – listen cho sự kiện ”customer_login” (thiết lập trong config.xml)

1
2
3
4
5
6
7
8
9
10
11
<events>
    <customer_login>
        <observers>
            <unique_name>
                <type>singleton</type>
                <class>mymodule/observer</class>
                <method>iSpyWithMyLittleEye</method>
            </unique_name>
        </observers>
    </customer_login>
</events>
và sau đó viết một vài đoạn code để thực thi khi người dùng đăng nhập:

1
2
3
4
5
6
7
8
9
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, Hệ thống Magento cung cấp một khả năng thay thế Model, Helper, và những class Block từ core modules với những file của bạn. Đây là tính năng tương tự “Duck Typing” hay “Monkey Patching” trong ngôn ngữ Ruby hay Python.
Ta sẽ làm một ví dụ để dễ hiểu. Class Model cho một product là Mage_Catalog_Model_Product.

Bất cứ khi nào các code sau đây được gọi, một object Mage_Catalog_Model_Product được khởi tạo.

1$product = Mage::getModel('catalog/product');
Đây là factory pattern.

Việc hệ thống các class override của Magento làm là cho phép bạn khai báo với hệ thống rằng
"Hey, whenever anyone asks for a catalog/product, instead of giving them a Mage_Catalog_Model_Product,
give them a Packagename_Modulename_Model_Foobazproduct instead".
Sau đó, nếu bạn muốn, class Packagename_Modulename_Model_Foobazproduct của bạn có thể mở rộng – extend từ các class product gốc

1
2
3
class Packagename_Modulename_Model_Foobazproduct extends Mage_Catalog_Model_Product
{
}
Mà sẽ cho phép bạn thay đổi hành vi của bất kỳ method trong class, nhưng giữ nguyên chức năng – function của các method hiện có

1
2
3
4
5
6
7
8
9
class Packagename_Modulename_Model_Foobazproduct extends Mage_Catalog_Model_Product
{
    public function validate()
    {
        //add custom validation functionality here
        return $this;
    }
}
Như bạn mong đợi, sự ghi đè lên – overriding (hoặc viết lại – rewriting) này được thực hiện trong file config.xml.

1
2
3
4
5
6
7
8
9
10
11
12
13
<models>
    <!-- tells the system this module has models -->
    <modulename>
        <class>Packagename_Modulename_Model</class>
    </modulename>
    <!-- does the override for catalog/product-->
    <catalog>  
        <rewrite>
            <product>Packagename_Modulename_Model_Foobazproduct</product>
        </rewrite>
    </catalog>          
</models>

Một điều quan trọng cần lưu ý ở đây. Các class cá nhân trong Module của bạn ghi đè – overriding lên các class cá nhân trong other Modules. Bạn không, tuy nhiên, quá trình ghi đè này lên toàn bộ Module. Điều này cho phép bạn thay đổi hành vi của method cụ thể mà không cần phải lo lắng những gì còn lại Module sẽ làm.

Đôi điều

Tôi hy vọng bạn sẽ thích thú với bài tút này và một số các tính năng của hệ thống Magento Thương mại điện tử cung cấp cho các nhà phát triển. Nó có thể gây ra một chút áp lực lúc đầu, đặc biệt là nếu điều này là kinh nghiệm đầu tiên của bạn với một hệ thống, hệ thống PHP hướng đối tượng – object-oriented. Nếu bạn bắt đầu thấy khó khăn và thất vọng, hãy hít một hơi thật sâu, nhắc nhở mình rằng đây là hoàn toàn mới, và những điều mới luôn là khó khăn, nhưng vào cuối ngày nào đó, bạn sẽ thấy nó chỉ là một cách code khác mà thôi. Một khi bạn vượt qua được những khó khăn bước đầu này, bạn sẽ thấy mình không muốn trở lại các hệ thống khác nữa.


---♥♥♥---
Share To:
Magpress

TraitimIT

Xin chào các bạn! Đây là một blog mang tính chất chia sẻ cho cộng đồng, với những thông tin về công nghệ số được cập nhật hàng ngày và những kiến thức về công nghệ mới nhất sẽ được chia sẻ với các bạn. Mong các bạn sẽ đông hành cùng với Blog traitimit để xây dụng một cộng đồng công nghệ phát triển vượt bậc hơn nưa..

0 comments so far,add yours