Magento - เพิ่ม / ลบคุณสมบัติไปยังผลิตภัณฑ์ที่สามารถกำหนดค่าได้


18

ขั้นตอนที่ถูกต้องคืออะไร - แทนที่จะลบผลิตภัณฑ์และเริ่มต้นอีกครั้งเพื่อเพิ่มหรือลบแอตทริบิวต์ไปยังผลิตภัณฑ์ที่กำหนดค่าได้

เมื่อสร้างผลิตภัณฑ์ที่กำหนดค่าได้ระบบจะขอให้คุณเลือกคุณลักษณะที่จะใช้กับผลิตภัณฑ์

ฉันมีผลิตภัณฑ์จำนวนมากที่ฉันต้องลบคุณลักษณะบางอย่างสำหรับสิ่งที่เลือกไว้ในตอนแรกและบางอย่างที่ต้องการการเพิ่มคุณสมบัติที่ไม่ได้ถูกเลือกเริ่มแรกด้วย

ความช่วยเหลือใด ๆ เกี่ยวกับสิ่งนี้ได้รับการชื่นชมเนื่องจากการลบผลิตภัณฑ์ดูเหมือนจะไม่เป็นวิธีที่ดีที่สุด โดยเฉพาะอย่างยิ่งสิ่งอื่น ๆ ที่เกี่ยวข้องกับผลิตภัณฑ์


คำตอบที่ถูกต้องที่นี่คือ: ลบผลิตภัณฑ์และสร้างใหม่ แต่มีวิธีแก้ปัญหานี้ (และฉันคิดว่าโมดูล) แต่ฉันคิดว่าคุณสามารถ google ด้วยตัวคุณเองฉันไม่มีทางออกสำหรับสิ่งนี้ในใจ
Fabian Blechschmidt

คุณพบทางออกสำหรับสิ่งนี้หรือไม่? คำตอบด้านล่างนี้เป็นทางออกหรือไม่? กรุณาให้การปรับปรุง
philwinkle

ฉันยังไม่ได้ลองเลย แต่ฉันจะทำการทดสอบในไม่ช้า ขอบคุณมากสำหรับการตอบ - ฉันจะทำเครื่องหมายว่าได้รับคำตอบถ้ามันใช้ได้
eleven11

เช่นเดียวกับฉันมีคุณลักษณะสีและมันถูกเชื่อมโยงกับผลิตภัณฑ์ที่กำหนดค่าได้ทั้งหมดในกรณีที่แอตทริบิวต์นั้นถูกลบ เพื่อที่จะไม่พบว่ามีการเชื่อมโยงแอตทริบิวต์ & แสดงข้อผิดพลาดเป็น "ประกาศ: ชดเชยไม่ได้กำหนด: 0 ใน /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php บนบรรทัด 43" ต้องการความช่วยเหลือในการจัดการสถานการณ์นี้ขอบคุณล่วงหน้า
Bhagyashree

คำตอบ:


14

นี่คือสิ่งที่ตะเข็บใช้งานได้สำหรับฉันในการลบแอตทริบิวต์ออกจากผลิตภัณฑ์ที่กำหนดค่าได้
นี่คือสถานการณ์
ผลิตภัณฑ์ที่กำหนดค่าได้ทั้งหมดนั้นสร้างขึ้นอย่างผิด ๆ โดยมีแอตทริบิวต์brandเป็นคุณลักษณะที่กำหนดค่าได้สำหรับผลิตภัณฑ์ที่กำหนดค่าได้ประมาณ 50 รายการซึ่งมีผลิตภัณฑ์ที่เกี่ยวข้องประมาณ 200 รายการ
ผลิตภัณฑ์ง่าย ๆ ทั้งหมดที่เกี่ยวข้องกับแอตทริบิวต์ที่กำหนดค่าได้มียี่ห้อเดียวกัน แนวคิดคือการลบออกbrandจากคุณสมบัติที่กำหนดค่าได้และกำหนดให้เป็นคุณสมบัติอย่างง่ายไปยังผลิตภัณฑ์ที่กำหนดค่าได้ด้วยมูลค่าของหนึ่งในผลิตภัณฑ์ที่เรียบง่าย
นี่คือรหัสที่ทำ รหัสทำงานเพียงครั้งเดียวเท่านั้น มันสามารถเพิ่มในสคริปต์อัพเกรดหรือไฟล์ php ง่าย

<?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;
            }
        }
    }
}

