Magento - Tambahkan / Hapus Atribut untuk Produk yang Dapat Dikonfigurasi yang Ada

18

Apa prosedur yang benar - daripada menghapus produk dan mulai lagi untuk menambah atau menghapus atribut ke produk yang dapat dikonfigurasi.

Saat membuat produk yang dapat dikonfigurasi, Anda diminta untuk memilih atribut mana yang akan digunakan untuk produk tersebut.

Saya memiliki banyak produk yang sekarang harus saya hapus beberapa atribut untuk yang dipilih pada awalnya, dan beberapa yang juga perlu menambahkan atribut yang pada awalnya tidak dipilih.

Setiap bantuan dengan ini dihargai - karena menghapus produk sepertinya bukan pendekatan terbaik untuk ini. Terutama karena banyak hal lain yang terkait dengan produk.

sebelas11
sumber
Jawaban yang benar di sini adalah: hapus produk dan buat yang baru, tetapi ada solusi untuk masalah ini (dan saya pikir modul) tapi saya pikir Anda bisa google sendiri, saya tidak punya solusi untuk ini dalam pikiran
Fabian Blechschmidt
Apakah Anda menemukan solusi untuk ini? Apakah jawaban di bawah ini solusinya? Tolong beri pembaruan.
philwinkle
Saya belum mencobanya. Tetapi saya akan menguji ini segera. Terima kasih banyak untuk menjawab - Saya akan menandai sebagai dijawab jika berfungsi
sebelas
Seperti saya memiliki atribut warna dan dikaitkan dengan semua produk yang dapat dikonfigurasi. Seandainya atribut tersebut telah dihapus. Sehingga tidak menemukan atribut tertaut di sana & menampilkan kesalahan sebagai "Pemberitahuan: Offset tidak terdefinisi: 0 di /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php on line 43 ". Butuh bantuan untuk menangani situasi ini. Terima kasih sebelumnya.
Bhagyashree

Jawaban:

14

Inilah yang berfungsi bagi saya untuk menghapus atribut dari produk yang dapat dikonfigurasi.
Ini skenarionya.
Semua produk yang dapat dikonfigurasi dibuat salah dengan atribut brandsebagai atribut yang dapat dikonfigurasi untuk sekitar 50 produk yang dapat dikonfigurasi yang memiliki sekitar 200 produk terkait sederhana.
Semua produk sederhana yang dikaitkan dengan atribut yang dapat dikonfigurasi memiliki merek yang sama. Idenya adalah untuk menghapus branddari atribut yang dapat dikonfigurasi dan menetapkannya sebagai atribut sederhana untuk produk yang dapat dikonfigurasi dengan nilai salah satu produk sederhana.
Berikut adalah kode yang melakukan ini. Kode dijalankan hanya satu kali. Itu dapat ditambahkan dalam skrip pemutakhiran atau file php sederhana.

<?php
//==>this is required only if you use a simple php file
error_reporting(E_ALL | E_STRICT);
$mageFilename = 'app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
umask(0);
Mage::app();
//<==

$brand = 'brand';
//get the attribute instance
$brandAttribute = Mage::getModel('eav/config')->getAttribute('catalog_product', $brand);
//if this attribute exists
if ($brandAttribute->getId()){
    //make the attribute apply to al types of products in case it's not
    $brandAttribute->setApplyTo(null);
    $brandAttribute->save();
    $resource = Mage::getSingleton('core/resource');
    //get an object with access to direct queries
    $connection = $resource->getConnection('core_write');
    //get all configurable products - you can specify additional filters here
    $collection = Mage::getModel('catalog/product')->getCollection()
        ->addAttributeToFilter('type_id', 'configurable');
    foreach ($collection as $product){
        //the configurable attributes are stored in the table 'catalog_product_super_attribute'
        //remove the attribute references from that table. 
        //The constraints will take care of the cleanup.
        $q = "DELETE FROM {$resource->getTableName('catalog_product_super_attribute')}
            WHERE attribute_id = {$brandAttribute->getId()} AND product_id = {$product->getId()}";
        $connection->query($q);
        //get the simple products in the configurable product
        $usedProducts =  $product->getTypeInstance(true)->getUsedProducts(null, $product);
        foreach ($usedProducts as $p){
            //identify the first simple product that has a value for brand 
            //set that value to the configurable product.
            if ($brandValue = $p->getData($brand)){
                Mage::getSingleton('catalog/product_action')
                    ->updateAttributes(array($product->getId()), array($brand=>$brandValue), 0);
                break;
            }
        }
    }
}

Untuk nomor yang tercantum di atas, ini membutuhkan waktu sekitar 15 detik untuk berjalan di mesin lokal saya (bukan yang kuat). Saya yakin ini bisa dioptimalkan. Kemungkinan besar tidak perlu mendapatkan semua produk sederhana dari produk yang dapat dikonfigurasi untuk mendapatkan brandnilai, tapi saya tidak repot-repot.

Marius
sumber
2
Saya benci itu harus dilakukan dengan cara ini dan tidak ada metode untuk mencapai hal yang sama tetapi terima kasih atas informasinya.
webnoob
@Marius, apakah ini akan berfungsi untuk 1.9?
Magento Learner
@ MagentoLearner. Saya tidak tahu pasti tetapi saya punya firasat itu berhasil.
Marius
@Marius, balasan yang sangat cepat !!! terima kasih banyak
Magento Learner
@Marius, Misalkan saya ingin menambahkan satu atribut super. Dengan menambahkan baris dengan product_id dan attribute_id ke tabel catalog_product_super_attributeakan berfungsi? Atau saya perlu memodifikasi tabel lain? Seperti di stackoverflow.com/a/13381381/1749007
Magento Learner
5

