Đặt lại sử dụng Giá trị mặc định Nhóm để xem cửa hàng cụ thể trên tất cả các sản phẩm


16

Bằng cách nào đó, một số sản phẩm của tôi đã bỏ chọn "Sử dụng giá trị mặc định".

Cửa hàng của tôi có 2 ngôn ngữ, tiếng Anh và tiếng Pháp. Tiếng Pháp sử dụng giá trị Cửa hàng mặc định, vì vậy, bây giờ khi tôi cập nhật sản phẩm, nó không xuất hiện ở mặt trước trừ khi tôi tự đi vào sản phẩm trên giao diện cửa hàng của Pháp và chọn "Sử dụng giá trị mặc định",

Dường như không phải là một thuộc tính cho một hành động hàng loạt, tôi đã bắt gặp một số tập lệnh và truy vấn MySQL tuy nhiên không rõ liệu các giải pháp đó có đặt lại tất cả các chế độ xem cửa hàng để sử dụng giá trị mặc định hay không.

Kết quả mong muốn là đặt "Sử dụng giá trị mặc định" trên chế độ xem cửa hàng cụ thể (tiếng Pháp) trên tất cả các sản phẩm.

Làm cách nào để đặt lại một số lượng lớn sản phẩm (hoặc tất cả các sản phẩm) thành "Sử dụng giá trị mặc định" trên chế độ xem cửa hàng cụ thể?

Câu trả lời:


7

Thật không may, không có cách nào hiệu quả để cập nhật thuộc tính sản phẩm hoạt động trong trường hợp này. $product->getResource()->saveAttribute()cập nhật thuộc tính cho tất cả các chế độ xem cửa hàng ngay cả khi bạn đặt ID cửa hàng trên $productđối tượng. Mage::getSingleton('catalog/product_action')->updateAttributes()chỉ cập nhật giá trị trong một cửa hàng cụ thể, nhưng nó không thể đặt thuộc tính sử dụng giá trị mặc định (xem thêm câu hỏi Stack Overflow này để tham khảo). Do đó, chúng ta phải sử dụng cách chậm, tốn nhiều bộ nhớ thông qua $product->save().

Tôi giả sử rằng bạn biết những thuộc tính nào bạn muốn cập nhật. Ví dụ sau, tôi đặt visibilitythuộc tính để sử dụng giá trị mặc định. Kịch bản sau đây sẽ thực hiện thủ thuật (đảm bảo bạn thay đổi nó theo nhu cầu của bạn):

<?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'));

Có cách nào để đánh dấu "sử dụng giá trị mặc định" mà không thay đổi dữ liệu thuộc tính không? Bởi vì ở đây, nếu tôi sử dụng $product->setData('visibility', false);nó sẽ đánh dấu vào ô, nhưng cũng đặt mức độ hiển thị thành "đúng", điều mà tôi không muốn
Jurģis Toms Liepiņš

1
@ JurģisTomsLiepiņš Nếu bạn đánh dấu vào ô, nó sử dụng giá trị mặc định, là giá trị từ phạm vi cha. Do đó, nếu bạn đánh dấu vào ô và nó chuyển sang "true", giá trị phạm vi cha của bạn cũng là "true". Đối với câu hỏi thêm, xin vui lòng đặt một câu hỏi mới.
Simon

Tôi đã hỏi một câu hỏi mới , tôi hy vọng bạn có thể làm rõ / làm rõ một số điều cho tôi
Jurģis Toms Liepiņš

Tôi sử dụng setData để false thành công (khi được gọi từ cli). Nhưng tôi nhận thấy khi tôi gọi chức năng tương tự từ tuyến điều khiển frontend, nó không hoạt động! Có ai đó đã phải đối mặt với vấn đề này?
DarkCowboy

@DarkCowboy Đây có lẽ là một vấn đề cho phép. Tôi không nghĩ rằng bạn có thể lưu sản phẩm trong bộ điều khiển lối vào. Đối với câu hỏi thêm, xin vui lòng mở một cái mới.
Simon

