【问题标题】:How to add a column for example customer group id in Magento's Admin Order Grid如何在 Magento 管理订单网格中添加一列,例如客户组 ID
【发布时间】:2010-09-23 13:43:31
【问题描述】:

我想在管理员的订单网格中增加一列。假设其客户组 ID。

我的 app/etc/modules/MyProject_Adminhtml 看起来像:

<?xml version="1.0"?>

<config>
    <modules>
        <MyProject_Adminhtml>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Sales />
            </depends>
        </MyProject_Adminhtml>
    </modules>
</config>

我的 app/code/local/MyProject/Adminhtml/etc/config.xml 看起来像:

<?xml version="1.0"?>
<config>
    <modules>
        <MyProject_Adminhtml>
            <version>1.0.0</version>
        </MyProject_Adminhtml>    
    </modules>

    <global>
          <blocks>
            <adminhtml>
                <rewrite>
                    <sales_order_grid>MyProject_Adminhtml_Block_Sales_Order_Grid</sales_order_grid>
                </rewrite>
            </adminhtml>
        </blocks>

      </global>

  </config>

在 app/code/local/MyProject/Adminhtml/Block/Sales/Order/Grid.php 我已经覆盖了 Mage_Adminhtml_Block_Sales_Order_Grid

class MyProject_Adminhtml_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid
{

    protected function _prepareColumns()
    {
        .... unchanged code from Mage_Adminhtml_Block_Sales_Order_Grid::_prepareColumns ...

        $this->addColumn('customer_group_id', array(
            'header' => Mage::helper('sales')->__('Customer Group Id'),
            'index' => 'customer_group_id',
            'type'  => 'text',
        ));

         .... unchanged code from Mage_Adminhtml_Block_Sales_Order_Grid::_prepareColumns ...
    }
}

有什么我错过的,因为我在订单网格中看不到任何东西。我正在使用 Magento 1.4.1.1

在 Anda B 的评论中,我写了以下一行:

var_dump($this->getLayout()->createBlock('MyProject_Adminhtml_Block_Sales_Order_Grid'));

在 app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php 中

然后,我选择“创建新订单”并取消订单以查看 var_dump 的执行结果,我看到以下内容:

/var/www/magento/var/report/72990635: line 10: syntax error near unexpected token `}' /var/www/magento/var/report/72990635: line 10: `#9 {main}";s:3:"url";s:80:"/index.php/admin/sales_order_create/cancel/key/0624033594dd63d9e145fc538f4c6bbb/";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:5:"admin";}'

【问题讨论】:

  • 订单对象上是否存在该字段,还是需要添加?
  • 我之前没有寻找过,现在当我查看 app/code/core/Mage/Sales/Model/Order.php 时找不到它。但是我的看法是,如果数据库表 sales_flat_order 中存在一个字段,它就会出现在这里。它确实存在。

标签: magento e-commerce


【解决方案1】:

你快到了。

您需要为 GroupID 创建一个渲染器,因为核心中不存在该渲染器。

首先,像这样将渲染器添加到您的 addColumn 中:

$this->addColumn('customer_group_id', array(
        'header' => Mage::helper('sales')->__('Customer Group Id'),
        'index' => 'customer_group_id',
        'type'  => 'text',
        'renderer' => 'adminhtml/widget_grid_column_renderer_customergroup',
    ));

现在您需要创建目录 /app/code/local/MyProject/Adminhtml/Widget/Grid/Column/Renderer/ 因为它可能不存在。

现在创建一个包含此类的 Customergroup.php 文件:

class MyProject_Adminhtml_Block_Widget_Grid_Column_Renderer_Customergroup extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract

{

 private static $_customergroups = array();

 public static function getCustomerGroupsArray() {
     if(count(self::$_customergroups) == 0) {
         $customer_group = Mage::getModel('customer/group');
         $customer_groups = $customer_group->getCollection()->toOptionHash();
         self::$_customergroups = $customer_groups;
     }
     return self::$_customergroups;
 }

public function render(Varien_Object $row){
       $value = $this->_getValue($row);
       $customer_groups = self::getCustomerGroupsArray();
       return isset($customer_groups[$value]) ? $customer_groups[$value] : false;
    }
}

最后,您需要将其添加到 MyProject 中的 config.xml。把这个:

<widget_grid_column_renderer_customergroup>Myproject_Adminhtml_Block_Widget_Grid_Column_Renderer_Customergroup</widget_grid_column_renderer_customergroup>

就在你的另一个重写旁边。

刷新缓存后,您的销售订单网格中应该有您的组标签。

PS。

如果您想在销售订单网格的顶部添加过滤器以使用此列,请将其添加到渲染器之后的“addColumn”。 (顺序实际上并不重要)

'options' =&gt; TheReadyStore_Adminhtml_Block_Widget_Grid_Column_Renderer_Customergroup::getCustomerGroupsArray(),

并将类型从“文本”更改为“选项”

干杯 罗伊

【讨论】:

    【解决方案2】:

    在模块/等中,您有 Atzen_Adminhtml,但您的项目是 MyProject_Adminhtml。 除了这个问题,代码应该可以工作:即使销售表中没有 customer_group_id,新列也应该出现在网格中。

    【讨论】:

    • 实际上它是实际的文件名/命名空间。我在 SO 上发布时到处都替换了 Atzen。因此,请仅将其视为问题中的错字。
    • 好的,然后检查 magento 是否可以找到您的块:尝试添加控制器 var_dump($this->getLayout()->createBlock('MyProject_Adminhtml_Block_Sales_Order_Grid'))
    • 我尝试在 app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php 中执行此操作所以,当我取消订单时,我会看到以下内容:/var/www/ magento/var/report/72990635:第 10 行:意外标记附近的语法错误 }' /var/www/magento/var/report/72990635: line 10: #9 {main}";s:3:"url";s:80:"/index.php/admin/sales_order_create/cancel/ key/0624033594dd63d9e145fc538f4c6bbb/";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:5:"admin";}'
    • 在 Mage_Adminhtml_Sales_OrderController 中添加这个受保护的函数 _initAction() { var_dump($this->getLayout()->createBlock('MyProject_Adminhtml_Block_Sales_Order_Grid')); // 其余代码 } 并转到订单网格,如果结果为 false,则表示 magento 找不到您的模块
    • 我在网格之前看到很多文本输出,它以:object(MyProject_Adminhtml_Block_Sales_Order_Grid)#281 开头,我认为这意味着 Magento 确实找到了该类。对象转储开始于: { ["_columns":protected]=> array(0) { } ["_lastColumnId":protected]=> NULL ["_collection":protected]=> NULL ["_varNameLimit":protected]= > string(5) "limit" ["_varNamePage":protected]=> string(4) "page" ["_varNameSort":protected]=> string(4) "sort" ["_varNameDir":protected]=> string (3) "dir" ["_varNameFilter":protected]=> 字符串(6)
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多