再摸shopnc——修改运费模板

来源:互联网 发布:网络理财88财富 编辑:程序博客网 时间:2024/04/30 06:38

1.问题
发布商品时,选择的运费模板只能到市,而不能精确到区县,又且,只做陕西。所以需求就又来了。

这里写图片描述

通过源码查到模板页面/templates/default/member/transport.add.php,不过没有什么用,line 95引入了另一模板页,require(template(‘member/transport_area_’.(strtolower(CHARSET)==’utf-8’?’utf-8’:’gbk’)));即在选择区域列表项有两个不同编码文件,分别是transport_area_utf-8.php和transport_area_gbk.php。先改一个便好。

首先,要有区县的数据,区县数据怕搜到的缺怎么办,只好去淘宝模板那里一组组里弄出来。
现在开始在模板中加区县的显示,用的<select>(淘宝页面本来也就是select,比较方便)但未果,因为多选比较难调,而且还得处理较多的JS,实在对JS没有过兴趣。那么,就继续用市的样式开始。也好操作,最后区分哪些是真的市,哪些是区县就好。

2.精确
选定之后,除了【运送到】区域的显示,还有和数据库关联(用户提交订单的时候,才会取到地区邮费),这时,暴力解:看到宝鸡的values是440,直接全局搜,出来好多文件,一番排查下来,锁定几个文件:

  • transport.php line278 数组,形如 440=>27 ①
  • area.php 更为庞大的数组 ,下面说 ②
  • area_array.js 重要,这里应该是运送会用到的信息,很全,地域,市为key,下级为values,可以使用,早知就不用去淘宝页面复制了

现在添加数据到上面两个文件,数据源在ID.txt,帖一部分:
这里写图片描述

3.解决
数据有了,写个脚本生成吧,无奈Python才刚学,C&C++又好久没用,还是用PHP写吧

针对文件①脚本,形如440=>27,

<?php     //440=>27,    header("Content-type: text/html; charset=utf-8");     $file=fopen("ID.txt",'r') or die ("error!");    $str=fread($file,filesize("ID.txt"));    if(strlen($str)%2 != 0)        exit();    //$lab=False;    $str_arr=array();    for($i=0,$j=0;$i<strlen($str);$i++){        if($str[$i]=="'") {            $i++;            $str_arr[$j]=substr($str,$i,4);            $j++;        }    }    $str="";    for($i=0;$i<count($str_arr);$i+=4){  //跨度为4是因为 单引号隔4个取组后四位。这是得要多信任数据啊=-=        //echo $str_arr[$i].'<br/>';        $str.=$str_arr[$i]."=>27,";    }    echo $str;    //print_r($str_arr);    fclose($file);?>

效果如这里写图片描述….
最后多出的一个逗号都不用取了,效果刚好。
针对文件②脚本,形如 440 => array ( ‘area_name’ => ‘宝鸡’, ‘area_parent_id’ => ‘27’, ),

<?php     //440 => array ( 'area_name' => '宝鸡', 'area_parent_id' => '27', ),     header("Content-type: text/html; charset=utf-8");     $file=fopen("ID.txt",'r') or die ("error!");    $str=fread($file,filesize("ID.txt"));    if(strlen($str)%2 != 0)        exit();    $lab=False;    $str_arr=array();    //稍作改动,只取单引号内内容,这其实是第一次想实现的=-=    for($i=0,$j=0;$i<strlen($str);$i++){        if((!$lab) && $str[$i]=="'") {            $i++;            $str_arr[$j]='';            $lab=True;        }else if($lab && $str[$i]=="'"){            $lab=False;            $j++;        }        if ($lab){            $str_arr[$j].=$str[$i];        }           }    $str="";    for($i=0,$j=1;$i<count($str_arr);$i+=2,$j+=2){  //跨度2是因为前面ID($i),后面地区($j)        //echo $str_arr[$i].'--'.$str_arr[$j].'<br/>';        $str.=$str_arr[$i]."=> array ( 'area_name' => '$str_arr[$j]', 'area_parent_id' => '27', ),";        echo $str_arr[$i]."=> array ( 'area_name' => '$str_arr[$j]', 'area_parent_id' => '27', ),<br/>";    }    //echo $str;    //print_r($str_arr);    fclose($file);?>

另,发现JS中有区域选择相关代码操作,不去动它。理由,前面有。
然后检查了下数据库,运费模板有添加的区县值。
现在,开始改订单这块,查多次后,决定修改templates/default/home/cart_shipping.php

city_id="$val['city_id']"; //原数据//改动:$cityToArea=array(438,439,440,441,442,443,444,445,446,447);//数组存储陕西省份,然后判断,不是陕西的省就用原数据,即市的ID,否则,用区县IDcity_id="<?php       if(!in_array($val['city_id'],$cityToArea))  echo $val['city_id'];      else{         echo $val['area_id'];       }      ?>"

已经好了,添加的几个测试数据都行,但是(我哥哥告诉我,”但是”前面的都是废话 ——权力的游戏)还有一个小问题,就是把transport_area_gbk.php和transport_area_utf-8.php数据添加完整,继续用前面写的脚本生成所需数据:

形如  市区*3<br/>区*3<br/>...<hr/>市//不管区隔几个换行和hr了,直接输出区就好了。...<?php     /*        <span class="areas">          <input type="checkbox" class="J_City" id="J_City_4669" value="4669"/>          <label for="J_City_4669">新城区</label>        </span>    */    header("Content-type: text/html; charset=utf-8");     $file=fopen("ID.txt",'r') or die ("error!");    $str=fread($file,filesize("ID.txt"));    if(strlen($str)%2 != 0)        exit();    $lab=False;    $str_arr=array();    //稍作改动,只取单引号内内容,这其实是第一次想实现的=-=    for($i=0,$j=0;$i<strlen($str);$i++){        if((!$lab) && $str[$i]=="'") {            $i++;            $str_arr[$j]='';            $lab=True;        }else if($lab && $str[$i]=="'"){            $lab=False;            $j++;        }        if ($lab)            $str_arr[$j].=$str[$i];         }    $str="";    for($i=0,$j=1,$k=1;$i<count($str_arr);$i+=2,$j+=2,$k++){  //$k为<br/>位,最后弃用        $str.='<span class="areas">              <input type="checkbox" class="J_City" id="J_City_'.$str_arr[$i].'" value="'.$str_arr[$i].'"/>              <label for="J_City_'.$str_arr[$i].'">'.$str_arr[$j].'</label>            </span>';        //if($k%6==0) $str.= '<br />';    }    echo $str;    fclose($file);?>

运行结果是:
这里写图片描述
但不是要取这些,取页面html源码即可。

最后,稍作改动就好了。(其实,并不是,还有用JS检测全选,取消等),稍微写了下完成了。
最终效果:
这里写图片描述

注:
1. 谢绝转载
2. 程序不要用,都是根据需要特写的
3. 程序员节快到了,预祝各位monkey节日快乐。是不是该玩个hackthon,但没人会要我=-=

0 0