สำหรับหมายเลขที่แสดงไว้ด้านบนการดำเนินการนี้ใช้เวลาประมาณ 15 วินาทีในการเรียกใช้บนเครื่องของฉัน (ไม่ใช่เครื่องที่ทรงพลัง) ฉันแน่ใจว่าสามารถเพิ่มประสิทธิภาพได้ ส่วนใหญ่อาจไม่จำเป็นต้องได้รับผลิตภัณฑ์ที่เรียบง่ายของผลิตภัณฑ์ที่กำหนดค่าได้เพื่อรับbrandค่า แต่ฉันไม่ได้รำคาญ


2
ฉันเกลียดที่จะต้องทำแบบนี้และไม่มีวิธีการเพื่อให้ได้สิ่งเดียวกัน แต่ต้องขอบคุณข้อมูล
webnoob

@Marius จะใช้งานได้กับ 1.9 หรือไม่
Magento Learner

@MagentoLearner ฉันไม่รู้แน่ แต่ฉันมีลางสังหรณ์มันใช้งานได้
Marius

@Marius ตอบกลับอย่างรวดเร็วมาก !!! ขอบคุณมาก
วีโอไอพีเรียน

@Marius สมมติว่าฉันต้องการเพิ่มหนึ่งคุณลักษณะสุด เมื่อเพิ่มแถวด้วย product_id และ attribute_id ในตารางcatalog_product_super_attributeจะทำงานอย่างไร หรืออื่นฉันต้องแก้ไขตารางอื่น ๆ ? กดไลค์
Magento Learner

5

ต้องมีการแก้ไขฐานข้อมูลโดยตรงและกฎข้อที่หนึ่งของ Magento คือไม่แก้ไขฐานข้อมูลโดยตรง

แต่ถ้าคุณบ้าพอที่จะดำเนินการต่อไปสิ่งนี้จะได้รับการกล่าวถึงใน StackOverflow เมื่อไม่กี่เดือนที่ผ่านมา:

ucts ฉันได้ทดสอบการแก้ปัญหาการแฮ็คฐานข้อมูลด้านล่างใน CE 1.6.2 และดูเหมือนว่าจะใช้งานได้:

  • สร้างคุณลักษณะ
  • ลากไปยังชุดแอตทริบิวต์ที่เหมาะสม
  • ไปที่ db editor หรือ phpmyadmin, table 'catalog_eav_attribute' และดูอันสุดท้าย, จดบันทึก 'attribute id', ยังจดบันทึกรหัสผลิตภัณฑ์ -> ไปที่ catalog_product_entity และค้นหาผลิตภัณฑ์ที่สามารถกำหนดค่าได้ที่คุณต้องการและหมายเหตุเอนทิตี _ -> สิ่งนี้ คือ product_id
  • ไปที่ catalog_product_super_attribute และแทรกบันทึกใหม่ด้วย product_id และ attribute_id, บันทึกย่อของ product_super_attribute_id
  • ไปที่ catalog_product_super_attribute_label และแทรกบันทึกใหม่ด้วย product_super_attribute_id และมูลค่าของคุณสมบัติใหม่ของคุณเช่น 'สี' หรือ 'ขนาด' ที่คุณใช้เมื่อเพิ่มแอตทริบิวต์ในผู้ดูแลระบบ
  • กลับไปที่ผู้ดูแลระบบและคลิกผลิตภัณฑ์ที่กำหนดค่าได้คุณจะสังเกตเห็นว่าไม่มีผลิตภัณฑ์ใด ๆ ที่เกี่ยวข้องกับผลิตภัณฑ์ที่กำหนดค่าได้ของคุณ
  • คลิกที่หนึ่งในผลิตภัณฑ์เด็กและเลือกค่าคุณสมบัติที่เหมาะสมคุณยังสามารถเปลี่ยน sku
  • ส่งออกผลิตภัณฑ์ย่อยทั้งหมดและเพิ่มคุณสมบัติใหม่และค่า sku ไปยังสินค้านำเข้ากลับและคุณเสร็จสิ้นหรือคุณอาจต้องเปลี่ยนทั้งหมดด้วยตนเองในผู้ดูแลระบบโดยไม่ต้องใช้ DataFlow

เครดิต: /programming/5658197/add-new-attribute-to-existing-configurable-product-magento

ยังไม่ได้ทดสอบ - YMMV


2

ในการลบหนึ่งคุณลักษณะผลิตภัณฑ์ super (ตามที่พวกเขาเรียกว่า) จากผลิตภัณฑ์ที่กำหนดค่าได้ทั้งหมดคุณสามารถดำเนินการแบบสอบถาม SQL นี้ในฐานข้อมูล:

DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;

