모든 제품의 특정 상점보기에 대해 "기본값 사용"재설정


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);이 상자를 체크 할뿐만 아니라, 내가 원하는 해달라고하는 "true"로 가시성 설정
Jurģis 톰스 Liepiņš

1
@ JurģisTomsLiepiņš 상자를 선택하면 기본 범위 인 부모 범위의 값이 사용됩니다. 따라서 상자를 선택하고 "true"로 전환하면 부모 범위 값도 "true"입니다. 더 궁금한 점이 있으면 새로운 질문을하십시오.
Simon

나는 새로운 묻는 질문에 , 나는 당신이 / 명확히 나를 위해 몇 가지를 취소 할 수 있기를 바랍니다
Jurģis 톰스 Liepiņš

cli에서 호출 할 때 setData를 false로 성공적으로 사용합니다. 그러나 프론트 엔드 컨트롤러 경로에서 동일한 기능을 호출하면 작동하지 않습니다. 누군가 이미이 문제에 직면 했습니까?
DarkCowboy

@DarkCowboy 아마도 권한 문제 일 것입니다. 프론트 엔드 컨트롤러에 제품을 저장할 수 있다고 생각하지 않습니다. 더 궁금한 점이 있으면 새로운 질문을여십시오.
Simon

24

프랑스 상점의 상점 ID가 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로 설정된 모든 속성 및 제품의 속성 값을 삭제합니다. Magento가 특정 상점 ID에 대해 제품의 속성 값을 찾을 수없는 경우 기본값을 선택합니다.


1
사실이 아닙니다. false내가 한 것처럼 속성 값을 설정하면 "기본값 사용"옵션이 선택됩니다. 귀하의 솔루션이 작동하더라도 개인적으로 직접 SQL 쿼리를 사용하는 것을 좋아하지 않습니다.
Simon

죄송합니다. 귀하의 답변을 잘못 읽었으며 OP 대신 모든 기본값을 false 대신 입력하도록 요청하고 있다고 생각했습니다. 귀하의 솔루션 작동 :)
Paras Sood

5
"이것이 사실이 아닙니다"는 현재 삭제 된 Simon의 답변에 대한 주석을 나타냅니다. 솔루션이 작동합니다.
Fabian Schmengler

@fschmengler Paras가 프런트 엔드에 이미지를 표시하는 데 도움이됩니까? 새 상점에 동일한 문제가 있으며 모든 제품과 이미지가 있지만 기본값으로 사용하도록 선택되지 않았습니다.
thismethod

@ thismethod 아니오, 이것은 다른 것입니다. 이미 질문이있을 수도 있습니다. 그렇지 않으면 새로운 질문을하십시오
Fabian Schmengler

7

조금 늦게 가입했지만 위의 답변 중 하나가 마음에 들지 않았습니다.

  1. 제품 콜렉션을 걷는 것에 대한 Simons의 답변은 엄청나게 느리고 비효율적이지만 적어도 마 젠토를 사용하고 있습니다.
  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
Supplement

오류가 무엇입니까?
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 이벤트 를 사용 하여 core_block_abstract_to_html_before로 이전에 주입 한 확인란이 선택된 속성이있는 속성의 경우에만 특정 상점보기에 대한 EAV 테이블에서 값을 삭제해야합니다 .

희망이 도움이됩니다.

이 모듈은 정확히 다음을 수행합니다. http://mageinn.com/product/adminextra/ 해당 모듈로 ' url_key '속성 을 재설정 할 수도 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.