কোনও গ্রিডে (পর্যবেক্ষক) কলাম যুক্ত করুন - কলামটি 'স্টোর_আইড' যেখানে ধারাটি অস্পষ্ট বিষয়


16

আমি পর্যবেক্ষক পদ্ধতির ব্যবহার করে অর্ডার গ্রিডে একটি কলাম যুক্ত করছি:

  1. ইভেন্ট -> sales_order_grid_collection_load_before আমি সংগ্রহে একটি যোগ যোগ করছি
  2. ইভেন্টে -> core_block_abstract_prepare_layout_beforeআমি গ্রিডে একটি কলাম যুক্ত করছি

সম্পাদনাআরও তথ্য :

ইভেন্টে (1):

   public function salesOrderGridCollectionLoadBefore($observer)
{
    $collection = $observer->getOrderGridCollection();
    $collection->addFilterToMap('store_id', 'main_table.store_id');
    $select = $collection->getSelect();
    $select->joinLeft(array('oe' => $collection->getTable('sales/order')), 'oe.entity_id=main_table.entity_id', array('oe.customer_group_id'));

}

ইভেন্টে (2):

public function appendCustomColumn(Varien_Event_Observer $observer)
{
    $block = $observer->getBlock();
    if (!isset($block)) {
        return $this;
    }

    if ($block->getType() == 'adminhtml/sales_order_grid') {
        /* @var $block Mage_Adminhtml_Block_Customer_Grid */
        $this->_addColumnToGrid($block);
    }
}

protected function _addColumnToGrid($grid)
{

    $groups = Mage::getResourceModel('customer/group_collection')
        ->addFieldToFilter('customer_group_id', array('gt' => 0))
        ->load()
        ->toOptionHash();
    $groups[0] = 'Guest';


    /* @var $block Mage_Adminhtml_Block_Customer_Grid */
    $grid->addColumnAfter('customer_group_id', array(
        'header' => Mage::helper('customer')->__('Customer Group'),
        'index' => 'customer_group_id',
        'filter_index' => 'oe.customer_group_id',
        'type' => 'options',
        'options' => $groups,
    ), 'shipping_name');
}

আমি স্টোর ভিউ ফিল্টার সহ গ্রিড ফিল্টার না করা পর্যন্ত সবকিছু ঠিকঠাক কাজ করে : কলামটি 'স্টোর_আইড' যেখানে ধারাটি অস্পষ্ট বিষয়

আমি ক্যোয়ারীটি মুদ্রণ করেছি:

SELECT `main_table`.*, `oe`.`customer_group_id` 
FROM `sales_flat_order_grid` AS `main_table`
LEFT JOIN `sales_flat_order` AS `oe` ON oe.entity_id=main_table.entity_id 
WHERE (store_id = '5') AND (oe.customer_group_id = '6')

আপনি যেমন store_idমিস main_tableওরফে দেখুন।

এটি সম্পাদন করার জন্য আমাকে কেবল filter_indexস্টোর আইডি কলামের জন্য সেট করা দরকার তবে পর্যবেক্ষকের মাধ্যমে তাই প্রশ্ন হল আমি কীভাবে উড়তে পারি?
ব্লক ক্লাস ওভাররাইড না করে ? (অন্যথায় পর্যবেক্ষক পদ্ধতির অকেজো)

উত্তর:


32

আপনার আগে উল্লিখিত অন্যান্য সমাধানগুলির সাথে এটি আবার চেষ্টা করুন :-), কীভাবে গ্রিড টেবিলের সাথে ক্ষেত্রটি যুক্ত করতে হয় তা দেখানোর জন্য আমি সম্পূর্ণ এক্সটেনশন তৈরি করেছি। এর পরে আপনার গ্রিড পৃষ্ঠার ক্রমটি কলামটি যুক্ত করতে আপনার কেবল একটি লেআউট আপডেট ফাইল দরকার।

আমি এক্সটেনশনকে উদাহরণ_ সেলস গ্রিড বলেছি, তবে আপনি এটি নিজের প্রয়োজনে পরিবর্তন করতে পারেন।

আসুন /app/etc/modules/Example_SalesGrid.xml এ মডিউল init xML তৈরি করে শুরু করুন :

<?xml version="1.0" encoding="UTF-8"?>
<!--
 Module bootstrap file
-->
<config>
    <modules>
        <Example_SalesGrid>
            <active>true</active>
            <codePool>community</codePool>
            <depends>
                <Mage_Sales />
            </depends>
        </Example_SalesGrid>
    </modules>
