स्तंभ को एक ग्रिड (पर्यवेक्षक) में जोड़ें - कॉलम 'store_id' जिसमें खंड अस्पष्ट मुद्दा है


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

जब तक मैं स्टोर व्यू फिल्टर के साथ ग्रिड को फ़िल्टर नहीं करता तब तक सब कुछ ठीक है: कॉलम 'store_id' जहां क्लॉज अस्पष्ट मुद्दा है

मैंने प्रश्न मुद्रित किया है:

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स्टोर आईडी कॉलम सेट करने की आवश्यकता है लेकिन पर्यवेक्षक के माध्यम से तो सवाल यह है कि मैं इसे मक्खी पर कैसे कर सकता हूं ?
ब्लॉक वर्ग को ओवरराइड किए बिना ? (अन्यथा पर्यवेक्षक का दृष्टिकोण बेकार है)

जवाबों:


33

आइए फिर से कोशिश करें कि मैंने आपके लिए पहले दिए गए अन्य समाधान पर :-), मैंने आपको ग्रिड टेबल में फ़ील्ड को जोड़ने का तरीका दिखाने के लिए पूर्ण एक्सटेंशन का निर्माण किया है। उसके बाद आपको केवल ग्रिड पेज को ऑर्डर करने के लिए कॉलम को जोड़ने के लिए एक लेआउट अपडेट फ़ाइल की आवश्यकता होती है।

मैंने विस्तारा example_SalesGrid को कॉल किया, लेकिन आप इसे अपनी आवश्यकताओं में बदल सकते हैं।

आइए / in/ etc / modules / Example_SalesGrid.x/ : में मॉड्यूल 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>

इसके बाद हम अपना मॉड्यूल config xml /app/code/community/Example/SalesGrid/etc/config.xml में बनाते हैं :

<?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>

अब हम /app/code/community/Example/SalesGrid/sql/example_salesgrid_setup/install-0.1.0.php में sql नवीनीकरण स्क्रिप्ट बनाते हैं :

<?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>

अब हमें दो ब्लॉक फाइल चाहिए, एक फ़िल्टर विकल्प बनाने के लिए, /app/code/community/Example/SalesGrid/Block/Widget/Grid/Column/Customer/Group.php:

<?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/community/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;
    }
}

अंतिम फ़ाइल की जरूरत केवल तभी होती है जब आप बिक्री / ऑर्डर (sales_flat_order) के अलावा किसी अन्य तालिका से एक अतिरिक्त कॉलम बनाते हैं। विक्रय / ऑर्डर_ग्रिड में बिक्री / ऑर्डर से कॉलम नाम से मेल खाने वाले सभी फ़ील्ड स्वचालित रूप से बिक्री / ऑर्डर_ग्रिड तालिका में अपडेट किए जाते हैं। यदि आपको उदाहरण के लिए भुगतान विकल्प जोड़ने की आवश्यकता है, तो आपको इस पर्यवेक्षक को क्वेरी में फ़ील्ड जोड़ने की आवश्यकता होगी ताकि डेटा को सही तालिका में कॉपी किया जा सके। इसके लिए इस्तेमाल किया गया पर्यवेक्षक /app/code/community/Example/SalesGrid/Model/Observer.php में है :

<?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 से उदाहरण पर आधारित है

आशा है कि ऊपर दिए गए उदाहरण से आपकी समस्या हल हो जाएगी।


खेद है कि मैं इसका परीक्षण नहीं कर पाया क्योंकि मैं यात्रा कर रहा था ... यह थोड़ा अधिक जटिल लगता है कि मेरा दृष्टिकोण (क्या यह नए आदेश के लिए भी काम करता है?)
Fra

ग्रिड ऑब्जर्वर हर परिवर्तन पर डेटा परिवर्तनों को संभालता है, क्योंकि यह देशी मैगनेटो उपयोग है जिसे आपको अन्य तालिकाओं में किसी भी जुड़ाव को बनाने की आवश्यकता नहीं है, यह बड़ी मात्रा में आदेशों पर क्वेरी को गति देता है (सभी डेटा sales_flat_order_grid में संग्रहीत है)।
व्लादिमीर केर्खॉफ

जब मैं कोशिश करते हैं और इस का उपयोग मैं त्रुटि मिलती है चेतावनी: Varien_Db_Adapter_Pdo_Mysql :: quoteInto () के लिए तर्क 2 लापता
Vaishal पटेल

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
यह वास्तव में ओपी के पर्यवेक्षक दृष्टिकोण के जवाब के रूप में स्वीकार किया जाना चाहिए था।
16:14 पर संगीत

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

किसी भी विचार क्यों addFilterToMap काम नहीं कर रहा है?
फ्रा

पिछले दिनों इस पर एक नज़र डालने के लिए मेरे पास बहुत अधिक समय नहीं था। शायद कल। बस एक विचार है, क्योंकि मुझे इस बात का थोड़ा-सा कारण याद है कि मैंने AddFilterToMap का उपयोग न करने के कारण बताया कि आप कैसे गलत का उपयोग करते हैं, पैरामीटर गलत हैं या अच्छे क्षण में उपयोग नहीं किया जाता है। यह सिर्फ याद रखने वाले विचार हैं।
सिल्वेन रेए

2

स्टैटिक कॉलम नाम का उपयोग करने के बजाय आप सभी कॉलम के लिए नीचे विधि का उपयोग कर सकते हैं। मैं यह समझ सकता हूं कि यदि mageUz के उत्तर का उपयोग करें जो एक कॉलम के लिए काम करेगा और यदि आप किसी अन्य कॉलम के लिए जाते हैं तो आपको एक ही त्रुटि प्राप्त हो सकती है। इसलिए नीचे दिया गया कोड आपको एक साथ सभी कॉलम का समाधान देता है।

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