Giáo trình magento part 4 – Magento config

Config là trái tim của hệ thống magento. Nó khai báo toàn bộ model, class, template và sau đó bạn có thể dùng trong Magento.Config là một khái niệm trừu tượng mà hầu hết các PHP developers không làm việc cùng nhưng cho phép sự mềm dẻo chưa từng thấy về ghi đè của hệ thống.
Để bắt đầu , chúng ta tạo 1 module Magento để bạn xem được config . Bạn nên gõ lại thay vì copy và paste code. Bạn sẽ hiểu rõ hơn 1 chút về config trong magento

Setting up a Module Directory Structure

Module của bạn nên đặt ở folder sau
app/code/local/Packagename
Pagkagename nên là duy nhất . Tiêu chuẩn không chính thức là tên công ty. 1 chuối mà không ai trên thế giới có khả năng sử dụng lại
app/code/local/Microsoft

chúng ta sẽ dùng “Magentotutorial” có Packagename

bước 1 :
thêm các folder sau
app/code/local/Magentotutorial/Configviewer/Block
app/code/local/Magentotutorial/Configviewer/controllers
app/code/local/Magentotutorial/Configviewer/etc
app/code/local/Magentotutorial/Configviewer/Helper
app/code/local/Magentotutorial/Configviewer/Model
app/code/local/Magentotutorial/Configviewer/sql

Bạn không cần tất cả các folder này cho module, nhưng tạo sẵn chúng ngay là 1 ý kiến thông minh để sau đó copy sang cái khác cho nhanh :v

bước 2 : thêm file config.xml
app/code/local/Magentotutorial/Configviewer/etc/config.xml
Config.xml cần có đoạn code sau. Đừng lo lắng về việc nó làm cái gì, Cuối cùng chúng ta sẽ biết.

 

 

<config>
<modules>
<Magentotutorial_Configviewer>
<version>0.1.0</version>
</Magentotutorial_Configviewer>
</modules>
</config>


bước 3 : thêm file như dưới
app/etc/modules/Magentotutorial_Configviewer.xml
Tiêu chuẩn đặt tên Packagename_Modulename.xml.
trong file cần đoạn code sau

 

 

<config>
<modules>
<Magentotutorial_Configviewer>
<active>true</active>
<codePool>local</codePool>
</Magentotutorial_Configviewer>
</modules>
</config>

 

 

Bước 4 : Vậy là xong 1 cái khung của module mặc dù nó đếch làm gì hết . Xóa cache(không biết thì google nhé) và kiểm tra

trong Magento Admin, System->Configuration->Advanced
Trong “Disable modules output” nhìn thấy Magentotutorial_Configviewer vậy là ok rồi

Creating a Module Config

Khi chúng ta hoàn thành, module sẽ
1. Kiểm tra sự tồn tại của biến “showConfig”
2. Nếu biến tồn tại, hiển thị Magento config và dừng thực thi
3. Kiểm tra sự tồn tại của biến showConfigFormat sẽ chỉ rõ đầu ra là text hay XML

Bước 1:, add thêm đoạn vào config.xml

 

<config>
<modules>…</modules>
<global>
<events>
<controller_front_init_routers>
<observers>
<Magentotutorial_configviewer_model_observer>
<type>singleton</type>
<class>Magentotutorial_Configviewer_Model_Observer</class>
<method>checkForConfigRequest</method>
</Magentotutorial_configviewer_model_observer>
</observers>
</controller_front_init_routers>
</events>
</global>
</config>

 

Bước 2 :thêm file Magentotutorial/Configviewer/Model/Observer.php

thêm code dưới này vào file

<?php
class Magentotutorial_Configviewer_Model_Observer {
const FLAG_SHOW_CONFIG = ‘showConfig';
const FLAG_SHOW_CONFIG_FORMAT = ‘showConfigFormat';

private $request;

public function checkForConfigRequest($observer) {
$this->request = $observer->getEvent()->getData(‘front’)->getRequest();
if($this->request->{self::FLAG_SHOW_CONFIG} === ‘true’){
$this->setHeader();
$this->outputConfig();
}
}

private function setHeader() {
$format = isset($this->request->{self::FLAG_SHOW_CONFIG_FORMAT}) ?
$this->request->{self::FLAG_SHOW_CONFIG_FORMAT} : ‘xml';
switch($format){
case ‘text':
header(“Content-Type: text/plain”);
break;
default:
header(“Content-Type: text/xml”);
}
}

private function outputConfig() {
die(Mage::app()->getConfig()->getNode()->asXML());
}
}

Xóa cache và load lại URL với biến showConfig=true

http://magento.example.com/?showConfig=true

What am I looking at?
Bạn thấy 1 file XML lớn. Nó khai báo trạng thái của Magento. Nó list tất cả modules, classes, event listener hay bất cứ thứ gì bạn có thể nghĩ đến trong magento. Ví dụ, xem config.xml tạo ở trên. Nếu bạn search XML trong browser với Configviewer_Model_Observer bạn sẽ thấy class được liệt kê. Mỗi module có config.xml được phân tích bở Magento và lưu trong file global config này
Cái này khá quan trọng và thuận lợi trong quá trình debug sau này

Why Do I Care?

Config là chìa khóa để mở cửa đưa các thứ vào Magento . Mỗi module đều phải tạo và thêm config nếu khai báo sai chẳng cái gì chạy được

ví dụ khi bạn chạy $helper_sales = Mage::helper(‘sales’);
đoạn code trên sẽ
1. Tìm kiếm helpers section trong config
2. Bên trong helpers tìm sales section
3. Bên trong sales tìm class section
4. Tìm giá trị sau “/” tìm được ở #3 ( mặc định là data $helper_sales = Mage::helper(‘sales/data’))
5. Khởi tạo class tìm ở thằng 4

Có vẻ là nhiều giai đoạn nhưng lơi ích chính là nó luôn tìm trong config file tên class name , ta có thể ghi đè Magento Function mà không thay đổi thêm 1 dòng code core nào. Đó là đẳng cấp siêu lập trình hiếm khi thấy trong PHP, cho phép bạn mở rộng chỉ 1 phần của hệ thống mà bạn cần

Chốt : Nên lưu lại module này sau này khi bạn hiểu hơn về magento Module này sẽ được sử dụng nhiều và rất tiện cho bạn kiểm tra xem config có đúng không

You may also like...

1 Response

  1. Hoàng says:

    có đôi chỗ phải sửa lại mới chạy được như sau:
    trong file Observer.php
    + if($this->request->{self::FLAG_SHOW_CONFIG} === ‘true’)
    –>
    if($showconfig = Mage::app()->getRequest()->getParam(‘showConfig’) ===’true’) mới lấy được biến showConfig trên URL
    + tắt echo trong các hàm header, outoutconfig cụ thể: echo “setheader”,echo “outputconfig”;
    sẽ gây lỗi XML Parsing Error: not well-formed
    Location: http://localhost/index.php/?showConfig=true
    vì sai cấu trúc file xml.

    chân thành cám ơn vì bài viết. xin góp ý như thế ạ.

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