</config>

এরপরে আমরা আমাদের মডিউল কনফিগার এক্সএমএল / অ্যাপ্লিকেশন / কোড / কম্যুনিটি / উদাহরণ / বিক্রয় গ্রিড / সেটসি / কনফিগ.এক্সএমএল তৈরি করি :

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Example_SalesGrid>
            <version>0.1.0</version> <!-- define version for sql upgrade -->
        </Example_SalesGrid>
    </modules>
    <global>
        <models>
            <example_salesgrid>
                <class>Example_SalesGrid_Model</class>
            </example_salesgrid>
        </models>
        <blocks>
            <example_salesgrid>
                <class>Example_SalesGrid_Block</class>
            </example_salesgrid>
        </blocks>
        <events>
            <!-- Add observer configuration -->
            <sales_order_resource_init_virtual_grid_columns>
                <observers>
                    <example_salesgrid>
                        <model>example_salesgrid/observer</model>
                        <method>addColumnToResource</method>
                    </example_salesgrid>
                </observers>
            </sales_order_resource_init_virtual_grid_columns>
        </events>
        <resources>
            <!-- initialize sql upgrade setup -->
            <example_salesgrid_setup>
                <setup>
                    <module>Example_SalesGrid</module>
                    <class>Mage_Sales_Model_Mysql4_Setup</class>
                </setup>
            </example_salesgrid_setup>
        </resources>
    </global>
    <adminhtml>
        <layout>
            <!-- layout upgrade configuration -->
            <updates>
                <example_salesgrid>
                    <file>example/salesgrid.xml</file>
                </example_salesgrid>
            </updates>
        </layout>
    </adminhtml>
</config>

এখন আমরা / অ্যাপ্লিকেশন / কোড / কম্যুনিটি / উদাহরণ / বিক্রয় গ্রিড / এসকিএল / এক্সামাল_সলেসগ্রিড_সেটআপ / ইনস্টল-0.1.1 . phpস্কেল আপগ্রেড স্ক্রিপ্ট তৈরি করি :

<?php
/**
 * Setup scripts, add new column and fulfills
 * its values to existing rows
 *
 */
$this->startSetup();
// Add column to grid table

$this->getConnection()->addColumn(
    $this->getTable('sales/order_grid'),
    'customer_group_id',
    'smallint(6) DEFAULT NULL'
);

// Add key to table for this field,
// it will improve the speed of searching & sorting by the field
$this->getConnection()->addKey(
    $this->getTable('sales/order_grid'),
    'customer_group_id',
    'customer_group_id'
);

// Now you need to fullfill existing rows with data from address table

$select = $this->getConnection()->select();
$select->join(
    array('order'=>$this->getTable('sales/order')),
    $this->getConnection()->quoteInto(
        'order.entity_id = order_grid.entity_id'
    ),
    array('customer_group_id' => 'customer_group_id')
);
$this->getConnection()->query(
    $select->crossUpdateFromSelect(
        array('order_grid' => $this->getTable('sales/order_grid'))
    )
);

$this->endSetup();

এরপরে আমরা /app/design/adminhtml/default/default/layout/example/salesgrid.xml এ লেআউট আপডেট ফাইলটি তৈরি করি:

<?xml version="1.0"?>
<layout>
    <!-- main layout definition that adds the column -->
    <add_order_grid_column_handle>
        <reference name="sales_order.grid">
            <action method="addColumnAfter">
                <columnId>customer_group_id</columnId>
                <arguments module="sales" translate="header">
                    <header>Customer Group</header>
                    <index>customer_group_id</index>
                    <type>options</type>
                    <filter>Example_SalesGrid_Block_Widget_Grid_Column_Customer_Group</filter>
                    <renderer>Example_SalesGrid_Block_Widget_Grid_Column_Renderer_Customer_Group</renderer>
                    <width>200</width>
                </arguments>
                <after>grand_total</after>
            </action>
        </reference>
    </add_order_grid_column_handle>
    <!-- order grid action -->
    <adminhtml_sales_order_grid>
        <!-- apply the layout handle defined above -->
        <update handle="add_order_grid_column_handle" />
    </adminhtml_sales_order_grid>
    <!-- order grid view action -->
    <adminhtml_sales_order_index>
        <!-- apply the layout handle defined above -->
        <update handle="add_order_grid_column_handle" />
    </adminhtml_sales_order_index>
</layout>

