পণ্যের বৈশিষ্ট্যে যোগদানের জন্য সেরা অনুশীলন


11

আমার কাছে পণ্য রেফারেন্স সহ একটি কাস্টম টেবিল রয়েছে product_id। এখন আমি আমার ব্যাকএন্ড গ্রিডে পণ্যের তথ্য (স্কু, নাম) দেখাতে চাই , তবে আমি নিশ্চিত নই যে এটি করার সর্বোত্তম অনুশীলনটি কী?

আমার সেরা অনুমানটি SKUনিম্নরূপ:

$collection->join(
    'catalog/product',
    'product_id=`catalog/product`.entity_id',
    array('product_sku' => 'sku')
)

( আমার গ্রিড ব্লক শ্রেণীর পদ্ধতি থেকে কোড _prepareCollection() )

তবে পণ্যের নাম কী? এটি ক্যাটালগ_প্রডাক্ট_এন্টিটি_ভরচারে পাওয়া যাবে। আমার বোধগম্যতা হল আপনার নিজের উত্সের মডেল এবং সংগ্রহের ভিত্তিতে যদি আপনি এটির Mage_Eav_Model_Entity_Collection_Abstractমতো পদ্ধতি ব্যবহার করতে পারেন তবে আপনি এটি সহজেই পেতে পারেন joinAttribute। তবে আমার মডেলটি একটি সাধারণ টেবিলের ভিত্তিতে এবং এর থেকে প্রসারিত Mage_Core_Model_Resource_Db_Collection_Abstractএবং কোনও joinAttributeপদ্ধতি উপলভ্য নয়।

এই ক্ষেত্রে পণ্যটির নাম পাওয়ার সর্বোত্তম উপায় কী?

আপনার সময় এবং সাহায্যের জন্য ধন্যবাদ :-)

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

entity_id    product_id    created_at    user_id

আমার উদ্দেশ্য ব্যাকেন্ডে গ্রিড করা যেখানে আমি কিছু পরিসংখ্যান দেখি:

ProductSku    Count(ProductSku)    MAX(created_at)

যতদূর আমি জানি, এটি করার সর্বোত্তম পন্থা গ্রিড ব্লক শ্রেণীর মাধ্যমে এবং যাওয়ার পদ্ধতিটি _prepareCollection()

আমার পদ্ধতিটি এমন দেখাচ্ছে:

protected function _prepareCollection()
{
    // Get and set our collection for the grid
    $collection = Mage::getResourceModel($this->_getCollectionClass());
    $collection
        ->join(
            'catalog/product',
            'product_id=`catalog/product`.entity_id',
            array('product_sku' => 'sku')
            )
        ->addExpressionFieldToSelect('product_count', 'COUNT({{product_id}})', 'product_id')
        ->addExpressionFieldToSelect('newest', 'MAX({{created_at}})', array('created_at'=>'main_table.created_at'))
        ->getSelect()->group('product_id');
    $this->setCollection($collection);

    return parent::_prepareCollection();
}

এটি স্কুর পক্ষে (যা আমি _prepareColums()পদ্ধতিতে product_sku হিসাবে উল্লেখ করি) ভাল কাজ করে But joinতবে নাম (এবং যেমন প্রস্তুতকারক) পেতে এখানে আমাকে কী প্রবেশ করানো দরকার?

আমি কিছু ভুল করছি কারণ আমি ব্যবহার করতে পারি না joinLeft()?

উত্তর:


13

আপনার সংগ্রহের ক্লাসে ( /Some/Module/Model/Mysql4 (or Resource)/YourModel/Collection.php) এই পদ্ধতিটি যুক্ত করুন:

public function addProductData()
    {
        /** add particular attribute code to this array */
        $productAttributes = array('name', 'price', 'url_key');
        foreach ($productAttributes as $attributeCode) {
            $alias     = $attributeCode . '_table';
            $attribute = Mage::getSingleton('eav/config')
                ->getAttribute(Mage_Catalog_Model_Product::ENTITY, $attributeCode);

            /** Adding eav attribute value */
            $this->getSelect()->join(
                array($alias => $attribute->getBackendTable()),
                "main_table.product_id = $alias.entity_id AND $alias.attribute_id={$attribute->getId()}",
                array($attributeCode => 'value')
            );
            $this->_map['fields'][$attributeCode] = 'value';
        }
        /** adding catalog_product_entity table fields */
        $this->join(
            'catalog/product',
            'product_id=`catalog/product`.entity_id',
            array('sku' => 'sku', 'type_id' => 'type_id')
        );
        $this->_map['fields']['sku']     = 'sku';
        $this->_map['fields']['type_id'] = 'type_id';
        return $this;
    }

