Zresetuj „Użyj wartości domyślnej” dla widoku konkretnego sklepu na wszystkich produktach

16

W jakiś sposób w niektórych moich produktach usunięto zaznaczenie opcji „Użyj wartości domyślnej”.

Mój sklep ma 2 języki, angielski i francuski. Francuski używa wartości Domyślnego sklepu, więc teraz, gdy aktualizuję produkty, nie pojawia się on w interfejsie użytkownika, chyba że ręcznie przejdę do produktu w widoku francuskiego sklepu i wybiorę „Użyj wartości domyślnej”,

Wydaje się, że nie ma atrybutu dla akcji masowej, natknąłem się na niektóre skrypty i zapytania MySQL, jednak nie jest jasne, czy te rozwiązania resetują wszystkie widoki sklepu, aby użyć wartości domyślnej.

Pożądanym rezultatem jest ustawienie „Użyj wartości domyślnej” w widoku określonego sklepu (francuski) dla wszystkich produktów.

Jak zresetować dużą liczbę produktów (lub wszystkich produktów) do „Użyj wartości domyślnej” w widoku określonego sklepu?

SR_Magento
źródło

Odpowiedzi:

7

Niestety w tym przypadku nie działa żaden skuteczny sposób aktualizacji atrybutu produktu. $product->getResource()->saveAttribute()aktualizuje atrybut dla wszystkich widoków sklepu, nawet jeśli ustawisz identyfikator sklepu na $productobiekcie. Mage::getSingleton('catalog/product_action')->updateAttributes()aktualizuje tylko wartość w określonym sklepie, ale nie może ustawić atrybutu, aby używał wartości domyślnej (zobacz również to pytanie dotyczące przepełnienia stosu ). Dlatego musimy korzystać z wolnego, intensywnie korzystającego z pamięci sposobu $product->save().

Zakładam, że wiesz, które atrybuty chcesz zaktualizować. W poniższym przykładzie ustawiłem visibilityatrybut, aby używał wartości domyślnej. Poniższy skrypt powinien załatwić sprawę (upewnij się, że zmieniłeś go zgodnie z własnymi potrzebami):

<?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'));
Szymon
źródło
Czy istnieje sposób zaznaczenia „użyj wartości domyślnej” bez zmiany danych atrybutów? Ponieważ tutaj, jeśli $product->setData('visibility', false);go użyję, zaznaczy to pole, ale także ustawię widoczność na „true”, czego nie chcę
Jurģis Toms Liepiņš
1
@ JurģisTomsLiepiņš Jeśli zaznaczysz to pole, zostanie użyta wartość domyślna, czyli wartość z zakresu nadrzędnego. Dlatego jeśli zaznaczysz pole i zmieni się ono na „prawda”, twoja wartość zakresu nadrzędnego również będzie „prawdziwa”. W przypadku dalszych pytań zadaj nowe pytanie.
Simon
Zadałem nowe pytanie , mam nadzieję, że możesz wyjaśnić mi pewne rzeczy
Jurģis Toms Liepiņš
Korzystam z setData do false pomyślnie (po wywołaniu z cli). Ale zauważyłem, że kiedy wywołuję tę samą funkcję z trasy kontrolera frontonu, to nie działa! Czy ktoś już napotkał ten problem?
DarkCowboy,
@DarkCowboy To prawdopodobnie problem z uprawnieniami. Nie sądzę, że można zapisać produkt w kontrolerze frontendowym. W przypadku dalszych pytań otwórz nowe.
Simon
24

Zakładając, że identyfikator sklepu dla francuskiego sklepu to 2, powinieneś uruchomić poniższe zapytania 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;

To w zasadzie usuwa wartości atrybutów dla wszystkich atrybutów i produktów, dla których identyfikator sklepu jest ustawiony na 2. Gdy Magento nie może znaleźć wartości atrybutu produktu na podstawie konkretnego identyfikatora sklepu, wybiera wartość domyślną.

Paras Sood
źródło
1
To nie jest prawda. Jeśli ustawimy wartość atrybutu falsetak jak ja, zaznaczona zostanie opcja „użyj wartości domyślnej”. Chociaż twoje rozwiązanie może działać, osobiście nie lubię korzystać z bezpośrednich zapytań SQL.
Simon
Ok przepraszam, źle odczytałem twoją odpowiedź i pomyślałem, że prosiłeś OP o podanie wszystkich wartości domyślnych zamiast fałszywego. Twoje rozwiązanie działa :)
Paras Sood
5
Pamiętaj, że „To nieprawda” odnosi się do komentarza do odpowiedzi Simona, który został już usunięty. Rozwiązanie działa.
Fabian Schmengler,
@fschmengler Czy Paras odpowiedziałby na pytanie dotyczące wyświetlania obrazów na interfejsie? Mam ten sam problem z moim nowym sklepem, wszystkie produkty i zdjęcia są tam, ale nie są one wybrane jako domyślne.
thismethod
@thismethod nie, to coś innego. Może być już pytanie, w przeciwnym razie zadaj nowe
Fabian Schmengler,
7

Przyłączam się trochę później, ale tak naprawdę nie podobała mi się żadna z powyższych odpowiedzi.

  1. Odpowiedź Simonsa na przechodzenie przez kolekcję produktów jest niesamowicie powolna i nieefektywna, jednak przynajmniej używa Magento
  2. Odpowiedź ParasSood polegająca na wprowadzaniu bezpośrednich modyfikacji w bazie danych jest trochę przerażająca i niezbyt użyteczna, jeśli chcesz, aby ta funkcja była zautomatyzowana.

Oto moja próba, nie w pełni przetestowana, ale wydaje się, że robi to, czego potrzebuję.

/**
 * 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
    );
}
Luke Rodgers
źródło
Dlaczego zgłaszamy błąd składniowy w linii 14? @Luke Rodgers
Suplement
Jaki jest błąd?
Luke Rodgers,
Zostało to naprawione teraz, ale to nigdy nie działa poprawnie i nie kończy się na moim deweloperze. środowisko. Jakieś sugestie?
Suplement
Nie mogę pomóc bez rzeczywistego błędu :)
Luke Rodgers
jakiś przewodnik na temat tego, jak korzystać z tego kodu? czy mogę go używać jako samodzielnego skryptu?
Kris Wen
3

Możesz użyć core_block_abstract_to_html_przed zdarzeniem adminhtml, aby dodać wymagane pola wyboru dla każdego atrybutu w formularzu masowej aktualizacji administratora.

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

Następnie należy użyć zdarzenia catalog_product_attribute_update_before przed usunięciem wartości z tabel EAV dla określonego widoku sklepu, tylko dla tych atrybutów, których pole wyboru wstrzyknięto wcześniej za pomocą core_block_abstract_to_html_before ustawionego jako zaznaczone.

Mam nadzieję, że to pomaga.

Ten moduł robi dokładnie to: http://mageinn.com/product/adminextra/ Możliwe jest również zresetowanie atrybutuurl_key ” za pomocą tego modułu.

kolucciy
źródło