এখন আমাদের দুটি ব্লক ফাইলের প্রয়োজন, একটি ফিল্টার অপশন তৈরি করতে, / অ্যাপ্লিকেশন / কোড / কম্যুনিটি / উদাহরণস্বরূপ / সেলস গ্রিড / ব্লক / উইজেট / গ্রিড / কলাম / কাস্টমারের / গ্রুপ.এফপি:

<?php

class Example_SalesGrid_Block_Widget_Grid_Column_Customer_Group extends Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Select  {

    protected $_options = false;

    protected function _getOptions(){

        if(!$this->_options) {
            $methods = array();
            $methods[] = array(
                'value' =>  '',
                'label' =>  ''
            );
            $methods[] = array(
                'value' =>  '0',
                'label' =>  'Guest'
            );

            $groups = Mage::getResourceModel('customer/group_collection')
                ->addFieldToFilter('customer_group_id', array('gt' => 0))
                ->load()
                ->toOptionArray();

            $this->_options = array_merge($methods,$groups);
        }
        return $this->_options;
    }
}

এবং দ্বিতীয়টি প্রদর্শিত হবে এমন সঠিক পাঠ্যে সারি মানগুলিকে অনুবাদ করার জন্য, / app / code / commune / Example / SalesGrid / Block / Widget / Grid / Column / Renderer / Customer / Group.php :

<?php

class Example_SalesGrid_Block_Widget_Grid_Column_Renderer_Customer_Group extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract   {

    protected $_options = false;

    protected function _getOptions(){

        if(!$this->_options) {
            $methods = array();
            $methods[0] = 'Guest';

            $groups = Mage::getResourceModel('customer/group_collection')
                ->addFieldToFilter('customer_group_id', array('gt' => 0))
                ->load()
                ->toOptionHash();
            $this->_options = array_merge($methods,$groups);
        }
        return $this->_options;
    }

    public function render(Varien_Object $row){
        $value = $this->_getValue($row);
        $options = $this->_getOptions();
        return isset($options[$value]) ? $options[$value] : $value;
    }
}

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

<?php
/**
 * Event observer model
 *
 *
 */
class Example_SalesGrid_Model_Observer {

    public function addColumnToResource(Varien_Event_Observer $observer) {
        // Only needed if you use a table other than sales/order (sales_flat_order)

        //$resource = $observer->getEvent()->getResource();
        //$resource->addVirtualGridColumn(
        //  'payment_method',
        //  'sales/order_payment',
        //  array('entity_id' => 'parent_id'),
        //  'method'
        //);
    }
}

এই কোডটি http://www.ecomdev.org/2010/07/27/adding-order-attribute-to-orders-grid-in-magento-1-4-1.html এর উদাহরণের ভিত্তিতে তৈরি

আশা করি উপরের উদাহরণটি আপনার সমস্যার সমাধান করে।


দুঃখিত আমি ভ্রমণের সময় এটি পরীক্ষা করতে সক্ষম হইনি ... আমার পদ্ধতির বিষয়টি কিছুটা জটিল বলে মনে হচ্ছে (এটি কী নতুন আদেশের জন্যও কাজ করে?)
ফ্রে

গ্রিড পর্যবেক্ষক প্রতিটি পরিবর্তনের সময়ে ডেটা পরিবর্তনগুলি পরিচালনা করে, কারণ এটি নেটিভ ম্যাজেন্টো ব্যবহারের জন্য আপনাকে অন্য টেবিলের সাথে কোনও যোগ দেওয়ার দরকার নেই, এই কোয়েরিটি বৃহত পরিমাণে অর্ডারগুলিতে করা হয় (সমস্ত ডেটা বিক্রয়_ফ্ল্যাট_র্ডার_গ্রিডে সংরক্ষিত থাকে)।
ভ্লাদিমির কেরখফ

যখন আমি এটি চেষ্টা করি এবং ব্যবহার করি ত্রুটিটি পেয়েছি সতর্কতা: ভারিয়ান_ডিবি_এডাপ্টার_পডো_মাইএসকিএল এর জন্য আর্গুমেন্ট 2 হারিয়েছে: উদ্ধৃতিতে ()
বৈশাল প্যাটেল

4

এগুলি ব্যবহার করার চেষ্টা করুন:

public function salesOrderGridCollectionLoadBefore($observer)
{
    /**
     * @var $select Varien_DB_Select
     */
    $collection = $observer->getOrderGridCollection();
    $collection->addFilterToMap('store_id', 'main_table.store_id');
    $select     = $collection->getSelect();
    $select->joinLeft(array('oe' => $collection->getTable('sales/order')), 'oe.entity_id=main_table.entity_id', array('oe.customer_group_id'));
    if ($where = $select->getPart('where')) {
        foreach ($where as $key=> $condition) {
            if (strpos($condition, 'store_id')) {
                $value       = explode('=', trim($condition, ')'));
                $value       = trim($value[1], "' ");
                $where[$key] = "(main_table.store_id = '$value')";
            }
        }
        $select->setPart('where', $where);
    }
}

1
ওপি'র পর্যবেক্ষক পদ্ধতির উত্তর হিসাবে এটি সত্যই গ্রহণ করা উচিত ছিল।
সঙ্গীতলিফ্সমে

2

আপনার পদ্ধতিতে salesOrderGridCollectionLoadBeforeকি নিম্নলিখিত কোডটির সত্যই দরকার $collection->addFilterToMap('store_id', 'main_table.store_id');? এটি অপসারণ না করে এবং নিম্নলিখিত চেষ্টা করুন:

protected function _addColumnToGrid($grid)
{
....... // here you code from your post above

    $storeIdColumn = $grid->getColumn('store_id');

    if($storeIdColumn) {
        $storeIdColumn->addData(array('filter_index' => 'main_table.store_id'));
    }
}

ইতিমধ্যে উভয় চেষ্টা :( Column('store_id');উপলব্ধ নয় core_block_abstract_prepare_layout_before (_prepareColumn () পরে তাই কলাম যে সময়ে কোন অস্তিত্ব নেই বলা হয়) addFilterToMapকরছেন না হয় কাজ
Fra

অ্যাডফিল্টারটোম্যাপ কাজ করছে না এমন কোনও ধারণা?
ফ্রে

সূরির শেষ দিনগুলিতে একবার দেখার জন্য আমার খুব বেশি সময় ছিল না। হয়তো আগামীকাল. শুধু একটি ধারণা, কারণ আমি অ্যাডফিলারটোম্যাপ ব্যবহার না করার কারণটি একটু কারণ মনে করেছি, আপনি কীভাবে ভুল ব্যবহার করতে পারেন, প্যারামিটারগুলি ভুল হয় বা ভাল মুহুর্তে ব্যবহৃত হয় না। এটি কেবল মনে রাখা থেকে ধারণা।
সিলভাইন রায়é

2

স্থির কলামের নাম ব্যবহার না করে আপনি সমস্ত কলামের জন্য নীচের পদ্ধতিটি ব্যবহার করতে পারেন। আমি বুঝতে পারি যদি ম্যাজইউজের উত্তরটি ব্যবহার করে যা একটি কলামের জন্য কাজ করবে এবং আপনি যদি অন্য কোনও কলামের জন্য যান তবে আপনিও একই ত্রুটি পেয়ে যাচ্ছেন। সুতরাং নীচের কোডটি আপনাকে একই সাথে সমস্ত কলামের সমাধান দেয়।

public function salesOrderGridCollectionLoadBefore(Varien_Event_Observer $observer)
{
    $collection = $observer->getOrderGridCollection();
    $select = $collection->getSelect();
    $select->joinLeft(array('order' => $collection->getTable('sales/order')), 'order.entity_id=main_table.entity_id',array('shipping_arrival_date' => 'shipping_arrival_date'));

    if ($where = $select->getPart('where')) {
        foreach ($where as $key=> $condition) {
            $parsedString = $this->get_string_between($condition, '`', '`');
    $yes = $this->checkFiledExistInTable('order_grid',$parsedString);
    if($yes){
        $condition = str_replace('`','',$condition);
        $where[$key] = str_replace($parsedString,"main_table.".$parsedString,$condition);
    }
        }
        $select->setPart('where', $where);
    }
}

 public function checkFiledExistInTable($entity=null,$parsedString=null){
   $resource = Mage::getSingleton('core/resource');
   $readConnection = $resource->getConnection('core_read');

    if($entity == 'order'){
       $table = 'sales/order';
    }elseif($entity == 'order_grid'){
        $table = 'sales/order_grid';
    }else{
        return false;
    }

     $tableName = $resource->getTableName($table);
    $saleField = $readConnection->describeTable($tableName);

    if (array_key_exists($parsedString,$saleField)){
       return true;
   }else{
      return false;
   }
 }

function get_string_between($string, $start, $end){
    $string = ' ' . $string;
    $ini = strpos($string, $start);
    if ($ini == 0) return '';
    $ini += strlen($start);
    $len = strpos($string, $end, $ini) - $ini;
    return substr($string, $ini, $len);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.