Tìm hiểu về codepools trong magento


Codepool dịch ra thì là “bể code”, ý nghĩa cũng giống connection pool vậy ^^.

Codepools trong Magento được chia ra làm 3 loại tương ứng với 3 folder khác nhau

  • Community
  • Core
  • Local

Core pool

Là nơi chưa toàn bộ code liên quan đến các chức năng chính của Magento. Và cũng là nơi được phát triển bởi Core Team của Magento và chúng ta không nên thực hiện bất cứ thay đổi nào trong Core pool này.

Community pool

Đây là folder dành cho cộng đồng phát triển, nó chứa các extension của bên thứ 3 (kể cả có phí hay miễn phí). Các extension có rất nhiều ở trên MagentoConnect (trang web chưa các extension của Magento), hay trên các trang chuyên bán extension như là: aheadWorks, Amasty, MageStore, …

Local pool

Ngược lại với cộng đồng phát triển, đây là nơi chứa code chỉ dành cho website của cá nhân hay tổ chức nào đó (ko mang tính public hoặc là đang trong quá trình phát triển). Nếu bạn muốn sửa lại chức năng nào đó của extension của Core pool, bạn có thể copy file cần sửa trong Core với đúng đường dẫn ra ngoài local và sửa file ở Local. File mới ở Local sẽ ghi đè lại file trong Core. Ví dụ:

Bạn cần sửa 1 vài chỗ trong file: app\code\core\Mage\Catalog\Block\Product.php

thì bạn chỉ cần copy file Product.php ra ngoài Local với đường dẫn: app\code\local\Mage\Catalog\Block\Product.php và sửa trong file ở Local là được.

Lưu ý: cách ghi đè file này chỉ để hiểu về việc phân cấp codepools trong Magento, nó ko được khuyến khích khi sử dụng để ghi đè chức năng trong Core.

Làm thế nào để Magento có thể tương tác được với các codepools

Để hiểu rõ hơn về cơ chế làm việc này chúng ta hãy xem đoạn code khai báo Path trong file app\Mage.php (là file được gọi trong file index.php để khởi động toàn bộ quá trình trong hệ thống Magento).

Trong file Mage.php, Magento đã tạo ra 1 mảng với 3 phần tử chứa tên của 3 codepoool và theo thứ tự: local, community, core. Sau đó implode lại để tạo ra đường dẫn tới 3 folder này. rồi set lại include_path:

Mấu chốt chính là là chỗ set lại include_path này. include_path là nơi chứa đường dẫn tới các folder mà chứa thư viện php. Mỗi khi chúng ta sử dụng hàm include hay require, include_one, require_one của PHP để gọi 1 file thì engine PHP sẽ tìm kiếm file này trong các folder được khai báo trong include_path. Engine PHP sẽ tìm lần lượt từng folder cho đến khi nào thấy. Trong đoạn code trên, Magento đã set lại include_path và đặt folder Local lên đầu tiên, sau đó mới đến Community, Core và các folder thư viện khác. Vậy nên khi chúng ta tạo ra ở local 1 file với tên và đường dẫn giống hệt file trong Core thì engine PHP sẽ đọc luôn file này mà ko đọc file trong Core nữa.

Cách set lại include_path này cho phép những người phát triển hệ thống Magento có thể ghi đè lại Core mà không cần sửa trực tiếp.