2013-04-09 16 views
5

Tôi có một System.Xml trong mô-đun của tôi, bắt đầu với điều này:Làm cách nào để tải dữ liệu xml cấu hình phụ trợ của Magento?

<config> 
    <sections> 
     <dev> 
      <groups> 
       <my_module> 
        <label>... 

Tôi muốn nhận được giá trị của nhãn này, từ một mô-đun khác nhau. Tôi phải làm nó như thế nào? Suy nghĩ đầu tiên của tôi, là Mage::getConfig('sections/dev/groups/my_module/label'), nhưng điều này không hoạt động - có vẻ như khu vực <sections> của cấu hình không thể truy cập được. Tôi cũng không thể tìm ra nơi mà Magento đang tải giá trị này, mà nó phải làm tại một số điểm, hoặc nó sẽ không thể hiển thị nó.

Để được hoàn toàn rõ ràng: Tôi không cố gắng để có được giá trị dữ liệu cấu hình như được lưu trữ trong bảng core_config_data, đó là không có rắc rối. Tôi muốn có thể nhận được các thuộc tính khác liên quan đến nó - như nhãn nhóm, hoặc thứ tự sắp xếp của các trường, và để làm điều đó tôi cần để có thể đọc khu vực <sections> của cấu hình.

Trả lời

6

Các tệp system.xml không bao giờ được hợp nhất với cấu hình chung. Chúng chỉ được tải khi Magento xây dựng giao diện người dùng cho các phần

System -> Configuration 

của ứng dụng quản trị phụ trợ. Ngoài ra, ứng dụng không sử dụng cho chúng.

Nếu bạn muốn lấy nhãn, bạn sẽ cần tự nạp toàn bộ cấu hình system.xml của mình. Một cái gì đó như thế này sẽ làm việc.

//load and merge `system.xml` files 
$config = Mage::getConfig()->loadModulesConfiguration('system.xml');   

//grab entire <sections/> node 
var_dump($config->getNode('sections')->asXml());   

//grab label from a specific option group as a string 
var_dump((string)$config->getNode('sections/dev/groups/restrict/label')); 

Như đã đề cập trong một câu trả lời trong chủ đề này, cũng có một lớp adminhtml/config mô hình mà kết thúc tốt đẹp một số logic này trong một phương pháp getSection, vì vậy bạn có thể làm một cái gì đó như thế này.

Mage::getSingleton('adminhtml/config')->getSection('dev')->groups->my_module->label 

Nếu bạn nhìn vào nguồn gốc của getSection

#File: app/code/core/Mage/Adminhtml/Model/Config.php 
public function getSections($sectionCode=null, $websiteCode=null, $storeCode=null) 
{ 
    if (empty($this->_sections)) { 
     $this->_initSectionsAndTabs(); 
    } 

    return $this->_sections; 
} 

và làm theo các cuộc gọi stack thông qua để _initSectionsAndTabs

#File: app/code/core/Mage/Adminhtml/Model/Config.php 
protected function _initSectionsAndTabs() 
{ 
    $config = Mage::getConfig()->loadModulesConfiguration('system.xml') 
     ->applyExtends(); 

    Mage::dispatchEvent('adminhtml_init_system_config', array('config' => $config)); 
    $this->_sections = $config->getNode('sections'); 
    $this->_tabs = $config->getNode('tabs'); 
} 

Bạn sẽ thấy phương pháp wrapper này cuối cùng gọi phương thức loadModulesConfiguration bản thân . Số applyExtends bổ sung nếu số old bit of meta-programming in the configuration you can read about here, là một phần của a longer series on configuration loading. (tự liên kết, quá dài cho một câu trả lời StackOverflow).

Lý do cá nhân tôi sẽ không sử dụng để lấy các giá trị ra khỏi cấu hình là sự kiện đó là cử khi bạn thực hiện cuộc gọi này

Mage::dispatchEvent('adminhtml_init_system_config', array('config' => $config)); 

Sự kiện này có thể kích hoạt mã trong hệ thống của bạn, cho rằng bạn đang tải hệ thống cấu hình hệ thống trong vùng bảng điều khiển dành cho quản trị viên phụ trợ. Nếu bạn chỉ cần muốn đọc cây XML. chỉ đơn giản là tải nó cho mình và đọc các giá trị có vẻ là con đường để đi. Trường hợp sử dụng của bạn, tất nhiên, có thể khác nhau.

+0

Tìm thấy giải pháp khác ngay sau khi bạn đăng nội dung này ... sự khác biệt là gì? Tại sao nên sử dụng loadModulesConfiguration thay vì getSingleton ('adminhtml/config')? – Benubird

+0

@Benubird Cập nhật câu trả lời với nhiều thông tin và ngữ cảnh hơn. Phiên bản ngắn: Kỹ thuật bạn tìm thấy sử dụng chính phương thức 'loadModulesConfiguration'. –

2

Như thường có vẻ như vậy, tôi tìm thấy thời điểm trả lời sau khi đăng câu hỏi ...

Đây là cách để có được phần/dev/my_module/label:

Mage::getSingleton('adminhtml/config')->getSection('dev')->groups->my_module->label 

Như bạn thấy, bạn cần phải sử dụng Mage::getSingleton('adminhtml/config')->getSection('dev') để có được cấu hình phụ trợ (bạn cũng có thể sử dụng ->getSections() để có được tất cả các phần để lặp lại). Điều này trả về một đối tượng Mage_Core_Model_Config_Element, là gốc của một cây đối tượng, có thể truy cập như được hiển thị. Chỉ cần làm một print_r ở bất kỳ giai đoạn nào và bạn sẽ thấy phần còn lại của cây, mà các định dạng print_r như một mảng, mặc dù nó không phải.