Versuchen wir es noch einmal mit einer anderen Lösung, die ich bereits erwähnt habe :-), ich habe die vollständige Erweiterung erstellt, um Ihnen zu zeigen, wie Sie das Feld zur Rastertabelle hinzufügen können. Danach benötigen Sie nur noch eine Layoutaktualisierungsdatei, um die Spalte zu Ihrer Bestellgitterseite hinzuzufügen.
Ich habe die Erweiterung Example_SalesGrid aufgerufen, aber Sie können sie an Ihre eigenen Bedürfnisse anpassen.
Beginnen wir damit, das Modul init xml in /app/etc/modules/Example_SalesGrid.xml zu erstellen :
<?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>
Als nächstes erstellen wir unser Modul config xml in /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>
Jetzt erstellen wir das SQL-Upgrade-Skript in /app/code/community/Example/SalesGrid/sql/example_salesgrid_setup/install-0.1.0.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();
Als Nächstes erstellen wir die Layout-Aktualisierungsdatei in /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>
Jetzt benötigen wir zwei Blockdateien , eine zum Erstellen der Filteroptionen: /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;
}
}
Und der zweite, der die Zeilenwerte in den korrekten Text übersetzt, der angezeigt wird :
<?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;
}
}
Die zuletzt benötigte Datei wird nur benötigt, wenn Sie eine zusätzliche Spalte aus einer anderen Tabelle als sales / order (sales_flat_order) erstellen. Alle Felder in sales / order_grid, die dem Spaltennamen aus sales / order entsprechen, werden in der Tabelle sales / order_grid automatisch aktualisiert. Wenn Sie beispielsweise die Zahlungsoption hinzufügen müssen, muss dieser Beobachter das Feld zur Abfrage hinzufügen, damit die Daten in die richtige Tabelle kopiert werden können. Der hierfür verwendete Beobachter befindet sich in /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'
//);
}
}
Dieser Code basiert auf dem Beispiel von http://www.ecomdev.org/2010/07/27/adding-order-attribute-to-orders-grid-in-magento-1-4-1.html
Hoffe das obige Beispiel löst dein Problem.
Versuchen Sie, diese zu verwenden:
quelle
Benötigen Sie in Ihrer Methode wirklich
salesOrderGridCollectionLoadBefore
den folgenden Code$collection->addFilterToMap('store_id', 'main_table.store_id');
? Wenn nicht, entfernen Sie es und versuchen Sie Folgendes:quelle
Column('store_id');
ist nicht verfügbar aufcore_block_abstract_prepare_layout_before
(_prepareColumn () wird aufgerufen, daher ist die Spalte zu diesem Zeitpunkt nicht vorhanden)addFilterToMap
nicht erledigt ist JobAnstelle des statischen Spaltennamens können Sie die folgende Methode für alle Spalten verwenden. Ich kann verstehen, wenn Sie die Antwort von mageUz verwenden, die für eine Spalte funktioniert, und wenn Sie sich für eine andere Spalte entscheiden, wird möglicherweise derselbe Fehler angezeigt. Der folgende Code gibt Ihnen die Lösung für alle Spalten gleichzeitig.
quelle