ECStore二次开发日记之5.高级 后台商品管理增加折扣虚拟字段并可以根据虚拟字段筛选折扣数据

商品管理的同仁希望能够根据市场价与销售价自动算出折扣,并且按照折扣来查询商品,方便做活动的时候挑选商品。

一听这个需求,感觉好复杂呀,难道要修改数据库?

好吧,其实不用,请出我们的猪脚吧:虚拟字段。

ECStore,ShopEX4.85系列的都是有虚拟字段这个概念,虚拟字段指的是没有在数据库中定义的字段。

那么我们怎么解决这个需求呢?

思路是:

  1. 先设定虚拟字段,然后显示折扣
  2. 根据虚拟字段查询折扣值

请先打开app > b2c > lib > finder > goods.php这个文件,然后在

    function __construct($app){
        $this->app = $app;
    }

这个方法下面增加下面代码,其中FilterDiscount就是我们为这个需求定义的字段名,请遵照规范自己取一个吧。

    function __construct($app){
        $this->app = $app;
    }

    // 2015.08.07 ChinaBUG 需要增加一栏折扣,用以筛选。
    var $column_FilterDiscount = '折扣';
    var $column_FilterDiscount_order = COLUMN_IN_HEAD;
    var $column_FilterDiscount_width = 100;
    function column_FilterDiscount($row){
        return '<span style="color:red;font-weight: bold;">'.(round( $row[‘price’]/$row[‘mktprice’] ,2 )*10) . '</span> 折';
    }    
    //

这个代码的功能就是增加一个字段,字段名为FilterDiscount,请按照前缀为“$column_字段名”来构造虚拟字段的属性,如上面的顺序是,虚拟字段的显示名,排序,宽度。他的数据来源请用“function column_字段名($row)”来定义方法,其中$row参数是系统自动获取符合的数据列。

上面的方法定义一个虚拟字段,前台显示折扣,显示的内容是输出红色的xx折。具体请看下面的图片吧。

漂亮吧^_^

现在我们再来弄快速筛选区的功能。

打开app > b2c > model >goods.php文件,找到

function searchOptions(){
……
}

方法,然后在里面找到

'keyword'=>app::get('b2c')->_('商品关键字'),

在下面增加如下代码:

        $arr = array_merge($arr,array(
                'bn'=>app::get('b2c')->_('货号'),
                'keyword'=>app::get('b2c')->_('商品关键字'),
                /* 2015.08.07 ChinaBUG 需要增加一栏折扣,用以筛选。 */
                'FilterDiscount' => '折扣筛选',
               // 'barcode'=>app::get('b2c')->_('条码'),
            ));

然后刷新一下,就会发现,在快速筛选框内会出现“折扣筛选”的选项了。

就这么简单?!可以搜索了?

是这么简单,但是还不能搜索,我们还需要作进一步的修改,但是!请放心,真的很简单~~

我们再来找一下_filter()方法,然后在方法内写下面代码:

function _filter($filter, $tbase = '', $baseWhere = NULL){
        /* 2015.08.10 ChinaBUG 需要增加一栏折扣,用以筛选。 */
        if( isset( $filter[‘FilterDiscount’] ) && $filter[‘FilterDiscount’]>0 ){
            if( stristr($filter[‘FilterDiscount’],',')===false ){
                $filter[‘filter_sql’] = ‘((price / mktprice) *10) < ' . $filter['FilterDiscount'];
            }else{
                $FilterDiscount = explode(',',$filter[‘FilterDiscount’]);
                $filter[‘filter_sql’] = ‘((price / mktprice) *10) BETWEEN ‘ . $FilterDiscount[0] . ‘ AND ‘ . $FilterDiscount[1];
            }            
            unset( $filter[‘FilterDiscount’] );
        }
        
        foreach(kernel::servicelist('b2c_mdl_goods.filter') as $k=>$obj_filter){
             ……

}

保存,然后运行吧。

现在是真的可以运行了。

输入 5 则搜索 5 折以下的商品,如果输入 5,5.5 的话则查询 5-5.5 折之间的商品。是不是很简单呢?

还不去赶紧试试看?!