Atur Ulang “Gunakan Nilai Default” untuk tampilan toko khusus pada semua produk

16

Entah bagaimana sejumlah produk saya telah memilih "Gunakan Nilai Default".

Toko saya memiliki 2 bahasa, Inggris dan Prancis. French menggunakan nilai Default Store, jadi sekarang ketika saya memperbarui produk itu tidak muncul di ujung depan kecuali saya secara manual pergi ke produk pada tampilan toko Prancis dan pilih "Gunakan Nilai Default",

Tampaknya tidak ada atribut untuk tindakan massal, saya telah menemukan beberapa skrip dan permintaan MySQL namun tidak jelas apakah solusi tersebut mengatur ulang semua tampilan toko untuk menggunakan nilai default.

Hasil yang diinginkan adalah untuk menetapkan "Gunakan Nilai Default" pada tampilan toko tertentu (Prancis) pada semua produk.

Bagaimana cara mengatur ulang sejumlah besar produk (atau semua produk) menjadi "Gunakan Nilai Default" pada tampilan toko tertentu?

SR_Magento
sumber

Jawaban:

7

Sayangnya, tidak ada cara efisien untuk memperbarui atribut produk yang berfungsi dalam kasus ini. $product->getResource()->saveAttribute()memperbarui atribut untuk semua tampilan toko bahkan jika Anda menetapkan ID toko pada $productobjek. Mage::getSingleton('catalog/product_action')->updateAttributes()hanya memperbarui nilai di toko tertentu, tetapi tidak dapat mengatur atribut untuk menggunakan nilai default (lihat juga pertanyaan Stack Overflow ini untuk referensi). Oleh karena itu, kita harus menggunakan cara lambat, intensif memori melalui $product->save().

Saya berasumsi bahwa Anda tahu atribut mana yang ingin Anda perbarui. Untuk contoh berikut, saya mengatur visibilityatribut untuk menggunakan nilai default. Script berikut harus melakukan trik (pastikan Anda mengubahnya sesuai dengan kebutuhan Anda):

<?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'));
Simon
sumber
Apakah ada cara untuk menandai "gunakan nilai default" tanpa mengubah data atribut? Karena di sini, jika saya menggunakannya $product->setData('visibility', false);akan mencentang kotak, tetapi juga mengatur visibilitas ke "true", yang saya tidak mau
Jurģis Toms Liepiņš
1
@ JurģisTomsLiepiņš Jika Anda mencentang kotak, ia menggunakan nilai default, yang merupakan nilai dari lingkup induk. Karenanya, jika Anda mencentang kotak dan beralih ke "true", nilai cakupan induk Anda juga "benar". Untuk pertanyaan lebih lanjut, silakan ajukan pertanyaan baru.
Simon
Saya mengajukan pertanyaan baru , saya harap Anda dapat mengklarifikasi / menghapus beberapa hal untuk saya
Juromsis Toms Liepi 13š
Saya menggunakan setData ke false berhasil (ketika dipanggil dari cli). Tapi saya perhatikan ketika saya memanggil fungsi yang sama dari rute frontend controller, itu tidak berfungsi! Apakah seseorang sudah menghadapi masalah ini?
DarkCowboy
@DarkCowboy Ini mungkin masalah izin. Saya tidak berpikir bahwa Anda dapat menyimpan produk di pengontrol frontend. Untuk pertanyaan lebih lanjut, silakan buka yang baru.
Simon
24

Dengan asumsi id toko untuk toko Prancis adalah 2, Anda harus menjalankan query mysql di bawah ini:

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;

Ini pada dasarnya menghapus nilai atribut untuk semua atribut dan produk yang mana id toko diatur ke 2. Ketika Magento tidak dapat menemukan nilai atribut untuk produk terhadap id toko tertentu, itu mengambil nilai default.

Paras Sood
sumber
1
Ini tidak benar. Jika seseorang menetapkan nilai atribut falseseperti yang saya lakukan, opsi "gunakan nilai default" akan dicentang. Meskipun solusi Anda mungkin berhasil, saya pribadi tidak suka menggunakan query SQL langsung.
Simon
Ok, maaf, saya salah membaca jawaban Anda dan mengira Anda meminta OP untuk memasukkan semua nilai default alih-alih salah. Solusi Anda bekerja :)
Paras Sood
5
Harap dicatat bahwa "Ini tidak benar" mengacu pada komentar pada jawaban Simon yang sekarang telah dihapus. Solusinya bekerja.
Fabian Schmengler
@fschmengler Akankah Paras menjawab berfungsi untuk menunjukkan gambar di ujung depan? Saya memiliki masalah yang sama dengan toko baru saya semua produk dan gambar ada tetapi tidak dipilih untuk digunakan sebagai default.
metode ini
@metode tidak, ini sesuatu yang berbeda. Mungkin sudah ada pertanyaan untuk itu, kalau tidak silakan tanyakan yang baru
Fabian Schmengler
7

Bergabung agak terlambat, tetapi saya tidak terlalu menyukai jawaban di atas.

  1. Jawaban Simons untuk berjalan di atas koleksi produk sangat lambat dan tidak efisien, namun setidaknya menggunakan Magento
  2. Jawaban ParasSood untuk melakukan modifikasi langsung pada database agak menakutkan, dan tidak terlalu berguna jika Anda ingin ini dibungkus sebagai sedikit fungsi otomatis.

Inilah usaha saya, tidak sepenuhnya diuji tetapi tampaknya melakukan apa yang saya butuhkan.

/**
 * 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
    );
}
Luke Rodgers
sumber
Mengapa kita melempar kesalahan sintaks pada baris 14? @Luke Rodgers
Tambahan
Apa kesalahannya?
Luke Rodgers
Sudah diperbaiki sekarang tetapi ini tidak pernah berjalan dengan baik dan selesai pada dev saya. lingkungan Hidup. Ada saran?
Tambahan
Tidak dapat membantu tanpa kesalahan yang sebenarnya :)
Luke Rodgers
ada panduan tentang bagaimana saya harus menggunakan kode ini? dapatkah saya menggunakannya sebagai skrip mandiri?
Kris Wen
3

Anda dapat menggunakan core_block_abstract_to_html_ sebelum acara adminhtml untuk menambahkan kotak centang yang diperlukan untuk setiap atribut dalam formulir pembaruan massal 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());
                }
            }
        }
}

Maka Anda perlu menggunakan catalog_product_attribute_update_be sebelum acara untuk menghapus nilai-nilai dari tabel EAV untuk tampilan toko tertentu, hanya untuk atribut yang memiliki kotak centang yang Anda masukkan sebelumnya dengan core_block_abstract_to_html_before ditetapkan sebagai dicentang.

Semoga itu bisa membantu.

Modul ini melakukan hal itu: http://mageinn.com/product/adminextra/ Hal ini juga memungkinkan untuk mereset atribut ' url_key ' dengan modul itu.

kolucciy
sumber