再摸shopnc——修改运费模板

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,否则,用区县ID
city_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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值