Ripristina "Usa valore predefinito" per la visualizzazione negozio specifica su tutti i prodotti


16

In qualche modo alcuni dei miei prodotti avevano il "Usa valore predefinito" deselezionato.

Il mio negozio ha 2 lingue, inglese e francese. Il francese utilizza il valore del negozio predefinito, quindi ora quando aggiorno i prodotti non viene visualizzato sul front-end a meno che non vada manualmente sul prodotto nella vista del negozio francese e selezioni "Usa valore predefinito",

Non sembra esserci un attributo per un'azione di massa, mi sono imbattuto in alcuni script e query MySQL, tuttavia non è chiaro se tali soluzioni ripristinino tutte le visualizzazioni dello store per utilizzare il valore predefinito.

Il risultato desiderato è impostare "Usa valore predefinito" su una vista negozio specifica (francese) su tutti i prodotti.

Come reimpostare un gran numero di prodotti (o tutti i prodotti) su "Usa valore predefinito" in una vista negozio specifica?

Risposte:


7

Sfortunatamente, nessuno dei modi efficaci per aggiornare un attributo del prodotto funziona in questo caso. $product->getResource()->saveAttribute()aggiorna l'attributo per tutte le visualizzazioni del negozio anche se si imposta l'ID negozio $productsull'oggetto. Mage::getSingleton('catalog/product_action')->updateAttributes()aggiorna solo il valore in un negozio specifico, ma non può impostare l'attributo in modo che utilizzi il valore predefinito (vedere anche questa domanda di overflow dello stack per un riferimento). Quindi, dobbiamo usare il modo lento e intensivo di memoria tramite $product->save().

Presumo che tu sappia quali attributi desideri aggiornare. Per il seguente esempio, ho impostato l' visibilityattributo per utilizzare il valore predefinito. Il seguente script dovrebbe quindi fare il trucco (assicurati di cambiarlo in base alle tue esigenze):

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

Esiste un modo per selezionare "usa valore predefinito" senza modificare i dati dell'attributo? Perché qui, se lo uso $product->setData('visibility', false);, spunta la casella, ma imposta anche la visibilità su "true", che non desidero
Jurģis Toms Liepiņš

1
@ JurģisTomsLiepiņš Se si seleziona la casella, utilizza il valore predefinito, ovvero il valore dall'ambito padre. Pertanto, se si seleziona la casella e si passa a "true", anche il valore dell'ambito padre è "true". Per ulteriori domande, si prega di porre una nuova domanda.
Simone,

Ho fatto una nuova domanda , spero che tu possa chiarire / chiarire alcune cose per me
Jurģis Toms Liepiņš

Uso setData su false con successo (quando chiamato da cli). Ma ho notato che quando chiamo la stessa funzione da una route del controller frontend, non funziona! Qualcuno ha già affrontato questo problema?
DarkCowboy,

@DarkCowboy Questo è probabilmente un problema di autorizzazione. Non penso che tu possa salvare un prodotto in un controller frontend. Per ulteriori domande, si prega di aprirne uno nuovo.
Simon,

24

Supponendo che l'ID negozio per il negozio francese sia 2, è necessario eseguire le query mysql seguenti:

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;

Questo in pratica elimina i valori degli attributi per tutti gli attributi e prodotti per i quali l'ID negozio è impostato su 2. Quando Magento non riesce a trovare il valore dell'attributo per un prodotto rispetto al particolare ID negozio, seleziona il valore predefinito.


1
Questo non è vero. Se si imposta il valore dell'attributo su falsecome ho fatto, l'opzione "usa valore predefinito" sarà spuntata. Sebbene la tua soluzione possa funzionare, personalmente non mi piace utilizzare le query SQL dirette.
Simon,

Ok, mi scuso, ho letto male la tua risposta e ho pensato che stavi chiedendo a OP di inserire tutti i valori predefiniti anziché false. La tua soluzione funziona :)
Paras Sood,

5
Si noti che "Questo non è vero" si riferisce a un commento sulla risposta di Simon che è stato rimosso. La soluzione funziona.
Fabian Schmengler,

@fschmengler Paras avrebbe risposto al lavoro per mostrare le immagini sul front-end? Ho lo stesso problema con il mio nuovo negozio tutti i prodotti e le immagini ci sono ma non sono selezionati per l'uso come predefinito.
metodo

@thismethod no, questa è una cosa diversa. Potrebbe esserci già una domanda, altrimenti
chiedine

7

Partecipare un po 'in ritardo, ma non mi è piaciuta molto nessuna delle risposte sopra.

  1. La risposta di Simons al superamento della collezione di prodotti è follemente lenta e inefficiente, tuttavia utilizza almeno Magento
  2. La risposta di ParasSood di apportare modifiche dirette al database è un po 'spaventosa, e non molto utilizzabile se si desidera che sia racchiusa in un po' di funzionalità automatizzata.

Ecco il mio tentativo, non completamente testato ma sembra fare quello di cui ho bisogno.

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

Perché stiamo generando un errore di sintassi sulla linea 14? @Luke Rodgers
Supplemento

Qual è l'errore?
Luke Rodgers,

Ora è stato risolto ma questo non funziona e termina correttamente sul mio sviluppatore. ambiente. Eventuali suggerimenti?
Supplemento

Non posso fare a meno dell'errore reale :)
Luke Rodgers,

qualche guida su come dovrei usare questo codice? posso usarlo come script autonomo?
Kris Wen l'

3

È possibile utilizzare core_block_abstract_to_html_before adminhtml event per aggiungere le caselle di controllo richieste per ogni attributo nel modulo di aggiornamento di massa dell'amministratore.

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

Quindi è necessario utilizzare l' evento catalog_product_attribute_update_before per eliminare i valori dalle tabelle EAV per una vista negozio specifica, solo per quegli attributi che hanno la casella di spunta che hai iniettato in precedenza con core_block_abstract_to_html_before impostato come selezionato.

Spero possa aiutare.

Questo modulo fa esattamente questo: http://mageinn.com/product/adminextra/ È anche possibile ripristinare l' attributo ' url_key ' con quel modulo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.