รีเซ็ต“ ใช้ค่าเริ่มต้น” สำหรับมุมมองร้านค้าเฉพาะในผลิตภัณฑ์ทั้งหมด


16

ผลิตภัณฑ์ของฉันจำนวนหนึ่งมีการยกเลิกการเลือก "ใช้ค่าเริ่มต้น"

ร้านค้าของฉันมี 2 ภาษาคืออังกฤษและฝรั่งเศส ภาษาฝรั่งเศสใช้ค่าร้านค้าเริ่มต้นดังนั้นตอนนี้เมื่อฉันอัปเดตผลิตภัณฑ์จะไม่ปรากฏที่ส่วนหน้ายกเว้นว่าฉันไปที่ผลิตภัณฑ์ด้วยตนเองในมุมมองร้านค้าฝรั่งเศสและเลือก "ใช้ค่าเริ่มต้น"

ดูเหมือนจะไม่มีแอตทริบิวต์สำหรับการกระทำจำนวนมากฉันเจอสคริปต์และแบบสอบถาม MySQL แต่ไม่ชัดเจนว่าโซลูชันเหล่านั้นรีเซ็ตมุมมองร้านค้าทั้งหมดเพื่อใช้ค่าเริ่มต้น

ผลลัพธ์ที่ต้องการคือตั้ง "ใช้ค่าเริ่มต้น" ในมุมมองร้านค้าเฉพาะ (ฝรั่งเศส) ในทุกผลิตภัณฑ์

ฉันจะรีเซ็ตผลิตภัณฑ์จำนวนมาก (หรือผลิตภัณฑ์ทั้งหมด) เป็น "ใช้ค่าเริ่มต้น" ในมุมมองร้านค้าที่เฉพาะเจาะจงได้อย่างไร

คำตอบ:


7

น่าเสียดายที่ไม่มีวิธีที่มีประสิทธิภาพในการอัปเดตคุณลักษณะของผลิตภัณฑ์ในกรณีนี้ $product->getResource()->saveAttribute()อัพเดตคุณสมบัติสำหรับมุมมองร้านค้าทั้งหมดแม้ว่าคุณจะตั้งค่า ID ร้านค้าบน$productวัตถุ 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);มันจะทำเครื่องหมายในกล่อง แต่ยังตั้งค่าการแสดงผลเป็น "จริง" ซึ่งฉันไม่ต้องการ
Jurģis Toms Liepiņš

1
@ JurģisTomsLiepiņšถ้าคุณทำเครื่องหมายในช่องมันจะใช้ค่าเริ่มต้นซึ่งเป็นค่าจากขอบเขตผู้ปกครอง ดังนั้นหากคุณทำเครื่องหมายที่ช่องและเปลี่ยนเป็น "จริง" ค่าขอบเขตหลักของคุณคือ "จริง" เช่นกัน สำหรับคำถามเพิ่มเติมโปรดถามคำถามใหม่
Simon

ฉันถามคำถามใหม่ฉันหวังว่าคุณจะสามารถชี้แจง / เคลียร์บางสิ่งได้สำหรับฉัน
Jurģis Toms Liepiņš

ฉันใช้ setData เป็น false สำเร็จ (เมื่อเรียกจาก cli) แต่ฉันสังเกตเห็นเมื่อฉันเรียกใช้ฟังก์ชันเดียวกันจากเส้นทางส่วนควบคุมมันไม่ทำงาน! มีใครประสบปัญหานี้อยู่แล้ว?
DarkCowboy

@DarkCowboy นี่อาจเป็นปัญหาที่ได้รับอนุญาต ฉันไม่คิดว่าคุณสามารถบันทึกผลิตภัณฑ์ในส่วนควบคุมด้านหน้า สำหรับคำถามเพิ่มเติมโปรดเปิดใหม่
Simon

24

สมมติว่ารหัสร้านค้าสำหรับร้านค้าฝรั่งเศสนั้นเป็น 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 เมื่อวีโอไอพีไม่สามารถหาค่าแอททริบิวสำหรับผลิตภัณฑ์เทียบกับรหัสร้านค้าเฉพาะได้


1
นี่ไม่เป็นความจริง. หากมีการตั้งค่าคุณลักษณะfalseเป็นอย่างที่ฉันทำตัวเลือก "ใช้ค่าเริ่มต้น" จะถูกทำเครื่องหมาย แม้ว่าวิธีการแก้ปัญหาของคุณอาจทำงานได้ แต่ฉันไม่ชอบใช้แบบสอบถาม SQL โดยตรง
Simon

โอเคฉันเข้าใจผิดคำตอบของคุณและคิดว่าคุณกำลังขอให้ OP ใส่ค่าเริ่มต้นทั้งหมดแทนที่จะเป็นเท็จ วิธีการแก้ปัญหาของคุณใช้งานได้ :)
Paras Sood

5
โปรดทราบว่า "สิ่งนี้ไม่เป็นความจริง" หมายถึงความคิดเห็นเกี่ยวกับคำตอบของ Simon ที่ถูกลบไปแล้ว วิธีแก้ปัญหาใช้งานได้
Fabian Schmengler

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

@ วิธีไม่ไม่นี่คือสิ่งที่แตกต่าง อาจมีคำถามอยู่แล้วมิฉะนั้นโปรดถามคำถามใหม่
Fabian Schmengler

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 @Luke Rodgers
เสริม

ข้อผิดพลาดคืออะไร
ลุคร็อดเจอร์ส

ตอนนี้ได้รับการแก้ไขแล้ว แต่นี่ไม่เคยทำงานได้อย่างถูกต้องและเสร็จสิ้นการพัฒนาของฉัน สิ่งแวดล้อม ข้อเสนอแนะใด ๆ
ภาคผนวก

ไม่สามารถช่วยได้โดยไม่ต้องมีข้อผิดพลาดที่เกิดขึ้นจริง :)
ลุคร็อดเจอร์ส

คำแนะนำเกี่ยวกับวิธีใช้รหัสนี้ ฉันสามารถใช้มันเป็นสคริปต์แบบสแตนด์อโลนได้หรือไม่
Kris Wen

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.