सभी उत्पादों पर विशिष्ट स्टोर दृश्य के लिए "डिफ़ॉल्ट मान का उपयोग करें" रीसेट करें


16

किसी तरह मेरे कई उत्पादों में "डिफॉल्ट डिफॉल्ट वैल्यू" का उपयोग किया गया था।

मेरे स्टोर में 2 भाषाएँ हैं, अंग्रेजी और फ्रेंच। फ़्रेंच डिफ़ॉल्ट स्टोर मान का उपयोग करता है, इसलिए अब जब मैं उत्पादों को अपडेट करता हूं तो यह सामने के छोर पर दिखाई नहीं देता है जब तक कि मैं मैन्युअल रूप से फ्रांसीसी स्टोर दृश्य पर उत्पाद पर नहीं जाता हूं और "डिफ़ॉल्ट मान का उपयोग करें" का चयन करें;

एक सामूहिक कार्रवाई के लिए एक विशेषता प्रतीत नहीं होती है, मैं कुछ लिपियों और MySQL प्रश्नों के बीच आया हूं, हालांकि यह स्पष्ट नहीं है कि क्या वे समाधान डिफ़ॉल्ट मूल्य का उपयोग करने के लिए सभी स्टोर दृश्यों को रीसेट करते हैं।

वांछित परिणाम सभी उत्पादों पर एक विशिष्ट स्टोर व्यू (फ्रेंच) पर "डिफॉल्ट डिफ़ॉल्ट मूल्य" सेट करना है।

मैं एक विशिष्ट स्टोर दृश्य पर "डिफ़ॉल्ट मान का उपयोग" करने के लिए बड़ी संख्या में उत्पादों (या सभी उत्पादों) को कैसे रीसेट करूं?

जवाबों:


7

दुर्भाग्य से, इस मामले में उत्पाद विशेषता कार्य को अद्यतन करने के लिए कुशल तरीकों में से कोई भी नहीं है। $product->getResource()->saveAttribute()भले ही आप $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);करता हूं तो यह बॉक्स को टिक कर देगा, लेकिन दृश्यता को "सही" पर भी सेट कर देगा, जो मुझे नहीं चाहिए
जुआरिस टॉम्स लिपीइसे

1
@ Jur IfisTomsLiepiņš यदि आप बॉक्स को टिक करते हैं, तो यह डिफ़ॉल्ट मान का उपयोग करता है, जो कि मूल क्षेत्र से मूल्य है। इसलिए, यदि आप बॉक्स पर टिक लगाते हैं और यह "सही" पर जाता है, तो आपके माता-पिता का मान "सही" भी है। आगे के प्रश्नों के लिए, कृपया एक नया प्रश्न पूछें।
साइमन

मैंने एक नया प्रश्न पूछा , मुझे आशा है कि आप मेरे लिए कुछ चीजें स्पष्ट / स्पष्ट कर सकते हैं
ज्यूरिस टॉम्स लिपि'स

मैं setData का उपयोग सफलतापूर्वक (जब cli से बुलाया जाता है) गलत करता हूं। लेकिन मैंने देखा जब मैं एक दृश्य नियंत्रक मार्ग से एक ही फ़ंक्शन कॉल करता हूं, तो यह काम नहीं करता है! क्या कोई पहले से ही इस मुद्दे का सामना कर रहा है?
डार्ककोवे

@DarkCowboy यह शायद एक अनुमति मुद्दा है। मुझे नहीं लगता कि आप किसी उत्पाद को फ्रंटएंड कंट्रोलर में सहेज सकते हैं। अधिक प्रश्नों के लिए, कृपया एक नया खोलें।
सिमोन

24

फ्रेंच स्टोर के लिए स्टोर आईडी मान 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;

यह मूल रूप से सभी विशेषताओं और उत्पादों के लिए विशेषता मानों को हटा देता है जिसके लिए स्टोर आईडी 2 पर सेट है। जब Magento विशेष स्टोर आईडी के खिलाफ उत्पाद के लिए विशेषता मान नहीं पा सकता है, तो यह डिफ़ॉल्ट मान चुनता है।