นี่คือรหัสของคุณลักษณะที่เก็บไว้ในตาราง eav_attribute เกี่ยวกับ attribute_code ตาราง catalog_product_super_attribute เชื่อมโยงผลิตภัณฑ์กับแอตทริบิวต์ผลิตภัณฑ์ขั้นสูงสุด คุณสามารถเพิ่มและลบคุณลักษณะเพื่อสร้างผลิตภัณฑ์ที่กำหนดค่าได้


1
ในการลบเฉพาะคุณสมบัติสุดยอดผลิตภัณฑ์ออกจากผลิตภัณฑ์เดียวคุณสามารถขยายข้อความค้นหา SQL ด้านบนเพื่อกรองด้วยรหัสผลิตภัณฑ์ DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
Judder

0

มีแฮ็คสกปรกในการเปิดผลิตภัณฑ์ที่กำหนดค่าได้แล้วเลือกซ้ำเลือกแอตทริบิวต์เก่าและใหม่ทำซ้ำโดยไม่มี SKU จากนั้นลบผลิตภัณฑ์ที่กำหนดค่าได้ดั้งเดิมและผลิตภัณฑ์ง่าย ๆ หลังจากนั้นคุณสามารถให้ SKU เดียวกันซ้ำกัน จากนั้นคุณเพียงแค่ต้องสร้างผลิตภัณฑ์ที่เรียบง่ายใหม่

เป็นวิธีแก้ปัญหาที่รวดเร็วหากไม่มีผลิตภัณฑ์ที่เรียบง่ายมากมาย


ไม่ใช่คำตอบที่เหมาะสม
Deepak Rai

0

ฉันเพิ่งจะทำสิ่งนี้ได้อย่างหมดจดมากขึ้นโดยใช้เครื่องมือส่งออกนำเข้า Magmi ฟรีในโหมดอัปเดต (เวอร์ชันที่เข้าใจ)

เอ็กซ์พอร์ตฟิลด์คีย์เปลี่ยนการตั้งค่าคอลัมน์ configurable_attributes เพื่อระบุแอททริบิวต์ที่กำหนดค่าได้บน SKUS ที่กำหนดค่าได้ง่ายจากนั้นนำเข้าอีกครั้งโดยใช้ Magmi

ในฐานะที่ปรึกษาของ Oracle ก่อนหน้านี้ฉันตกลงว่าจะไม่ยุ่งกับฐานข้อมูลโดยเฉพาะอย่างยิ่งโครงสร้างที่ซับซ้อนของโครงสร้างข้อมูล Magento ควรใช้เครื่องมือที่ผ่านการทดสอบมาอย่างดีกว่า


0

ฉันต้องการลบแอททริบิวออกจากการเป็นหนึ่งในแอตทริบิวต์ "ที่กำหนดค่าได้" สำหรับผลิตภัณฑ์ที่กำหนดค่าได้

  • การอ้างอิงข้างต้นเกี่ยวกับ catalog_product_super_attribute ถูกต้อง การใช้เครื่องมือฐานข้อมูล Navicat ฉันทำตามลำดับเล็กน้อย

    สำหรับการทดสอบเปลี่ยนเป็น Attribute_Id ซึ่งเปลี่ยนเป็นฟิลด์อื่นที่ใช้ในผลิตภัณฑ์อื่น (ยืนยันว่าเป็นบันทึกที่มีปัญหา) เขียนลงในกรณีที่ชุดข้อมูลบันทึกเต็ม (product_super_attribute_id, product_id, attribute_id, ตำแหน่ง)

    ในที่สุดก็ลบบันทึกทั้งหมดเข้าด้วยกัน

นั่นเป็นการหลอกลวง ฉันยังได้รับทราบถึงสิ่งที่ฉันได้สมมติว่าฉันจะต้องทำเช่นนี้อีกครั้ง

อีกครั้ง: การลบบันทึกใน "catalog_product_super_attribute" แก้ไขปัญหาของฉันซึ่งดูเหมือนว่าเกี่ยวข้องกับผู้อื่นข้างต้น

ข้อมูลเสริม: เพื่อเชื่อมโยง "attribute_id" กับรายการที่ถูกต้องเป็นสิ่งสำคัญที่ต้องดู: catalog_super_attribute_label -> และเชื่อมโยงผ่าน product_super_attribute_id
ฉันค้นหาช่อง "attribute_id" ที่เกี่ยวข้อง (ยังหาไม่พบ)

"product_super_attribute_id" ทำเคล็ดลับในการบอกคุณว่า "attribute_id" คืออะไร (ฉันต้องการหาชุดข้อมูล "เริ่มต้น" สำหรับ "attribute_id" เพื่อดูว่ามีการกำหนดแอตทริบิวต์ในฐานข้อมูลเป็นครั้งแรก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.