2012-10-10 12 views
5

Sto cercando una buona soluzione per sovrascrivere la configurazione Magento senza modificare i valori predefiniti.Override Magento Config

Ad esempio, voglio sovrascrivere l'elemento "web/unsecure/base_skin_url" nella tabella core_config_data senza eliminare il valore esistente. Quindi, se in qualsiasi parte del codice viene chiamato il codice esatto:

Mage::getStoreConfig('web/unsecure/base_skin_url'); 

Esso troverà l'opzione di configurazione ho impostato e non quello di default ...

Grazie in anticipo!

Chuck

risposta

9

Magento legge i propri valori di configurazione in fase di esecuzione direttamente dalla struttura ad albero dell'oggetto di configurazione, quindi è necessario utilizzare il metodo nativo setNode dell'oggetto di configurazione per modificare i valori. Tuttavia, a causa del modo in cui Magento loads in scoped configuration (collegamento automatico), non è così semplice come sembra.

Con le versioni correnti di Magento (e credo, ma non ho testato, con versioni precedenti), è necessario impostare il valore di configurazione nel set di nodi per l'attuale store.

Il primo passo è ottenere il codice per il negozio attualmente impostato. È possibile farlo a livello di codice con il seguente

$store = Mage::app()->getStore(); 
$code = $store->getCode(); 

allora, è possibile impostare un valore di configurazione con il seguente invito

$config = Mage::getConfig(); 
$config->setNode("stores/$code/web/unsecure/base_skin_url", 'value_to_set'); 

Tenete a mente tutto questo deve accadere dopo Magento ha bootstrap della configurazione oggetto. Inoltre, tieni presente che esiste un periodo in cui Magento avrà una configurazione caricata, ma l'oggetto del negozio non verrà caricato. In questo caso non è possibile caricare il codice negozio dall'oggetto del negozio.

Ho fatto qualcosa di simile nel mio Pulse Storm Chaos module. Se sei interessato a lavorare su codice, è il Github.

+0

Grazie per la bella spiegazione Alan! Posso vedere come questo potrebbe funzionare bene sulla configurazione per negozio, ma cosa succede se voglio tutti i negozi (e siti web) per utilizzare la mia opzione di configurazione personalizzata? In sostanza, voglio che la mia opzione di configurazione personalizzata sia globale ... –

+0

Versione corta di @ChuckD: dovrai aggiungerla per ogni negozio nel sistema (chiamate multiple). Quando Magento crea i nodi store/store_code prende in considerazione i valori predefiniti e quelli del sito web. In questo modo, il metodo getStoreConfig può sempre guardare store/store_code per trovare il valore corretto. –

+0

Chuck, hai provato '$ config-> setNode (" global/web/unsecure/base_skin_url ", 'value_to_set');'? Solo un'idea, non testata. – Jongosi

1

Se si desidera sovrascrivere alcuni dati di configurazione speciali, è possibile inserirli in app/etc/local.xml. Ma questo è utile solo per il tuo negozio, non per i moduli pubblici.

Ecco un modo per sovrascrivere lo base_url per scopi di sviluppo senza alterare il database.

<config> 
... 
    <stores> 
     <default> 
      <web> 
       <unsecure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </unsecure> 
       <secure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </secure> 
      </web> 
     </default> 
     <admin> 
      <web> 
       <unsecure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </unsecure> 
       <secure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </secure> 
      </web> 
     </admin> 
    </stores> 
... 
</config> 
+0

Si sta riscrivendo il valore solo per archivio con codice "predefinito" e admin. Inoltre, dopo aver unito la configurazione globale di tutti i file XML, Magento lo aggiorna dalla tabella core_config_data. Se il valore nell'archivio è stato definito prima sostituirà il valore da xml. –

+0

Era esattamente quello che stavo cercando. Ho perso il tag "", ma ora funziona :) Non sono completamente sicuro delle cose che @PavelNovitsky ha detto. Ma per un semplice sito di un negozio, questo dovrebbe essere sufficiente. – func0der

7

La risposta di Alan è corretta, ma non interessa la cache di configurazione. Ad esempio, se si chiama Mage::getStoreConfig('web/unsecure/base_skin_url') due volte e si modifica il valore compreso tra, la modifica non ha alcun effetto. Per ovviare a questo problema, è necessario utilizzare $store->setConfig('web/unsecure/base_skin_url', 'value_to_set'). Lo fa entrambi: aggiorna la cache di configurazione e imposta il nodo di configurazione con il metodo di Alan.

+2

Grazie, funziona! Se qualcuno è curioso su come ottenere la variabile '$ store', menzionata nella risposta:' $ store = Mage :: app() -> getStore(); ' –