আপনার গ্রিড ব্লকে এই ফাংশনটি ব্যবহার করুন:

 protected function _prepareCollection()
    {
        $collection = Mage::getModel('some/yourmodel')
            ->getCollection()->addProductData();
        $this->setCollection($collection);
        return parent::_prepareCollection();
    }

এটি আশাব্যঞ্জক দেখায় তবে দুর্ভাগ্যক্রমে এটি কার্যকর হয় না। আমার সংগ্রহটি প্রসারিত হয়েছে Mage_Core_Model_Resource_Db_Collection_Abstractএবং আমি একটি ত্রুটি পেয়েছি Call to undefined method Mycompany_Module_Model_Resource_Mymodel_Collection::joinLeft()। আমার ধারণা এটির কারণ আমি কোনও EAV রিসোর্স মডেল ব্যবহার করি না?
সেলডওয়েলার

লেফট এর পরিবর্তে জয়েন ব্যবহার করুন, আমি উত্তরটি সম্পাদনা করেছি
mageUz

Doh! আমি এখন বোকা বোধ করছি! ;-) এবং কেন আমি এটি চেষ্টা করেছিলাম তা আমি জানি না। আপনাকে অনেক ধন্যবাদ!
সেলডওয়েলার

@ সেলডওয়েলার, আপনাকে এক্ষেত্রে সম্পূর্ণরূপে ব্যবহার $this->_map['fields']['sku'] = 'sku'বা অনুরূপ করার দরকার নেই । আপনার কেবলমাত্র এটির প্রয়োজন যদি আপনার বেশ কয়েকটি অভিন্ন ক্ষেত্রের নাম থাকে এবং দ্বন্দ্ব রোধ করতে কোনও অনুবাদ করতে হবে। এটি এই ব্যবহারের ক্ষেত্রে কেবল ওভারহেড যুক্ত করে। একটি ভিন্ন ব্যবহার ক্ষেত্রে, আপনি ব্যবহার করতে পারেন $this->_map['fields']['my_sku'] = 'sku'তাহলে আপনি এবং সংগ্রহ সাথে ব্যবহার করতে পারেন _prepareColumns: $this->addColumn('my_sku', array(…)), আপনার ফিল্টারিং বা বাছাই কলামের জন্য দ্বন্দ্ব প্রতিরোধ করতে সাহায্য করবে আপনি একটি ক্ষেত্র যদি skuসংগ্রহে বিভিন্ন ডিবি টেবিল সাধারণ ব্যবহৃত
সিলভাঁ raye

দুর্দান্ত উত্তর! যদিও এটি "একই আইডি থাকা আইটেমটি ইতিমধ্যে বিদ্যমান" বিষয়গুলিতে নিয়ে যেতে পারে। একটি সাধারণ $this->getSelect()->group('main_table.product_id');সমস্যা সমাধান করে, তবে সম্ভবত কোডটি অনুকূলিত করা যায়, যাতে ডুপ্লিকেটগুলি প্রথম স্থানে তৈরি হয় না?
সাইমন

4

হাই সেলডওয়িলার আমি আশা করি আপনি ভাল করছেন :-)

ক্লাস সম্পর্কে আপনার ব্যাখ্যাতে আপনি ভুল হয়েছিলেন Mage_Core_Model_Resource_Db_Collection_Abstract, আপনি কোনও উত্স সংগ্রহ সংগ্রহকে প্রসারিত করবেন না কারণ আপনি যদি ম্যাজেন্টো কাঠামোকে সম্মান করতে চান তবে আপনার অবশ্যই সংগ্রহের শ্রেণীর সাথে কোনও মডেল প্রসারিত করতে হবে না। আমি কি সঠিক?

আমার সংশোধনের উপর ভিত্তি করে, আপনি কতবার পণ্যের নাম বিশিষ্টতা পেতে চান তার উপর নির্ভর করে আমি বিভিন্ন ধরণের পন্থা দেখি। যাই হোক না কেন, আমি মনে করি ম্যাগেন্টো ফ্রেমওয়ার্কের মাধ্যমে একটি বর্গ কোয়েরি করাই সেরা উপায় এবং দক্ষ। Mage::getModel('catalog/product')->load(1234)->getName()প্রতিটি লোড হওয়া আইটেমটি করার চেয়ে এটি আরও দ্রুত । সুতরাং বাস্তবে এটি কোডটির সাথে আপনার অনুরূপ ব্যবহারের মতো হবেsku

