2010-08-30 44 views
4

我正在编程创建网站/用户等...Magento:设置刚刚创建的网站的配置值?

这是问题:创建网站时,我不能马上设置配置值。

代码:

<?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(); 

然而,这并不能出于某种原因,但如果我先创建一个网站(代码相同),然后执行此之后配置保存功能,它工作正常。就好像它需要首先加载一个新的页面,然后才能设置/更新配置值。我认为重新启动会解决这个问题,但它不会...

想法?

+0

的更多细节将有助于人们调试此。具体来说,$ website_data和$ data中的内容以及它们从哪里填充。 – 2010-08-30 20:38:49

+0

增加了一些示例代码,因为实际的代码是很重要的。这两个都只是关联数组,可以正常工作,但已经创建的网站只是不在上,这是在同一个脚本中创建的... – Rakward 2010-08-31 06:36:54

+0

我怀疑这里有一些索引。尝试开启SQL日志记录(参考http://www.magentocommerce。com/boards/viewreply/77655 /)在创建网站后捕获任何索引或其他活动,然后追踪负责该代码的代码,并将其复制到代码中。 – 2010-08-31 06:41:39

回答

5

你没有提及你的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(); 
+0

你能告诉我如何以编程方式为商店设置安全和不安全的基础链接url吗? – 2012-12-07 11:28:48

7

您应该使用安装/升级脚本用于此目的(这是脚本内模块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(); 
+0

+1,完全是我的想法 – 2012-11-30 14:23:03