Magento 1.9:为客户管理网格添加IP地址并实现导出
解决Magento客户管理网格添加IP地址并导出的问题
要实现导出客户网格时包含客户IP地址,我们需要修改客户网格的集合加载逻辑,关联日志表获取IP,再添加对应的列。下面是具体步骤:
1. 修改_prepareCollection方法,关联日志表获取IP地址
客户的登录IP存储在log_visitor表中,而customer_log表关联了客户ID和访客ID,所以我们需要通过这两个表的关联来获取每个客户最后一次登录的IP。
替换你的_prepareCollection方法为以下代码:
protected function _prepareCollection() { $collection = Mage::getResourceModel('customer/customer_collection') ->addNameToSelect() ->addAttributeToSelect('email') ->addAttributeToSelect('created_at') ->addAttributeToSelect('group_id') ->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left') ->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left') ->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left') ->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left') ->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left'); // 关联customer_log和log_visitor表获取最后登录IP $collection->getSelect() ->joinLeft( ['cl' => $collection->getTable('customer/log')], 'cl.customer_id = e.entity_id', [] ) ->joinLeft( ['lv' => $collection->getTable('log/visitor')], 'lv.visitor_id = cl.visitor_id', ['remote_addr' => 'lv.remote_addr'] ) ->group('e.entity_id') // 确保每个客户只显示一条记录 ->order('cl.logged_at DESC'); // 取最后一次登录的IP $this->setCollection($collection); return parent::_prepareCollection(); }
2. 在_prepareColumns方法中添加IP地址列
接下来需要在网格中显示IP地址列,这样导出的时候也会包含这个字段:
找到你的网格类中的_prepareColumns方法,添加以下代码:
$this->addColumn('remote_addr', array( 'header' => Mage::helper('customer')->__('IP Address'), 'index' => 'remote_addr', 'type' => 'text', 'width' => '150px', ));
3. 验证效果
完成以上修改后,刷新Magento缓存,进入后台客户管理页面:
- 网格末尾会新增「IP Address」列,显示客户最后一次登录的IP
- 点击导出按钮(CSV/Excel格式),导出的文件中也会包含这个IP地址列
注意:如果客户从未登录过(仅注册未登录),IP地址会显示为空,这是正常的行为。
内容的提问来源于stack exchange,提问作者Wouter Stulp




