5

すべての変更をすべての環境に移行するには、データベースアップグレードスクリプトを使用します。私はそれらを使用してさまざまなインスタンス(顧客、税設定など)を作成しますが、通常は静的ブロックと構成設定を移行します。

静的ブロックを移行するには:

<?php
$block = Mage::getModel('cms/block');
$data = array(
   'title' => 'Block title',
   'identifier' => 'block_identifier',
   'content' => 'block content',
   'is_active' => 1,
   'stores' => array(0 => Mage_Core_Model_App::ADMIN_STORE_ID),
);

$block->addData($data);
$block->save();
?>

設定を移行するには:

<?php
Mage::getModel('core/config')->saveConfig('design/theme/default', 'theme');
?>

config.xmlを介してMagentoの設定を変更できることを知っています。

<default>
    <general>
        <store_information>
            <name>My Store</name>
        </store_information>
        <content_staging>
            <block_frontend_stub>home</block_frontend_stub>
        </content_staging>
    </general>
</default>

しかし、私が理解している限り、パス:general / store_information/name
general/content_staging / block_frontend_stub がdbに存在しないか、それらの値がNULLに等しい場合にのみ、このような方法で設定を変更できます。値がNULLでない場合、変更することはできません。 xml経由。私は自分のローカル環境でそれをテストしました、そして私は正しいと思いますが、xmlを介して構成を設定する責任があるMagentoでコードを見つけることができません。私は正しいですか?

それを担当するコードの部分を見せてくれませんか?そして、Magentoの移行のベストプラクティスは何ですか?多分私は何かを知りません:)

4

2 に答える 2

4

そうです、configxmlファイルで指定された値はcore_config_dataテーブルの値で上書きされます。B00MERが指摘したように、問題のコードは次のMage_Core_Model_Config::init()とおりです。

public function init($options=array())
{
    $this->setCacheChecksum(null);
    $this->_cacheLoadedSections = array();
    $this->setOptions($options);
    $this->loadBase();

    $cacheLoad = $this->loadModulesCache();
    if ($cacheLoad) {
        return $this;
    }
    $this->loadModules();
    $this->loadDb();
    $this->saveCache();
    return $this;
}

loadDb()の後に呼び出されることに注意してくださいloadModules()
実際のマージロジックは、構成リソースモデルにありMage_Core_Model_Resource_Config::loadToXml()ます。

グローバル設定ごとに、これは次のように呼び出されます。

$xmlConfig->setNode('default/' . $r['path'], $value);

Webサイトのスコープ設定ごとに、これは次のように呼ばれます。

$nodePath = sprintf('websites/%s/%s', $websites[$r['scope_id']]['code'], $r['path']);
$xmlConfig->setNode($nodePath, $value);

Webサイトのスコープ設定ごとに、これは次のように呼ばれます。

$nodePath = sprintf('stores/%s/%s', $stores[$r['scope_id']]['code'], $r['path']);
$xmlConfig->setNode($nodePath, $value);

これは少し単純化されていますが、より詳細な情報が必要な場合は、ソースを参照してください。

于 2012-07-04T13:56:08.567 に答える
2

各サーバーインスタンスのcore_config_dataviaから設定を指定できます。local.xml

<config>
   <stores>
       <store_code>
            <!-- config value for a store  (web/unsecure/base_url)  -->
            <web>
                <unsecure>
                      <base_url>http://example-magento-store.com</base_url>
               </unsecure>
            </web>
        </store_code>
   </stores>
   <websites>
       <website_code>
            <!-- config value for a website  (web/unsecure/base_url)  -->
            <web>
                <unsecure>
                      <base_url>http://another-example-magento-store.com</base_url>
               </unsecure>
            </web>
        </website_code>
   </websites>
   <default>
      <!-- default config value (web/unsecure/base_url) -->
       <web>
            <unsecure>
                   <base_url>http://default-magento-store.com</base_url>
              </unsecure>
        </web>
   </default>
</config>

出典:https ://twitter.com/IvanChepurnyi/status/111544548806758403

MagentoがXML構成ファイルからデータを設定している場所に興味がある場合は、クラスを確認してください。Mage_Core_Model_Config

ベストプラクティスに関する限り、トピックに関する多くの情報があります。

于 2012-07-03T11:20:25.483 に答える