সংগ্রহের ক্ষেত্রে গ্রুপ ক্লজ ব্যবহার করার সময় গ্রিড পৃষ্ঠাসমূহ কাজ করছে না


9

আমি প্রোডাক্ট গ্রিডে কাজ করছি তবে এর পৃষ্ঠাগুলি বা পণ্য গণনা কাজ করছে না (যেমন এটি ভুল গণনা প্রদর্শন করে)। আমার ব্লক _প্রিপারেকলিকেশন ফাংশনটি নীচের মতো রয়েছে collection সংগ্রহের ক্ষেত্রে বিভাগের ফিল্টার কোড যুক্ত করেছি তাই ইতিমধ্যে উপস্থিত আইডির ত্রুটি রোধ করতে আমাকে গ্রুপ ক্লজটি ব্যবহার করতে হবে।

    protected function _prepareCollection()
    {
        $store = $this->_getStore();
        $collection = Mage::getModel('catalog/product')->getCollection()
            ->addAttributeToSelect('sku')
            ->addAttributeToSelect('name')
            ->addAttributeToSelect('attribute_set_id')
            ->addAttributeToSelect('type_id')
            ->joinField('category_id',
                'catalog/category_product',
                'category_id',
                'product_id=entity_id',
                null,
                'left');
$collection->addAttributeToFilter('category_id', array('in' => array(4,10)))
            ->distinct(true);
            $collection->getSelect()->group('e.entity_id');


        if (Mage::helper('catalog')->isModuleEnabled('Mage_CatalogInventory')) {
            $collection->joinField('qty',
                'cataloginventory/stock_item',
                'qty',
                'product_id=entity_id',
                '{{table}}.stock_id=1',
                'left');
        }
        $collection->joinField('position',
                'catalog/category_product',
                'position',
                'product_id=entity_id',
                null,
                'left');
        $collection->joinField('websites',
            'catalog/product_website',
            'website_id',
            'product_id=entity_id',
            null,
            'left');
        if ($store->getId()) {
            //$collection->setStoreId($store->getId());
            $adminStore = Mage_Core_Model_App::ADMIN_STORE_ID;
            $collection->addStoreFilter($store);
            $collection->joinAttribute(
                'name',
                'catalog_product/name',
                'entity_id',
                null,
                'inner',
                $adminStore
            );

            $collection->joinAttribute(
                'custom_name',
                'catalog_product/name',
                'entity_id',
                null,
                'inner',
                $store->getId()
            );
            $collection->joinAttribute(
                'status',
                'catalog_product/status',
                'entity_id',
                null,
                'inner',
                $store->getId()
            );
            $collection->joinAttribute(
                'visibility',
                'catalog_product/visibility',
                'entity_id',
                null,
                'inner',
                $store->getId()
            );
            $collection->joinAttribute(
                'price',
                'catalog_product/price',
                'entity_id',
                null,
                'left',
                $store->getId()
            );
        }
        else {
            $collection->addAttributeToSelect('price');
            $collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner');
            $collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
        }

        $this->setCollection($collection);

        parent::_prepareCollection();
        $this->getCollection()->addWebsiteNamesToResult();
        return $this;
    }

আমার গুগল ছিল এবং উত্তর পেয়েছে এবং এটিকে যুক্ত করে lib/varian/data/collection/db.php

    public function getSelectCountSql()
{
     $this->_renderFilters();

        $countSelect = clone $this->getSelect();
        $countSelect->reset(Zend_Db_Select::ORDER);
        $countSelect->reset(Zend_Db_Select::LIMIT_COUNT);
        $countSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
        $countSelect->reset(Zend_Db_Select::COLUMNS);

        if(count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) {
            $countSelect->reset(Zend_Db_Select::GROUP);
            $countSelect->distinct(true);
            $group = $this->getSelect()->getPart(Zend_Db_Select::GROUP);
            $countSelect->columns("COUNT(DISTINCT ".implode(", ", $group).")");
        } else {
            $countSelect->columns('COUNT(*)');
        }
        return $countSelect;
}

এখানে চিত্র বর্ণনা লিখুন তবে কোনও ভাগ্য দয়া করে এটিকে সমাধান করতে সহায়তা করুন


আপনি কোন ক্লাস বাড়িয়ে দিচ্ছেন? Mage_Adminhtml_Block_Widget_Grid?
— B00MER

হ্যাঁ আমি প্রসারিত করছিMage_Adminhtml_Block_Widget_Grid
— জহিরব্বাস

কি কোয়েরি getSelectCountSql এ কল দেয়?
— অ্যামাস্টি

উত্তর:


17

ম্যাজেন্টোতে সংগ্রহ এবং অলস লোড হচ্ছে

পৃষ্ঠাগুলি কাজ না করার কারণ হ'ল সংগ্রহগুলি কীভাবে গণনা করা হয় এবং সংগ্রহের সাথে কীভাবে অলস লোডিং কাজ করে।

ম্যাজেন্টোতে সংগ্রহ ক্লাস প্রয়োগ করে Countable। ম্যাজেন্টোতে সংগ্রহের অলস লোডিংয়ের কারণে, যখনই পদ্ধতিটি কল count()করা হয়, তখন ডেটা লোড করতে হয়। এর কার্যকারিতা হিসাবে, সংগ্রহগুলি একটি পদ্ধতি প্রয়োগ করে getSize()। এটি আপনার এসকিউএল স্টেটমেন্টটিকে ক্লোন করবে, এটিকে মুড়ে ফেলবে COUNT()এবং ফলাফলটি ফিরিয়ে দেবে। এটি কোনও তথ্য সমস্ত ডেটা লোড না করে মোট গণনা পাওয়ার মঞ্জুরি দেয়। এটি ফিল্টারগুলির মতো জিনিসগুলিকে শেষ মুহুর্তে যুক্ত করার অনুমতি দেয়।

