我的许多产品都以某种方式取消了“使用默认值”的选择。
我的商店有2种语言,英语和法语。法文使用“默认商店”值,因此,当我更新产品时,除非我在法文商店视图上手动进入产品并选择“使用默认值”,否则它不会出现在前端。
似乎没有大规模动作的属性,我遇到了一些脚本和MySQL查询,但是尚不清楚这些解决方案是否将所有商店视图重置为使用默认值。
理想的结果是在所有产品的特定商店视图(法语)上设置“使用默认值”。
如何在特定商店视图中将大量产品(或所有产品)重置为“使用默认值”?
我的许多产品都以某种方式取消了“使用默认值”的选择。
我的商店有2种语言,英语和法语。法文使用“默认商店”值,因此,当我更新产品时,除非我在法文商店视图上手动进入产品并选择“使用默认值”,否则它不会出现在前端。
似乎没有大规模动作的属性,我遇到了一些脚本和MySQL查询,但是尚不清楚这些解决方案是否将所有商店视图重置为使用默认值。
理想的结果是在所有产品的特定商店视图(法语)上设置“使用默认值”。
如何在特定商店视图中将大量产品(或所有产品)重置为“使用默认值”?
Answers:
不幸的是,在这种情况下,没有一种有效的方法来更新产品属性。$product->getResource()->saveAttribute()
即使您在$product
对象上设置了商店ID,也会更新所有商店视图的属性。Mage::getSingleton('catalog/product_action')->updateAttributes()
仅更新特定存储中的值,但不能将属性设置为使用默认值(另请参阅此堆栈溢出问题以获取参考)。因此,我们必须通过来使用缓慢的内存密集型方法$product->save()
。
我假设您知道要更新哪些属性。对于以下示例,我将visibility
属性设置为使用默认值。然后,以下脚本可以解决问题(请确保根据需要进行更改):
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
require_once 'app/Mage.php';
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
set_time_limit(0);
function useDefaultValueCallback($args)
{
// change to the ID of your french store view
$specificStoreViewId = 7;
$product = Mage::getModel('catalog/product');
$product->setData($args['row']);
$product->setStoreId($specificStoreViewId);
// change according to your needs
$product->setData('visibility', false);
$product->save();
}
$products = Mage::getModel('catalog/product')->getCollection();
Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array('useDefaultValueCallback'));
假设法国商店的商店ID为2,则应运行以下mysql查询:
DELETE FROM `catalog_product_entity_text` where store_id = 2;
DELETE FROM `catalog_product_entity_datetime` where store_id = 2;
DELETE FROM `catalog_product_entity_decimal` where store_id = 2;
DELETE FROM `catalog_product_entity_int` where store_id = 2;
DELETE FROM `catalog_product_entity_varchar` where store_id = 2;
基本上,这会删除商店ID设置为2的所有属性和产品的属性值。当Magento找不到针对特定商店ID的产品的属性值时,它将选择默认值。
false
像我一样将属性值设置为,则将选中“使用默认值”选项。尽管您的解决方案可能会起作用,但我个人不喜欢使用直接SQL查询。
加入时间有点晚,但我真的不喜欢上述任何一个答案。
这是我的尝试,尚未经过全面测试,但似乎可以满足我的需要。
/**
* If given store code will reset only that store, otherwise will set all stores to "use default"
*
* If given product ids will reset only those products, otherwise all products will be set to "use default"
*
* @param $attributeCode
* @param null $storeCode
* @param null $productIds
*
*/
public function forceProductsToUseDefault($attributeCode, $storeCode = null, $productIds = null)
{
$conditions = array();
if (is_null($storeCode)) {
$conditions['store_id != ?'] = Mage_Core_Model_App::ADMIN_STORE_ID;
} else {
$store = Mage::app()->getStore($storeCode);
if (!$store instanceof Mage_Core_Model_Store || !$store->getId()) {
Mage::throwException("Store with code not found: $storeCode");
}
$conditions['store_id = ?' ] = $store->getId();
}
if (!is_null($productIds)) {
$conditions['entity_id in(?)'] = $productIds;
}
$attribute = Mage::getModel('eav/entity_attribute')
->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attributeCode);
if (!$attribute instanceof Mage_Eav_Model_Entity_Attribute_Abstract || !$attribute->getId()) {
Mage::throwException("Attribute with code not found: $attributeCode");
}
$conditions['attribute_id = ?'] = $attribute->getId();
$coreResource = Mage::getSingleton('core/resource');
$coreResource->getConnection('core_write')->delete(
$coreResource->getTableName(array('catalog/product', $attribute->getData('backend_type'))),
$conditions
);
}
您可以在 adminhtml事件之前使用core_block_abstract_to_html_beby以admin批量更新形式为每个属性添加所需的复选框。
protected $_controllers = array(
'attribute',
'catalog_product_action_attribute'
);
public function htmlBefore(Varien_Event_Observer $observer)
{
$block = $observer->getBlock();
if (!isset($block)) {
return $this;
}
$request = Mage::app()->getRequest();
$storeId = $request->getParam('store');
if ($storeId != 0) {
if(in_array($request->getControllerName(), $this->_controllers)
&& $request->getActionName() == 'edit') {
// Add use_default checkboxes
if ($block instanceof Mage_Adminhtml_Block_Catalog_Form_Renderer_Fieldset_Element) {
$block->getDataObject()->setId('empty');
$block->getDataObject()->setStoreId($storeId);
$block->getDataObject()->setExistsStoreValueFlag($block->getAttribute()->getAttributeCode());
}
}
}
}
然后,您将需要使用catalog_product_attribute_update_before事件从特定商店视图的EAV表中删除值,仅针对那些具有您之前注入的复选框(已将core_block_abstract_to_html_before设置为选中状态)的属性。
希望能有所帮助。
该模块正是这样做的:http : //mageinn.com/product/adminextra/也可以使用该模块重置' url_key '属性。
$product->setData('visibility', false);
它会在方框里打勾,而且还设置可见性为“true”,这是我不想