Ini memerlukan pengeditan langsung basis data, dan hukum pertama Magento adalah jangan langsung mengedit basis data .

Tetapi jika Anda cukup gila untuk melanjutkan, ini dibahas di StackOverflow beberapa bulan yang lalu:

ucts. Saya telah menguji peretasan solusi DB di bawah ini pada CE 1.6.2 dan tampaknya berfungsi:

  • Buat atribut
  • Seret ke set atribut yang sesuai
  • Buka editor db atau phpmyadmin, tabel 'catalog_eav_attribute' dan lihat yang terakhir, perhatikan 'atribut id', juga perhatikan id produk -> buka catalog_product_entity dan cari produk yang dapat dikonfigurasi yang Anda inginkan, dan perhatikan entitas_id -> ini adalah product_id
  • Buka catalog_product_super_attribute dan masukkan catatan baru dengan product_id dan attribute_id, catatan dari product_super_attribute_id
  • Buka catalog_product_super_attribute_label dan masukkan catatan baru dengan product_super_attribute_id dan nilai atribut baru Anda, seperti 'Warna' atau 'Ukuran' yang Anda gunakan saat menambahkan atribut di admin
  • Kembali ke admin dan klik produk yang dapat dikonfigurasi, Anda akan melihat tidak ada produk anak Anda yang terkait dengan produk yang dapat dikonfigurasi.
  • Klik salah satu produk anak, dan pilih nilai atribut yang sesuai, Anda juga dapat mengubah sku.
  • Ekspor semua produk anak dan tambahkan atribut baru dan nilai sku untuk itu, impor kembali dan Anda selesai atau Anda mungkin harus secara manual mengubah semua di admin tanpa menggunakan aliran data.

Kredit: /programming/5658197/add-new-attribute-to-existing-configurable-product-magento

Belum teruji - YMMV.

Philwinkle
sumber
2

Untuk menghapus satu atribut produk super (seperti yang mereka sebut) dari semua produk yang dapat dikonfigurasi, Anda bisa menjalankan kueri SQL ini di database:

DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;

Di sini, adalah id atribut yang disimpan dalam tabel eav_attribute tentang attribute_code. Tabel catalog_product_super_attribute menautkan produk ke atribut produk super. Anda dapat menambah dan menghapus atribut untuk membuat produk yang dapat dikonfigurasi di sana.

Abhinav Singh
sumber
1
Untuk hanya menghapus atribut produk super dari satu produk tertentu, Anda dapat memperluas kueri SQL di atas untuk memfilter juga pada ID produk DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
Judder
0

Ada hack kotor untuk membuka produk yang dapat dikonfigurasi kemudian memilih duplikat, pilih atribut lama dan baru, duplikat dibuat tanpa SKU, kemudian hapus produk yang dapat dikonfigurasi asli dan produk sederhana. Setelah itu Anda dapat memberikan SKU yang sama untuk digandakan. Maka Anda hanya perlu membuat produk sederhana yang baru.

Ini solusi cepat jika tidak ada banyak produk sederhana.

Dinko
sumber
Bukan jawaban yang tepat
Deepak Rai
0

Saya baru saja berhasil melakukan ini dengan lebih bersih menggunakan alat ekspor impor Magmi Gratis dalam mode pembaruan. (versi pemahaman)

Ekspor bidang-bidang kunci, ubah pengaturan kolom configurable_attributes untuk menentukan atribut yang dapat dikonfigurasi pada SKUS yang sederhana dan dapat dikonfigurasi, kemudian impor ulang menggunakan Magmi

Sebagai mantan Konsultan Oracle, saya setuju untuk tidak mengacaukan dengan database, terutama yang serumit struktur data Magento - lebih baik menggunakan alat yang telah diuji dengan baik untuk melakukan ini.

Dave B
sumber
0

Saya perlu menghapus Atribut agar tidak menjadi salah satu atribut "Dapat Dikonfigurasi" untuk Produk yang Dapat Dikonfigurasi.

  • Referensi di atas tentang catalog_product_super_attribute benar. Menggunakan alat basis data Navicat, saya melakukan beberapa hal secara berurutan.

    Untuk pengujian Mengubah Attribute_Id, yang mengubahnya ke bidang lain yang digunakan dalam produk lain. (Dikonfirmasi bahwa itu adalah rekor yang dipermasalahkan). Menulis Down, untuk berjaga-jaga, set lengkap data rekaman (product_super_attribute_id, product_id, atribut_id, posisi)

    Akhirnya dihapus semua catatan bersama.

Itu berhasil. Saya juga mencatat apa yang saya lakukan dengan asumsi saya perlu melakukan ini lagi.

Lagi: Menghapus Catatan di "catalog_product_super_attribute" memecahkan masalah saya yang sepertinya terkait dengan yang lain di atas.

Info Tambahan: untuk menghubungkan "atribut_id" ke daftar nama yang benar, penting untuk melihat: catalog_super_attribute_label -> dan berkorelasi melalui product_super_attribute_id.
Saya telah mencari bidang "attribute_id" terkait (belum menemukan).

"product_super_attribute_id" melakukan trik untuk memberi tahu Anda apa sebenarnya "attribute_id". (Saya masih ingin mencari set data "default" untuk "attribute_id" untuk melihat bagaimana suatu atribut didefinisikan pertama kali dalam database).

L Arnold
sumber