1
यह सच नहीं है। यदि कोई विशेषता मान को falseमेरे अनुसार सेट करता है , तो "डिफ़ॉल्ट मान का उपयोग करें" विकल्प टिक जाएगा। यद्यपि आपका समाधान काम कर सकता है, मैं व्यक्तिगत रूप से प्रत्यक्ष एसक्यूएल प्रश्नों का उपयोग करना पसंद नहीं करता।
साइमन

ठीक है माफी, मैंने आपके उत्तर को गलत बताया और सोचा कि आप ओपी को झूठे के बजाय सभी डिफ़ॉल्ट मूल्यों में डालने के लिए कह रहे थे। आपका समाधान काम करता है :)
पारस सूद

5
कृपया ध्यान दें कि "यह सच नहीं है" साइमन के उत्तर पर एक टिप्पणी को संदर्भित करता है जिसे अब हटा दिया गया है। समाधान काम करता है।
फेबियन शेंगलर

@fschmengler क्या पारस सामने के छोर पर छवियों को दिखाने के लिए काम करेंगे? मुझे अपने नए स्टोर के साथ सभी उत्पादों और छवियों के साथ एक ही समस्या है लेकिन उन्हें डिफ़ॉल्ट के रूप में उपयोग करने के लिए नहीं चुना गया है।
Thismethod

@thismethod नहीं, यह कुछ अलग है। इसके लिए पहले से ही एक प्रश्न हो सकता है, अन्यथा कृपया एक नया पूछें
फाबियन शेंगलर

7

थोड़ा देर से शामिल होना, लेकिन मुझे वास्तव में उपरोक्त उत्तरों में से कोई भी पसंद नहीं आया।

  1. सिमोन उत्पाद संग्रह पर चलने का उत्तर पागलपन से धीमा और अक्षम है, हालांकि यह कम से कम मैगेंटो का उपयोग कर रहा है
  2. डेटाबेस पर प्रत्यक्ष संशोधन करने का पारसुड का जवाब थोड़ा डरावना है, और बहुत उपयोगी नहीं है यदि आप इसे स्वचालित कार्यक्षमता के रूप में लपेटना चाहते हैं।

यहां मेरा प्रयास है, पूरी तरह से परीक्षण नहीं किया गया है लेकिन ऐसा लगता है कि मुझे ऐसा करने की आवश्यकता है।

/**
 * 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 पर एक सिंटैक्स त्रुटि क्यों फेंक रहे हैं? @ ल्यूक रॉजर्स
सप्लीमेंट

क्या त्रुटि है?
ल्यूक रॉजर्स

यह अब तय हो गया है लेकिन यह कभी ठीक से नहीं चलता है और मेरे देव पर खत्म होता है। वातावरण। कोई सुझाव?
सप्लीमेंट

वास्तविक त्रुटि के बिना मदद नहीं कर सकते :)
ल्यूक रॉजर्स

किसी भी गाइड पर मुझे इस कोड का उपयोग कैसे करना चाहिए? क्या मैं इसे स्टैंडअलोन स्क्रिप्ट के रूप में उपयोग कर सकता हूं?
क्रिश वेन

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

फिर आपको विशिष्ट स्टोर दृश्य के लिए EAV तालिकाओं से मानों को हटाने के लिए कैटलॉग_प्रोडक्ट_टैटर_अपडेट_बियर इवेंट का उपयोग करने की आवश्यकता होगी , केवल उन विशेषताओं के लिए जिन्हें आपने चेकबॉक्स को पहले core_block_abstract_to_html_before के साथ इंजेक्ट किया है।

उम्मीद है की वो मदद करदे।

यह मॉड्यूल ठीक यही करता है: http://mageinn.com/product/adminextra/ यह उस मॉड्यूल के साथ ' url_key ' विशेषता को रीसेट करना भी संभव है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.