"Use Default Value" (Standardwert verwenden) für bestimmte Store-Ansichten aller Produkte zurücksetzen

16

Irgendwie wurde bei einigen meiner Produkte die Option "Standardwert verwenden" deaktiviert.

Mein Shop hat 2 Sprachen, Englisch und Französisch. Französisch verwendet den Standardspeicherwert. Wenn ich also Produkte aktualisiere, wird dieser nicht im Front-End angezeigt, es sei denn, ich gehe manuell auf das Produkt in der französischen Speicheransicht und wähle "Standardwert verwenden".

Es scheint kein Attribut für eine Massenaktion zu geben, ich habe einige Skripte und MySQL-Abfragen gesehen, aber es ist nicht klar, ob diese Lösungen alle Geschäftsansichten auf den Standardwert zurücksetzen.

Das gewünschte Ergebnis ist, "Use Default Value" (Standardwert verwenden) in einer bestimmten Store-Ansicht (Französisch) für alle Produkte festzulegen.

Wie setze ich eine große Anzahl von Produkten (oder alle Produkte) in einer bestimmten Geschäftsansicht auf "Standardwert verwenden" zurück?

SR_Magento
quelle

Antworten:

7

Leider funktioniert in diesem Fall keine der effizienten Methoden zum Aktualisieren eines Produktattributs. $product->getResource()->saveAttribute()Aktualisiert das Attribut für alle Geschäftsansichten, auch wenn Sie die Geschäfts-ID für das $productObjekt festlegen . Mage::getSingleton('catalog/product_action')->updateAttributes()Aktualisiert nur den Wert in einem bestimmten Speicher, kann jedoch nicht das Attribut so festlegen, dass der Standardwert verwendet wird (siehe auch diese Frage zum Stapelüberlauf als Referenz). Daher müssen wir den langsamen, speicherintensiven Weg über verwenden $product->save().

Ich gehe davon aus, dass Sie wissen, welche Attribute Sie aktualisieren möchten. Für das folgende Beispiel habe ich das visibilityAttribut so eingestellt, dass es den Standardwert verwendet. Das folgende Skript sollte dann den Trick ausführen (stellen Sie sicher, dass Sie es entsprechend Ihren Anforderungen ändern):

<?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'));
Simon
quelle
Gibt es eine Möglichkeit, das Häkchen bei "Standardwert verwenden" zu setzen, ohne die Attributdaten zu ändern? Denn hier, wenn ich es benutze $product->setData('visibility', false);, wird das Kästchen angekreuzt, aber auch die Sichtbarkeit auf "wahr" gesetzt, was ich nicht will
Jur wantis Toms Liepiņš
1
@ JurģisTomsLiepiņš Wenn Sie das Kontrollkästchen aktivieren, wird der Standardwert verwendet, der dem Wert aus dem übergeordneten Bereich entspricht. Wenn Sie das Kontrollkästchen aktivieren und auf "true" wechseln, ist der übergeordnete Bereichswert ebenfalls "true". Für weitere Fragen stellen Sie bitte eine neue Frage.
Simon
Ich habe eine neue Frage gestellt , ich hoffe, Sie können einige Dinge für mich klären / klären
Jurģis Toms Liepiņš
Ich benutze die setData um false erfolgreich zu machen (wenn von cli aufgerufen). Aber ich habe festgestellt, dass es nicht funktioniert, wenn ich dieselbe Funktion von einer Frontend-Controller-Route aus aufrufe! Ist jemand schon mit diesem Problem konfrontiert?
DarkCowboy
@DarkCowboy Dies ist wahrscheinlich ein Berechtigungsproblem. Ich glaube nicht, dass man ein Produkt in einem Frontend-Controller speichern kann. Für weitere Fragen öffnen Sie bitte eine neue.
Simon
24

Angenommen, die Geschäfts-ID für das französische Geschäft ist 2, sollten Sie die folgenden mysql-Abfragen ausführen:

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;

Dies löscht im Wesentlichen die Attributwerte für alle Attribute und Produkte, für die die Geschäfts-ID auf 2 festgelegt ist. Wenn Magento den Attributwert für ein Produkt nicht anhand der jeweiligen Geschäfts-ID finden kann, wird der Standardwert ausgewählt.

Paras Sood
quelle
1
Das ist nicht wahr. Wenn man den Attributwert so einstellt falsewie ich, wird die Option "Standardwert verwenden" angekreuzt. Obwohl Ihre Lösung möglicherweise funktioniert, verwende ich persönlich keine direkten SQL-Abfragen.
Simon
Entschuldigung, ich habe Ihre Antwort falsch verstanden und dachte, Sie würden OP bitten, alle Standardwerte anstelle von false einzugeben. Ihre Lösung funktioniert :)
Paras Sood
5
Bitte beachten Sie, dass "Dies ist nicht wahr" sich auf einen Kommentar zu Simons Antwort bezieht, der jetzt entfernt wurde. Die Lösung funktioniert.
Fabian Schmengler
@fschmengler Würde Paras für die Anzeige der Bilder am Frontend antworten? Ich habe das gleiche Problem mit meinem neuen Geschäft. Alle Produkte und Bilder sind dort, aber sie sind nicht für die Verwendung als Standard ausgewählt.
thismethod
@thismethod nein, das ist etwas anderes. Möglicherweise gibt es bereits eine Frage, andernfalls fragen Sie bitte einen neuen
Fabian Schmengler
7

Ich bin ein bisschen spät gekommen, aber die obigen Antworten haben mir nicht wirklich gefallen.

  1. Simons Antwort, die Produktkollektion zu durchlaufen, ist wahnsinnig langsam und ineffizient, nutzt jedoch zumindest Magento
  2. Die Antwort von ParasSood, direkte Änderungen an der Datenbank vorzunehmen, ist ein wenig beängstigend und nicht sehr nützlich, wenn Sie dies als automatisierte Funktionalität verpacken möchten.

Hier ist mein Versuch, nicht vollständig getestet, aber es scheint das zu tun, wofür ich es brauche.

/**
 * 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
quelle
Warum werfen wir einen Syntaxfehler in Zeile 14? @ Luke Rodgers
Nachtrag
Was ist der Fehler?
Luke Rodgers
Es ist jetzt behoben, aber das läuft nie richtig und endet auf meinem Entwickler. Umgebung. Irgendwelche Vorschläge?
Nachtrag
Kann nicht ohne den tatsächlichen Fehler helfen :)
Luke Rodgers
eine Anleitung, wie ich diesen Code verwenden soll? Kann ich es als eigenständiges Skript verwenden?
Kris Wen
3

Sie können das Ereignis core_block_abstract_to_html_before adminhtml verwenden, um die erforderlichen Kontrollkästchen für jedes Attribut im Formular für die Massenaktualisierung von Administratoren hinzuzufügen.

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

Dann müssten Sie catalog_product_attribute_update_before verwenden , um die Werte aus den EAV-Tabellen für eine bestimmte Geschäftsansicht zu löschen. Dies gilt nur für die Attribute, für die das zuvor mit core_block_abstract_to_html_before festgelegte Kontrollkästchen aktiviert ist .

Ich hoffe, das hilft.

Dieses Modul macht genau das: http://mageinn.com/product/adminextra/ Mit diesem Modul ist es auch möglich, das Attribut ' url_key ' zurückzusetzen.

kolucciy
quelle