Magento: установить значения конфигурации только что созданного веб-сайта? - PullRequest
4 голосов
/ 30 августа 2010

Я программно создаю сайты / пользователей и т. Д. *

Вот проблема: при создании сайта я не могу сразу установить значения конфигурации.

Код:

<?php
/* Website information */
$website_data = array(
            'name' => 'Company name',
            'code' => 'website_company_1',
            'sort_order' => '1',
            );

/* Save website */
$website = Mage::getModel('core/website'); 
$website->setData($website_data);
$website->save();

/* Get website code */
$web_code = $website->getCode();

/* R-int stores */
Mage::app()->reinitStores();

/* Config data array example */
$data = array('name' => 'Company 1', 'phone' => '056 22 33 61')

/* Set config values in array */
$groups = array();
 foreach($data as $key => $value){
 $groups['store_information']['fields'][$key]['value'] = $value;
 }


/* Save config values */
Mage::getModel('adminhtml/config_data')
      ->setSection('general')
      ->setWebsite($web_code)
      ->setStore(NULL)
      ->setGroups($groups)
      ->save();


/* Re-init again */
Mage::app()->reinitStores();

Однако по какой-то причине это не работает, но если я сначала создаю веб-сайт (с тем же кодом), а затем выполняю эту функцию config-save, он работает нормально.Как будто ему нужно сначала загрузить новую страницу, прежде чем он сможет установить / обновить значения конфигурации.Я думал, что повторная инициация решит это, но это не так ...

Мысли?

Ответы [ 2 ]

7 голосов
/ 26 июля 2011

Для этой цели следует использовать сценарии установки / обновления (это сценарии внутри папок sql модулей).Возможно, вы даже захотите создать специфичный для установки модуль с / в котором для их запуска.

Просто объявите установочный ресурс в глобальном / ресурсном узле вашего модуля и затем создайте файл (ы), необходимые для этого,Используйте Mage_Core_Model_Resource_Setup или сделайте так, чтобы ваш класс установки расширился оттуда.

См. Mage_Core_Model_Resource_Setup :: setConfigData () и Mage_Core_Model_Resource_Setup :: deleteConfigData () .

Mage_Core_Model_Resource_Setup :: addConfigField () также может быть использован, но не реализован в ядре из того, что я могу сказать.

<?xml version="1.0" ?>
<!-- module config.xml -->
<config>
    <modules>
        <Your_Module>
            <version>1.0</version>
            <!-- upgrade script #s evaluated with version_compare(), FYI -->
        </Your_Module>
    </modules>
    <global>
        <resources>
            <unique_node>
                <setup>
                    <!-- match node under <modules> -->
                    <module>Your_Module</module>
                    <class>Mage_Core_Model_Resource_Setup</class>
                </setup>
            </unique_node>
        </resources>
    </global>
</config>

Затем в вашей установке / обновленииСценарии делают это:

<?php

$installer = $this;
/* @var $installer Mage_Core_Model_Resource_Setup */ //or whatever you configured

$installer->startSetup();

$installer->setConfigData($path, $value, $scope='default', $scopeId=0) //inherit is not implemented

$installer->endSetup();
5 голосов
/ 18 сентября 2010

Вы не упомянули, на какой версии Magento вы находитесь. Я протестировал нижеследующее на 1.4.1.1 и внес некоторые изменения, чтобы это был работающий пример.

Основным отличием является изменение от

Mage::app()->reinitStores();

до

Mage::app()->getConfig()->reinit();

, который перезагружает конфигурацию, а также перезагружает кеш.

Полный пример:

<?php

require_once 'app' . DIRECTORY_SEPARATOR . 'Mage.php';
Mage::app();

/* Website information */
$website_data = array(
    'name' => 'Website Name',
    'code' => 'website_company',
    'sort_order' => '2',
    'is_active' => 1,
);

/* Save website */
$website = Mage::getModel('core/website');
$website->setData($website_data);
$website->save()->load();

/* Save store */
$storeGroup = Mage::getModel('core/store_group');
$storeGroup->setData(
        array(
            'root_category_id' => '3',
            'website_id' => $website->getId(),
            'name' => 'Store',
        )
);
$storeGroup->save()->load();

$store = Mage::getModel('core/store');
$store->setData(
        array(
            'website_id' => $website->getId(),
            'name' => $storeGroup->getName(),
            'code' => 'store_' . $website->load()->getId(),
            'group_id' => $storeGroup->getGroupId(),
            'is_active' => 1,
        )
);
$store->save()->load();

/* Re-init */
Mage::app()->getConfig()->reinit();

/* Config data array example */
$data = array('name' => 'Company 1', 'phone' => '056 22 33 61');

/* Set config values in array */
$groups = array();
foreach ($data as $key => $value) {
    $groups['store_information']['fields'][$key]['value'] = $value;
}

/* Save config values */
$data = Mage::getModel('adminhtml/config_data')
                ->setSection('general')
                ->setWebsite($website->getCode())
                ->setGroups($groups)
                ->save();
...