এটি যা Varien_Data_Collection_Db::getSize()এবং এর অংশীদারের getSelectCountSql()মতো দেখাচ্ছে:

/**
     * Get collection size
     *
     * @return int
     */
    public function getSize()
    {
        if (is_null($this->_totalRecords)) {
            $sql = $this->getSelectCountSql();
            $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);
        }
        return intval($this->_totalRecords);
    }

    /**
     * Get SQL for get record count
     *
     * @return Varien_Db_Select
     */
    public function getSelectCountSql()
    {
        $this->_renderFilters();

        $countSelect = clone $this->getSelect();
        $countSelect->reset(Zend_Db_Select::ORDER);
        $countSelect->reset(Zend_Db_Select::LIMIT_COUNT);
        $countSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
        $countSelect->reset(Zend_Db_Select::COLUMNS);

        $countSelect->columns('COUNT(*)');

        return $countSelect;
    }

মূলত, এটি সীমাবদ্ধতা, কলাম, ক্রম ইত্যাদির ড্রপ দেয় এবং ফিল্টারগুলি পিছনে ফেলে। তারপরে এটি COUNT()কলামগুলিতে একটি মাইএসকিউএল যুক্ত করে।

সমস্যাটি

সাধারণত, একটি টেবিলে, এটি মোট গণনা সহ এক সারিতে ফিরে আসবে। এই কারণেই ক্যোয়ারির বিপরীতে getSize()একটি করে fetchOne()। যাইহোক, টেবিল যোগ দেয়, গ্রুপ বাইগুলি এবং অন্যান্য মত জিনিসগুলি করার সময় আপনি এক সারি ফিরে পাবেন না, আপনি একাধিক ফিরে আসবেন। এই কারণে getSize()আপনার সংগ্রহের পদ্ধতিটি পরিবর্তন করতে হবে ।

সমাধান

আপনার পদ্ধতিটি এখন দেখতে দেখতে এটির মতো হওয়া উচিত:

public function getSize() {

        if ( is_null( $this->_totalRecords ) ) {
            $sql = $this->getSelectCountSql();
            // fetch all rows since it's a joined table and run a count against it.
            $this->_totalRecords = count( $this->getConnection()->fetchall( $sql, $this->_bindParams ) );
        }

        return intval( $this->_totalRecords );
    }

একটির পরিবর্তে fetchOne(), আমরা fetchAll()একটি count()পিএইচপি ফাংশনটিতে আবৃতভাবে চালিত । এখন আপনার মোটগুলি যথাযথভাবে ফিরে আসবে।


2
এসই এর সমস্ত উত্তরগুলি আমি এইভাবেই চাই। একটি সমাধান এবং কিছু গভীরতা।
— শ্যাম্পু

4

দুর্দান্ত সমাধান। আমাদের কারও কারওর মতো সমস্যা হতে পারে, তাই আমি আর একটি সম্ভাব্য সমাধান পোস্ট করব। আমাদের ক্ষেত্রে আমাদের একটি সংগ্রহ ছিল, যা মাঝে মাঝে বিবৃতি অনুসারে একটি গোষ্ঠী অন্তর্ভুক্ত করে এবং কখনও কখনও এটি সংগ্রহ না করে এমন গ্রিডের উপর নির্ভর করে। উপরের সমাধানটি ব্যবহার করে আমরা দুটি সমস্যা পেয়েছি:

  1. সংগ্রহটি খালি থাকলে আকারটি 1 হিসাবে মূল্যবান হয় যদিও এটি শূন্য হওয়া উচিত।
  2. সংগ্রহগুলিতে বিবৃতি না দিয়ে getSize পদ্ধতিটি গোষ্ঠী ব্যতীত ডেকে আনা হয়েছে এমন ক্ষেত্রে, সংগ্রহে কতগুলি আইটেমই থাকুক না কেন আকারটিকে 1 হিসাবে মূল্য দেওয়া হয়।

কিছুক্ষণ ডিবাগ করার পরে আমরা জানতে পেরেছিলাম, যে ক্ষেত্রে 1 অংশ

$this->getConnection()->fetchall( $sql, $this->_bindParams ) 

মান হিসাবে 0 সহ একটি এন্ট্রি রয়েছে এমন একটি অ্যারে প্রদান করে That এজন্য কোনও প্রবেশিকা সন্ধান না করা হলেও কাউন্ট ফাংশনটি 1 প্রদান করে।

ক্ষেত্রে 2 একই অংশে একটি এন্ট্রি সহ একটি অ্যারে প্রদান করে, যার মান সংগ্রহের আসল আকার। গণনা ফাংশন আবার 1 দেয় এবং মানটি দেয় না।

বিকল্পের সন্ধান করতে গিয়ে আমরা জানতে পেরেছি যে পণ্য সংগ্রহটি ফাংশনটির পুনর্লিখন getSelectCountSql () ব্যবহার করে uses আমরা এটিকে অভিযোজিত করেছি এবং এটি কিছুটা পরিবর্তন করেছি, যা এই সমাধানটিতে শেষ হয়েছিল:

public function getSelectCountSql()
{
    $countSelect = parent::getSelectCountSql();
    $countSelect->reset(Zend_Db_Select::COLUMNS);
    $countSelect->reset(Zend_Db_Select::GROUP);
    $countSelect->columns('COUNT(DISTINCT item_id)');

    return $countSelect;
}

আমি ইতিমধ্যে উল্লিখিত দুটি সমস্যা সমাধান করে এবং যতদূর আমি দেখতে পাচ্ছি এটি অন্যান্য ক্ষেত্রেও কাজ করে।


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