24

Giả sử id cửa hàng cho cửa hàng tiếng Pháp là 2, bạn nên chạy các truy vấn mysql dưới đây:

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;

Về cơ bản, điều này sẽ xóa các giá trị thuộc tính cho tất cả các thuộc tính và sản phẩm mà id cửa hàng được đặt thành 2. Khi Magento không thể tìm thấy giá trị thuộc tính cho sản phẩm so với id cửa hàng cụ thể, nó chọn giá trị mặc định.


1
Đây không phải là sự thật. Nếu một người đặt giá trị thuộc tính falsenhư tôi đã làm, tùy chọn "sử dụng giá trị mặc định" sẽ được chọn. Mặc dù giải pháp của bạn có thể hoạt động, cá nhân tôi không thích sử dụng các truy vấn SQL trực tiếp.
Simon

Ok xin lỗi, tôi đã đọc sai câu trả lời của bạn và nghĩ rằng bạn đang yêu cầu OP đưa vào tất cả các giá trị mặc định thay vì sai. Giải pháp của bạn hoạt động :)
Paras Sood

5
Xin lưu ý rằng "Điều này không đúng" đề cập đến một nhận xét về câu trả lời của Simon hiện đã bị xóa. Giải pháp hoạt động.
Fabian Schmengler

@fschmengler Paras sẽ trả lời công việc để hiển thị hình ảnh ở mặt trước? Tôi có cùng một vấn đề với cửa hàng mới của tôi tất cả các sản phẩm và hình ảnh đều có nhưng chúng không được chọn để sử dụng làm mặc định.
thismethod

@thismethod không, đây là một cái gì đó khác nhau. Có thể đã có một câu hỏi cho nó rồi, nếu không, vui lòng hỏi một câu hỏi mới
Fabian Schmengler

7

Tham gia hơi muộn, nhưng tôi không thực sự thích một trong hai câu trả lời trên.

  1. Câu trả lời của Simons về việc đi bộ qua bộ sưu tập sản phẩm cực kỳ chậm và không hiệu quả, tuy nhiên ít nhất là sử dụng Magento
  2. Câu trả lời của ParasSood về việc thực hiện sửa đổi trực tiếp trên cơ sở dữ liệu là một chút đáng sợ và không thể sử dụng được nếu bạn muốn gói này như một chút chức năng tự động.

Đây là nỗ lực của tôi, chưa được thử nghiệm đầy đủ nhưng dường như nó làm những gì tôi cần.

/**
 * 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
    );
}

Tại sao chúng ta lại ném lỗi cú pháp trên dòng 14? @Luke Rodgers
Bổ sung

Lỗi gì vậy?
Luke Rodgers

Bây giờ nó đã được sửa nhưng điều này không bao giờ chạy đúng và kết thúc trên dev của tôi. Môi trường. Bất kỳ đề xuất?
Bổ sung

Không thể giúp đỡ mà không có lỗi thực tế :)
Luke Rodgers

bất kỳ hướng dẫn về cách tôi nên sử dụng mã này? Tôi có thể sử dụng nó như một kịch bản độc lập?
Kris Wen

3

Bạn có thể sử dụng core_block_abab_to_html_b Before sự kiện adminhtml để thêm các hộp kiểm cần thiết cho mọi thuộc tính trong biểu mẫu cập nhật hàng loạt quản trị viên.

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());
                }
            }
        }
}

Sau đó, bạn sẽ cần sử dụng danh mục catalog_product_attribution_update_b Before để xóa các giá trị khỏi các bảng EAV cho chế độ xem cửa hàng cụ thể, chỉ đối với những thuộc tính có hộp kiểm bạn đã chèn trước đó với core_block_abab_to_html_b Before được đặt là đã chọn.

Mong rằng sẽ giúp.

Mô-đun này thực hiện chính xác điều đó: http://mageinn.com/product/adminextra/ Cũng có thể đặt lại thuộc tính ' url_key ' với mô-đun đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.