2013-04-09 7 views
5

Ho uno system.xml nel mio modulo, che inizia con questo:Come posso ottenere i dati xml di backend config di magento?

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

voglio ottenere il valore di questa etichetta, da un modulo differente. Come lo faccio? Il mio primo pensiero è stato Mage::getConfig('sections/dev/groups/my_module/label'), ma questo non funziona - sembra che l'area <sections> della configurazione non sia accessibile. Inoltre non riesco a capire dove Magento stia caricando questo valore, cosa che deve fare a un certo punto, o non sarebbe in grado di visualizzarlo.

Per essere completamente chiaro: non sto cercando di ottenere il valore dei dati di configurazione come memorizzato nella tabella core_config_data, non ci sono problemi. Voglio essere in grado di ottenere gli altri attributi relativi ad esso - come l'etichetta del gruppo, o l'ordinamento dei campi, e per farlo devo essere in grado di leggere l'area <sections> della configurazione.

risposta

6

I file system.xml non vengono mai uniti con la configurazione globale. Vengono caricati solo quando Magento crea l'interfaccia utente per la

System -> Configuration 

sezione dell'applicazione di amministrazione di back-end. Oltre a questo l'applicazione non ha alcun senso per loro.

Se si desidera afferrare l'etichetta, è necessario caricare la configurazione completa system.xml da soli. Qualcosa del genere dovrebbe funzionare.

//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')); 

Come detto in un'altra risposta in questa discussione, c'è anche una classe adminhtml/config modello che avvolge una parte di questa logica in un metodo getSection, così si potrebbe fare qualcosa di simile.

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

Se si guarda alla fonte di 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; 
} 

e seguire lo stack delle chiamate fino al _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'); 
} 

Vedrete questo metodo involucro alla fine chiama il metodo in sé loadModulesConfiguration . Il applyExtends aggiuntivo se old bit of meta-programming in the configuration you can read about here, che fa parte di a longer series on configuration loading. (link automatici, troppo lunghi per una risposta StackOverflow).

La ragione per cui io personalmente non userei questo per afferrare i valori di configurazione è l'evento che viene inviato quando si effettua la chiamata

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

Questo evento può innescare codice nel tuo sistema che presuppone sei caricamento del sistema di configurazione del sistema nell'area della console di amministrazione di back-end. Se si solo si desidera leggere l'albero XML. semplicemente caricando te stesso e leggendo i valori sembra la strada da percorrere. Il tuo caso d'uso, ovviamente, può variare.

+0

Trovato una soluzione diversa subito dopo aver postato questo ... qual è la differenza? Perché è meglio usare loadModulesConfiguration invece di getSingleton ('adminhtml/config')? – Benubird

+0

@Benubird Aggiornamento della risposta con ulteriori informazioni e contesto. La versione breve: la tecnica che hai trovato utilizza il metodo 'loadModulesConfiguration' stesso. –

2

Come spesso sembra essere il caso, trovo la risposta pochi istanti dopo aver postato la domanda ...

Questo è come ottenere sezioni/dev/my_module/etichetta:

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

Come si può vedere, è necessario utilizzare Mage::getSingleton('adminhtml/config')->getSection('dev') per ottenere la configurazione back-end (si può anche usare ->getSections() per ottenere tutte le sezioni per scorrere su). Questo restituisce un oggetto Mage_Core_Model_Config_Element, che è la radice di un albero di oggetti, accessibile come mostrato. Basta fare un print_r in qualsiasi momento e vedrai il resto dell'albero, che print_r formatta come un array, sebbene non lo sia.

Problemi correlati