কোড পরীক্ষা করা হয়নি

প্রতিবার কোনও সংগ্রহ লোড হওয়ার পরে আপনি সেই তথ্যগুলি চান

আপনি আপনার সংগ্রহে ক্লাসে একটি _beforeLoadপদ্ধতিতে এমন একটি কোড সেট করতে পারেন :

protected function _beforeLoad()
{
    $productName = Mage::getSingleton('eav/config')->getAttribute('catalog_product','name');

    $this->getSelect()
        ->join( array('product_attribute' => $productName->getBackendTable()),
            'main_table.product_id = product_attribute.entity_id',
            array())
        ->where("product_attribute.attribute_id = ?", $productName->getId());
    }

    return parent::_beforeLoad();
}

আপনি গ্রিডের জন্য কেবল সেই তথ্যগুলি চান

আপনার মধ্যে _prepareCollection, আপনার সংগ্রহে একটি পদ্ধতি যুক্ত কোডের সাথে একই কোডের সাথে যোগ করতে হবে যেমনটি _beforeLoadপরে করা হয়েছিল তখন আপনি এই পদ্ধতিটি ব্যবহার করে সংগ্রহটি প্রস্তুত করতে পারেন। দুটোই ব্যবহার করবেন না, মানে একই কোড _beforeLoadএবং addProductNameপদ্ধতিগুলিতে একসাথে ব্যবহার করবেন না , তাদের মধ্যে কেবল একটিটি ব্যবহার করুন। এখানে একটি নমুনা দেওয়া হল:

আপনার মধ্যে grid.php:

protected function _prepareCollection()
{
    ...
    $collection->addProductName();
    $this->setCollection($collection);
    return parent::_prepareCollection();
}

আপনার সংগ্রহের মধ্যে.এফপি:

public function addProductName()
{
    $productName = Mage::getSingleton('eav/config')->getAttribute('catalog_product','name');

    $this->getSelect()
        -> join( array('product_attribute' => $productName->getBackendTable()),
            'main_table.product_id = product_attribute.entity_id',
            array())
        ->where("product_attribute.attribute_id = ?", $productName->getId());

    return $this;
}

আপনাকে আবার পড়তে দুর্দান্ত :-) আপনাকে অনেক ধন্যবাদ তবে আমি জয়েন লেফট () পদ্ধতিটি ব্যবহার করতে পারি না। আমার ধারণা এটি কোনও EAV রিসোর্স মডেল-একমাত্র পদ্ধতি? আপনারা ঠিক বলেছেন, আমি আমার প্রাথমিক প্রশ্নে অবজ্ঞাত ছিলাম। আমি এটি সম্পাদনা করব :)
সেলডভেলার

ওহ এবং বিটিডব্লিউ: অবশ্যই আমি এমন পরিস্থিতিতে কোনও পণ্য-> লোড () করতে চাই না। আমি যদি সাহস করতাম তবে আমাকে গুলি কর! ;-) গ্রিডে বাছাই এবং ফিল্টারিং করতে সক্ষম হবার জন্য আমার লক্ষ্যটি হ'ল এটি একটি সমস্ত সংগ্রহের মধ্যে। আরও তথ্যের জন্য আমার প্রাথমিক পোস্টে আপডেটটি দেখুন।
সেলডওয়েলার

সুতরাং যোগদানের মাধ্যমে জয়েন লেফটকে প্রতিস্থাপন করুন তবে আপনি ইতিমধ্যে অন্য উত্তরটি গ্রহণ করেছেন যদিও আমি সঠিক উত্তর দিয়েছি এবং উত্তরটি প্রথম
বলেছিলাম

হ্যাঁ তুমিই ঠিক. আমি এতটা খুশি যে অবশেষে এটি কাজ করেছিল, আমি এটি সম্পর্কে ভাবিনি। আপনাদের দুজনের জন্য আমি অনেক কৃতজ্ঞ। আশা করি তুমি আমাকে ক্ষমা করতে পারো! আমি আপনাকে একটি বিয়ার পাওনা।
সেলডওয়েলার

