Bir ızgaraya Sütun Ekle (gözlemci) - Yan tümcenin belirsiz bir konu olduğu 'store_id' sütunu


16

Gözlemci yaklaşımını kullanarak sipariş kılavuzuna bir sütun ekliyorum:

  1. Etkinlikte -> sales_order_grid_collection_load_beforeKoleksiyona birleştirme ekliyorum
  2. Olayda -> core_block_abstract_prepare_layout_beforeIzgaraya bir sütun ekliyorum

DÜZENLE Daha Fazla Bilgi:

Etkinlikte (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'));

}

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

Izgarayı mağaza görünümü filtresiyle filtreleyene kadar her şey iyi çalışıyor: Maddenin belirsiz bir konu olduğu 'store_id' sütunu

Sorguyu yazdırdım:

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

Durumda gördüğünüz gibi store_idbayan main_tabletakma adı.

Sadece ayarlamanız gerekir Bunu gerçekleştirmek için filter_indexmağaza Kimliği sütun için ancak gözlemci aracılığıyla soru Bunu yapabilen nasıl Yani anında ?
Blok sınıfını geçersiz kılmadan ? (aksi takdirde gözlemci yaklaşımı işe yaramaz)

Yanıtlar:


33

Bunu size daha önce bahsettiğim diğer çözümlerle tekrar deneyelim :-), alanı ızgara tablosuna nasıl ekleyeceğinizi göstermek için tam uzantıyı oluşturdum. Bundan sonra, sipariş kılavuzu sayfasına sütun eklemek için yalnızca bir düzen güncelleme dosyasına ihtiyacınız vardır.

Extension_SalesGrid uzantısını aradım, ancak kendi ihtiyaçlarınıza göre değiştirebilirsiniz.

/App/etc/modules/Example_SalesGrid.xml içinde init xml modülünü oluşturarak başlayalım :

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

Sonra /app/code/community/Example/SalesGrid/etc/config.xml dosyasında xml modül yapılandırmasını oluşturuyoruz :

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

Şimdi /app/code/community/Example/SalesGrid/sql/example_salesgrid_setup/install-0.1.0.php dosyasında sql yükseltme komut dosyasını oluşturuyoruz :

<?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();

Sonra /app/design/adminhtml/default/default/layout/example/salesgrid.xml dosyasında düzen güncelleme dosyasını oluşturuyoruz:

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

Şimdi iki Blok dosyasına ihtiyacımız var, biri filtre seçeneklerini oluşturmak için, /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;
    }
}

Ve ikincisi, satır değerlerini görüntülenecek doğru metne çevirmek için /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;
    }
}

Gereken son dosya yalnızca satış / sipariş (sales_flat_order) dışında bir tablodan fazladan bir sütun oluşturursanız gerekir. Sales / order_grid öğesindeki satış / sipariş sütun adıyla eşleşen tüm alanlar otomatik olarak sales / order_grid tablosunda güncellenir. Örneğin ödeme seçeneğini eklemeniz gerekirse, verilerin doğru tabloya kopyalanabilmesi için alanı sorguya eklemek için bu gözlemciye ihtiyacınız olacaktır. Bunun için kullanılan gözlemci /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'
        //);
    }
}

Bu kod http://www.ecomdev.org/2010/07/27/adding-order-attribute-to-orders-grid-in-magento-1-4-1.html adresindeki örneğe dayanmaktadır.

Umarım yukarıdaki örnek sorununuzu çözer.


Üzgünüm, seyahat ederken test edemedim ... Yaklaşımımdan biraz daha karmaşık geliyor (yeni sipariş için de çalışıyor mu?)
Fra

Izgara gözlemcisi, her değişiklikteki veri değişikliklerini yönetir, çünkü bu, diğer tablolara herhangi bir bağlantı oluşturmanız gerekmeyen yerel Magento kullanımıdır, bu da sorguyu büyük miktarlardaki siparişlerde hızlandırır (tüm veriler sales_flat_order_grid'de depolanır).
Vladimir Kerkhoff

Ben denemek ve bu kullandığınızda hata olsun Uyarı: Varien_Db_Adapter_Pdo_Mysql :: quoteInto () için argüman 2 Eksik
Vaishal Patel

4

Bunları kullanmaya çalışın:

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
Bu gerçekten OP'nin gözlemci yaklaşımının cevabı olarak kabul edilmiş olmalıydı.
musicliftsme

2

Yönteminizde salesOrderGridCollectionLoadBeforeaşağıdaki koda gerçekten ihtiyacınız var $collection->addFilterToMap('store_id', 'main_table.store_id');mı? Değilse çıkarın ve aşağıdakileri deneyin:

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

Zaten her ikisi de denendi :( Column('store_id');üzerinde mevcut değil core_block_abstract_prepare_layout_before (_prepareColumn () çağrıldıktan sonra sütun şu anda mevcut değil) addFilterToMapiş yapmıyor
Fra

addFilterToMap neden çalışmıyor herhangi bir fikir?
Fra

Soory Bu son günlere bakmak için fazla vaktim yoktu. Belki yarın. Sadece bir fikir, çünkü addFilterToMap kullanmamanın nedenini biraz hatırladığım için, belki yanlış kullandığınız, parametrelerin yanlış olduğu veya iyi bir zamanda kullanılmadığıdır. Sadece hatırlamalardan gelen fikirler.
Sylvain Rayé

2

Statik sütun adını kullanmak yerine, tüm sütun için aşağıdaki yöntemi kullanabilirsiniz. Bir sütun için işe yarayacak mageUz cevap kullanın ve başka bir sütun için giderseniz o zaman aynı hatayı alıyorum anlayabiliyorum. Bu nedenle aşağıdaki kod, tüm sütunlar için aynı anda size çözüm sağlar.

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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.