সমস্ত পণ্যের নির্দিষ্ট স্টোর ভিউয়ের জন্য "ডিফল্ট মানটি ব্যবহার করুন" পুনরায় সেট করুন


16

আমার পণ্যগুলির বেশ কয়েকটিতে "ডিফল্ট মানটি ব্যবহার করুন" টি নির্বাচন করা হয়েছে।

আমার দোকানে ইংরেজি এবং ফরাসি এর 2 টি ভাষা রয়েছে। ফরাসী ডিফল্ট স্টোর মান ব্যবহার করে, তাই এখন আমি যখন পণ্য আপডেট করি তখন তা সম্মুখ প্রান্তে উপস্থিত হয় না যতক্ষণ না আমি ম্যানুয়ালি ফ্রেঞ্চ স্টোর ভিউতে পণ্যটিতে না গিয়ে "ডিফল্ট মানটি ব্যবহার করুন" নির্বাচন করি,

কোনও ভর কর্মের জন্য কোনও বৈশিষ্ট্য বলে মনে হয় না, আমি কিছু স্ক্রিপ্ট এবং মাইএসকিউএল কোয়েরিগুলি নিয়ে এসেছি তবে সেগুলির সমাধানগুলি ডিফল্ট মানটি ব্যবহার করার জন্য সমস্ত স্টোর ভিউ পুনরায় সেট করে কিনা তা পরিষ্কার নয়।

পছন্দসই ফলাফলটি হ'ল সমস্ত পণ্যগুলিতে একটি নির্দিষ্ট স্টোর ভিউতে (ফরাসি) "ডিফল্ট মান ব্যবহার করুন" সেট করা।

একটি নির্দিষ্ট স্টোর ভিউতে "ডিফল্ট মান ব্যবহার করুন" এ আমি কীভাবে বিপুল সংখ্যক পণ্য (বা সমস্ত পণ্য) পুনরায় সেট করব?

উত্তর:


7

দুর্ভাগ্যক্রমে, এক্ষেত্রে কোনও পণ্য বিশিষ্টতার কাজ আপডেট করার কার্যকর উপায়গুলির কোনওটি নয়। $product->getResource()->saveAttribute()আপনি যদি আইটেমে স্টোর আইডি সেট করেন তবে সমস্ত স্টোর দর্শনের জন্য অ্যাট্রিবিউট আপডেট করে $productMage::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ģis Toms Liepiņš

আমি সেটডাটাটি সাফল্যের সাথে মিথ্যাতে ব্যবহার করি (যখন ক্লিমে বলা হয়)। কিন্তু আমি লক্ষ্য করেছি যখন আমি সামনের কন্ট্রোলার রুট থেকে একই ফাংশনটি কল করি, এটি কার্যকর হয় না! ইতিমধ্যে কেউ কি এই সমস্যার মুখোমুখি হয়েছেন?
ডার্ক কাউবয়

@ ডার্ককোবয় এটি সম্ভবত একটি অনুমোদিত সমস্যা। আমি মনে করি না যে আপনি কোনও ফ্রন্টএন্ড কন্ট্রোলারে একটি পণ্য সংরক্ষণ করতে পারেন। আরও প্রশ্নের জন্য, দয়া করে একটি নতুন খুলুন।
সাইমন

24

ফরাসী স্টোরের জন্য স্টোর আইডি 2 হিসাবে ধরে নেওয়া, আপনার নীচের মাইএসকিএল ক্যোয়ারী চালানো উচিত:

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 সেট করা থাকে যখন যখন ম্যাজেন্টো নির্দিষ্ট স্টোর আইডির বিপরীতে কোনও পণ্যের জন্য অ্যাট্রিবিউট মানটি খুঁজে না পায়, তখন এটি ডিফল্ট মান বাছাই করে।


1
এটি সত্য নয়। যদি কেউ falseআমার মতো বৈশিষ্ট্যের মানটি সেট করে তবে "ডিফল্ট মানটি ব্যবহার করুন" বিকল্পটি টিক দেওয়া হবে। যদিও আপনার সমাধানটি কার্যকর হতে পারে, আমি ব্যক্তিগতভাবে সরাসরি এসকিউএল কোয়েরিগুলি ব্যবহার করতে পছন্দ করি না।
সাইমন

ঠিক আছে দুঃখিত, আমি আপনার উত্তরটি ভুল করে পড়েছি এবং ভেবেছিলাম আপনি ওপিকে মিথ্যা পরিবর্তে সমস্ত ডিফল্ট মান রাখতে বলছেন। আপনার সমাধান কাজ করে :)
পার্স সুদ

5
দয়া করে মনে রাখবেন যে "এটি সত্য নয়" সিমনের উত্তরের মন্তব্যকে বোঝায় যা এখন সরানো হয়েছে। সমাধান কাজ করে।
ফ্যাবিয়ান শেমঙ্গলার

@fschmengler কি পারস উত্তর প্রান্তে চিত্রগুলি দেখানোর জন্য কাজ করবে? আমার নতুন স্টোরের সাথে আমার একই সমস্যা রয়েছে সমস্ত পণ্য এবং চিত্র রয়েছে তবে সেগুলি ডিফল্ট হিসাবে ব্যবহার করার জন্য নির্বাচিত হয় না।
স্মিথিক

@ তৃতীয় না, এটি অন্যরকম। ইতিমধ্যে এটির জন্য একটি প্রশ্ন থাকতে পারে, অন্যথায় দয়া করে একটি নতুন জিজ্ঞাসা করুন
ফ্যাবিয়ান শেমংলার

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

অ্যাডমিন ভর আপডেট ফর্মের প্রতিটি বৈশিষ্ট্যের জন্য প্রয়োজনীয় চেকবক্সগুলি যুক্ত করতে আপনি কোর_ব্লক_অ্যাবস্ট্রাক_টি_এইচটিএমএল_এর আগে প্রশাসনিক ইভেন্টটি ব্যবহার করতে পারেন ।

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 টেবিলগুলি থেকে মানগুলি মুছতে ক্যাটালগ_প্রডक्ट_ট্রিবিউট_আপডেট_বরে ইভেন্টটি ব্যবহার করতে হবে , কেবলমাত্র সেই বৈশিষ্ট্যগুলির জন্য যা আপনার আগে कोर_ব্লক_আবস্ট্রাক্ট_এ_এইচটিএমএল_পূর্বে সেট হিসাবে সেট করা চেকবক্স রয়েছে for

আশা করি এইটি কাজ করবে.

এই মডিউলটি হুবহু এটি করে: http://mageinn.com/product/adminextra/ সেই মডিউলটির সাথে ' url_key ' বৈশিষ্ট্যটি পুনরায় সেট করাও সম্ভব ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.