对所有产品的特定商店视图重置“使用默认值”


16

我的许多产品都以某种方式取消了“使用默认值”的选择。

我的商店有2种语言,英语和法语。法文使用“默认商店”值,因此,当我更新产品时,除非我在法文商店视图上手动进入产品并选择“使用默认值”,否则它不会出现在前端。

似乎没有大规模动作的属性,我遇到了一些脚本和MySQL查询,但是尚不清楚这些解决方案是否将所有商店视图重置为使用默认值。

理想的结果是在所有产品的特定商店视图(法语)上设置“使用默认值”。

如何在特定商店视图中将大量产品(或所有产品)重置为“使用默认值”?

Answers:


7

不幸的是,在这种情况下,没有一种有效的方法来更新产品属性。$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'));

是否可以在不更改属性数据的情况下勾选“使用默认值”?因为在这里,如果我使用$product->setData('visibility', false);它会在方框里打勾,而且还设置可见性为“true”,这是我不想
Jurģis汤姆斯Liepiņš

1
@JurģisTomsLiepiņš如果选中该框,它将使用默认值,即父作用域中的值。因此,如果您勾选该框并将其切换为“ true”,则您的父范围值也将为“ true”。如有其他问题,请提出一个新问题。
西蒙(Simon)

我问了一个新的问题,我希望你能澄清/清除一些事情对我来说
Jurģis汤姆斯Liepiņš

我成功地使用setData设置为false(从cli调用时)。但是我注意到,当我从前端控制器路由调用相同的函数时,它不起作用!有人已经面临这个问题吗?
DarkCowboy

@DarkCowboy这可能是权限问题。我认为您不能将产品保存在前端控制器中。如有其他问题,请打开一个新的。
西蒙

24

假设法国商店的商店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的产品的属性值时,它将选择默认值。


1
这不是真的。如果false像我一样将属性值设置为,则将选中“使用默认值”选项。尽管您的解决方案可能会起作用,但我个人不喜欢使用直接SQL查询。
西蒙

抱歉,我误解了您的答案,并认为您是在要求OP输入所有默认值而不是false。您的解决方案有效:)
Paras Sood

5
请注意,“这不是真的”是指对Simon的答案的评论,该评论现已被删除。该解决方案有效。
Fabian Schmengler,2015年

@fschmengler Paras会回答如何在前端显示图像吗?我在新商店中遇到了同样的问题,所有产品和图像都在那里,但是没有选择它们作为默认值。
方法

@thismethod不,这有所不同。可能已经有一个问题,否则请问一个新问题
Fabian Schmengler

7

加入时间有点晚,但我真的不喜欢上述任何一个答案。

  1. 西蒙斯(Simons)走遍产品系列的答案非常缓慢且效率低下,但是至少使用了Magento
  2. ParasSood对数据库进行直接修改的答案有点吓人,并且如果您希望将其包装成一些自动化功能,则可能用处不大。

这是我的尝试,尚未经过全面测试,但似乎可以满足我的需要。

/**
 * 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
    );
}

为什么我们在第14行抛出语法错误?@Luke Rodgers
增刊

怎么了
路德·罗杰斯

现在已修复,但此操作无法在我的开发人员上正常运行和完成。环境。有什么建议么?
补充

没有实际的错误就无济于事了:)
卢克·罗杰斯

关于如何使用此代码的任何指南?我可以将其用作独立脚本吗?
克里斯·温

3

您可以 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 '属性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.