我们都知道Magento的网格很棒,是有效显示数据的不二选择。 我们的客户在选择Magento后有时(基本是经常)会有些特殊的需求。其中有人提出通过订单ID来过滤订单网格。 当你有大批订单要跟踪的时候就显得很有用了。一个一个筛选是个繁琐而又耗时的任务。 我要告诉你的诀窍可以处理几乎所有的网格,只要你知道它是如何做的。 首先,重写你的订单网格块(app\code\core\Mage\Adminhtml\Block\Sales\Order\Grid.php)——我想你知道怎么做。 在你的 _prepareColumns() 方法里,向数组里添加一个元素,如下: protected function _prepareColumns() { $this->addColumn('real_order_id', array( 'header'=> Mage::helper('sales')->__('Order #'), 'width' => '250px', 'type' => 'text', 'index' => 'increment_id', 'filter_condition_callback' => array($this, 'spaceSeparatedFilter')//calling spaceSeparatedFilter method )); .... } 在我们网格中一行被渲染时,渲染器被调用。通过cell被渲染成一个字段。过滤器回调,另一方面,调用整个列和集合作为字段。结果是,我们可以创建自己的方法,调用变量filter_condition_callback元素,向数据库执行自定义查询语句,获取我们网格中的输入框等等…… 这正是我们要做的…… 我们的过滤器回调将调用spaceSeparatedFilter()方法并把real_order_id列作为一个参数。让我们声明我们的方法(在Grid.php文件中): protected function spaceSeparatedFilter($collection, $column) { if (!$value = $column->getFilter()->getValue()) { return $this; } //if there was a space input else if(preg_match('/\s+/', $value)) { //explode by space, getting array of IDs $val = explode(" ", $value); //filter the collection, where collection index (order_id) is present in $val array $this->getCollection()->addAttributeToFilter($column->getData('index'), array('in'=>$val)); } else { //else use default grid filter functionality (like $value input) $this->getCollection()->addAttributeToFilter($column->getData('index'), array('like' => '%'.$value.'%')); } return $this; } 这两段代码可以让你通过多个订单ID来过滤订单,只要你用空间将他们分开。如果你没有进入一个空间,那么会按默认的工作。 你也可以使用网格的所有功能:排序,筛选,导出。没有任何问题。 (责任编辑:好模板) |