2010-03-18 9 views
1

J'ai remarqué que Magento conserve l'URL du logo qu'il utilise pour chaque magasin que vous avez configuré dans le tableau core_config_data.Magento: Mettre à jour le logo du magasin par programmation

Si je lance ce SQL:

SELECT * 
FROM core_config_data` 
WHERE path = 'design/header/logo_src' 

-je obtenir une liste des magasins et leur logo associé. Je reçois également un config_id et un scope_id. Je voudrais être capable de mettre à jour ces logos derrière la scène, mais je n'arrive pas à comprendre comment relier les données de cette table à un nom de magasin.

config_id et store_id obtenu en quelque sorte lien vers une autre table qui établit la relation. Le modèle EAV de Magento, pouah :)

Des idées?

Répondre

6

Magento fournit une API pour définir et récupérer les valeurs de configuration. J'ai écrit un article sur fetching data out of the config. Vous voudrez l'examiner si l'une des terminologies ci-dessous vous confond. En ce qui concerne la définition des variables, il n'est pas aussi simple que de dire "Je veux définir la variable design/header/logo_src" sur "this value". Vous devez également spécifier le site Web pour lequel vous enregistrez les valeurs et le magasin pour lequel vous enregistrez les valeurs.

Il est important d'être prudent ici. Je n'ai pas examiné en profondeur le système pour voir si Magento applique la granularité "show for website, show for site" des valeurs de configuration au niveau back-end/resource, ou seulement au niveau de l'interface utilisateur. Mes instincts disent que c'est le dernier, ce qui signifie que vous pourriez finir par enregistrer une valeur au niveau du site Web/magasin qui n'était pas destinée à être sauvable à ce niveau, et qui pourrait conduire à l'Undefined Behavior redouté.

Dans l'édition 1.4 de la communauté, vous pouvez voir où Magento est de sauvegarder les valeurs de configuration à l'emplacement suivant

File: app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php 

//around line 126 
Mage::getModel('adminhtml/config_data') 
    ->setSection($section) 
    ->setWebsite($website) 
    ->setStore($store) 
    ->setGroups($groups) 
    ->save(); 

Mises en garde sur la route, le code pour vous mettre à jour uniquement le logo pour le magasin de haut niveau/Config site Web serait.

//create a groups array that has the value we want at the rigth location 
$groups_value = array(); 

$groups_value['header']['fields']['logo_src']['value'] = 'images/logo.gif'; 
Mage::getModel('adminhtml/config_data') 
    ->setSection('design') 
    ->setWebsite(null) 
    ->setStore(null) 
    ->setGroups($groups_value) 
    ->save(); 

La ligne

Mage::getModel('adminhtml/config_data') 

instancie un modèle Magento.

Le 'design' dans la méthode setSection ainsi que la chaîne 'header' et 'logo_src' correspondent à l'URI config

design/header/logo_src 

Je suis sûr que les null s passés à setWebsite et setStore dire l'objet que vous enregistrez cette valeur au niveau supérieur. Vous pouvez également passer en magasin et les ID de site Web. (Je suis un peu fragile sur ce point, mais quand vous enregistrez le logo normalement, c'est ce que fait le système)

Les codes 'fields' et 'values' sont codés en dur. L'objectif de l'objet est de sauvegarder plusieurs valeurs de configuration à la fois de tous les groupes d'une section.

Vérifiez la méthode saveAction dans le contrôleur ci-dessus si vous êtes curieux.

+0

Merci, était très serviable pour moi. – Rakward

1

Merci pour la réponse détaillée. Je l'apprécie vraiment.

Je compris que je peux insérer un nouvel enregistrement comme celui-ci:

INSERT INTO core_config_data (`scope`, `scope_id`, `path`, `value`) 
VALUES ('websites', $websiteId, 'design/header/logo_src', $logo); 

Je l'ai testé et il semble ajouter un logo différent pour le magasin dans la configuration - page de conception, mais quand je fais référence le logo par <?php echo $this->getLogoSrc() ?> dans mon header.phtml il tire toujours le logo par défaut de la configuration de niveau supérieur.

Je pense qu'en utilisant votre message comme un guide, je peux commencer à déboguer en utilisant Mage::log() et voir où cela me prend.

+2

Vous devez appeler Mage :: getConfig() -> reinit(); et Mage :: app() -> reinitStores(); après la mise à jour manuelle d'une valeur de configuration. Magento les garde en cache. –

+0

Merci Alan je l'apprécie! –

4

Le plus facile et la plus courte est la méthode:

Mage::getConfig()->saveConfig('design/header/logo_src', $logo);