আহহ কোন চিন্তা নেই। আমরা বার্লিনে আপনার সাথে খুশির সাথে দেখা করেছি :-)
সিলভাইন রায় é

4

আমার প্রায় একই সমস্যা ছিল, তবে আমি কোনও মন্তব্য যুক্ত করতে পারি না, কারণ আমার 50 টি খ্যাতি নেই। আমি কী ভুল তা খুঁজে বের করার জন্য অনেক সময় ব্যয় করেছি (আমি সিলভাইন রায়ের কোড ব্যবহার করেছি)। আমার পণ্য সংগ্রহ কোনও কারণে ফিল্টার হয়েছে। সুতরাং আমি একটি কারণ খুঁজে পেয়েছি।

আপনি যদি কিছু আমদানি সরঞ্জাম (ম্যাগমি ইত্যাদি) ব্যবহার করেন তবে তারা প্রায়শই একবারে খালি বৈশিষ্ট্য তৈরি করে না। সুতরাং ->where("product_attribute.attribute_id = ?", $productName->getId())যে পণ্যগুলিতে এই বৈশিষ্ট্যটি নেই, তারা ব্যবহার করা নির্বাচন থেকে অদৃশ্য হয়ে যাবে।

সঠিক উপায় এটি ব্যবহার করে joinLeft:

$productName = Mage::getSingleton('eav/config')->getAttribute('catalog_product','name');

$this->getSelect()
     ->joinLeft(array('product_attribute' => $productName->getBackendTable()),
        "main_table.product_id = product_attribute.entity_id AND
         product_attribute.attribute_id = {$productName->getId()}",
        array());

আশা করি এটি কাউকে সাহায্য করবে।


-2

পণ্য গ্রিডে কাস্টম বৈশিষ্ট্য প্রদর্শন করুন।

দয়া করে আপনার এক্সটেনশনে এই ব্লকটি Mage_Adminhtml_Block_GGG.rep_ পণ্য উত্পাদন_গ্রিডটি ওভাররাইট করুন এবং আপনার এক্সটেনশনের ব্লক ফাইলগুলিতে ফাংশন _প্রিপারেকশন এবং _প্রিয়ার কলামগুলি অনুলিপি করুন।

Gr এটি-> সেটকলেশন ($ সংগ্রহ) লাইনের আগে প্রোডাক্ট গ্রিডের ম্যাজ_এডমিনটিচটিএম_ব্লক_ক্যাটালগ_প্রডাক্ট_গ্রিডের _প্রিয় সংগ্রহের ফাংশনে অ্যাট্রিবিউট নির্বাচন করতে কোডের নীচে যুক্ত করুন।

$attributeCode = 'qc_status';//here your attribute code
        $collection->joinAttribute($attributeCode, 'catalog_product/'.$attributeCode, 'entity_id', null, 'left');
        $collection->addAttributeToSelect($attributeCode);

এবং তারপরে গ্রিডের _parepare কলাম ফাংশনে কলামের জন্য কোড নীচে।

$attributeCodeConfig ='qc_status';//Your attribute code...

        $attributeId = Mage::getResourceModel('eav/entity_attribute')->getIdByCode('catalog_product', $attributeCodeConfig);

        $attribute = Mage::getModel('catalog/resource_eav_attribute')->load($attributeId);
        $attributeData = $attribute->getData();
        $frontEndLabel = $attributeData['frontend_label'];

        $attributeOptions = $attribute->getSource()->getAllOptions();
        $b = new Mage_Catalog_Model_Resource_Eav_Attribute();
        $attributeOptions2 = array();
        foreach ($attributeOptions as $value) {
            if(!empty($value['value'])) {
                $attributeOptions2[$value['value']] = $value['label'];
            }

        }


        if(count($attributeOptions2) > 0) {
            $this->addColumn($attributeCodeConfig,
                array(
                    'header'=> Mage::helper('catalog')->__($frontEndLabel),
                    'width' => '80px',
                    'index' => $attributeCodeConfig,
                    'type'  => 'options',
                    'options' => $attributeOptions2,

            ));
        } else {
            $this->addColumn($attributeCodeConfig,
                array(
                    'header'=> Mage::helper('catalog')->__($frontEndLabel),
                    'width' => '80px',
                    'index' => $attributeCodeConfig,

            ));
        }

কোর ফাইল পরিবর্তন করা ভাল অভ্যাস নয়। একই জন্যnew SomeModel()
sv3n

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