すべての製品の特定のストアビューの「デフォルト値を使用」をリセットする


16

どういうわけか、私の製品の多くでは「デフォルト値を使用」の選択が解除されていました。

私の店には、英語とフランス語の2つの言語があります。フランス語はデフォルトストア値を使用するため、製品を更新するときに、フランス語ストアビューで製品に手動でアクセスして「デフォルト値を使用」を選択しない限り、フロントエンドに表示されません。

一括アクションの属性はないようです。スクリプトとMySQLクエリに出くわしましたが、これらのソリューションがすべてのストアビューをリセットしてデフォルト値を使用するかどうかは不明です。

望ましい結果は、すべての製品の特定のストアビュー(フランス語)に「デフォルト値を使用」を設定することです。

特定のストアビューで多数の製品(またはすべての製品)を「デフォルト値を使用」にリセットするにはどうすればよいですか?

回答:


7

残念ながら、この場合、製品属性を更新する効率的な方法は機能しません。オブジェクトに$product->getResource()->saveAttribute()ストアIDを設定した場合でも、すべてのストアビューの属性を更新します$productMage::getSingleton('catalog/product_action')->updateAttributes()特定のストアの値のみを更新しますが、デフォルト値を使用するように属性を設定することはできません(参照については、このStack Overflowの質問も参照してください)。したがって、を介して低速でメモリ集約型の方法を使用する必要があります$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);にはボックスをチェックしますが、また、私はいけない「真」に設定し、視認性、
ユルギストムズLiepiņš

1
@JurģisTomsLiepiņšボックスにチェックマークを付けると、デフォルト値(親スコープの値)が使用されます。したがって、チェックボックスをオンにして「true」に切り替えると、親スコープの値も「true」になります。さらに質問がある場合は、新しい質問をしてください。
サイモン

私は新しい尋ねた質問を、私はあなたが私のためにいくつかのことをクリア/明確化することを願って、
ユルギストムズLiepiņš

setcliをfalseに正常に使用します(cliから呼び出された場合)。しかし、フロントエンドコントローラールートから同じ関数を呼び出すと、機能しません!誰かがすでにこの問題に直面していますか?
ダークカウボーイ

@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クエリを使用することを好みません。
サイモン14

申し訳ありませんが、私はあなたの答えを読み違えて、OPにfalseではなくすべてのデフォルト値を入れるように頼んでいると思いました。あなたのソリューションは動作します:)
Paras Sood 14

5
「これは真実ではありません」とは、現在削除されたサイモンの答えに対するコメントを意味することに注意してください。ソリューションは動作します。
ファビアンシュメングラー

@fschmenglerパラスは、フロントエンドに画像を表示するための作業に答えますか?新しいストアでも同じ問題がありますが、すべての製品と画像がありますが、デフォルトとして使用するように選択されていません。
thismethod

@thismethodいいえ、これは何か違うものです。すでに質問があるかもしれませんが、そうでない場合は新しい質問をしてください
ファビアンシュメングラー

7

少し遅れて参加しましたが、私は上記の答えのどちらも本当に好きではありませんでした。

  1. 製品コレクションを歩くサイモンの答えはめちゃくちゃ遅くて非効率的ですが、少なくとも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行目に構文エラーがスローされるのはなぜですか?@ルークロジャース
サプリメント

エラーは何ですか?
ルークロジャース

現在は修正されていますが、これは開発者で正しく実行されて終了することはありません。環境。助言がありますか?
サプリメント

実際のエラーなしでは仕方がない:)
ルークロジャース

このコードの使用方法に関するガイドはありますか?スタンドアロンスクリプトとして使用できますか?
クリスウェン

3

core_block_abstract_to_html_before adminhtmlイベントを使用して、管理者一括更新フォームのすべての属性に必要なチェックボックスを追加できます。

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 '属性をリセットすることも可能です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.