SDT技术网公开库–图片的上传

之前发布过两个类库:参考这里。后来写了一个SMTP的,不过忘了发布也不知道放哪里了。昨晚工作的最后一个就是写了这个。上传图片到image/upload下并返回图片路径。

针对程序

opencart 1.5 – 2.3

类型

controller层

GIT地址

http://git.oschina.net/yfore_com/sdtclass

文件路径:sdtclass / opencart / upload / catalog / controller / sdtclass / upload_image.php

用法

触发button发起ajax:

  1. $.ajax({
  2.                     url: ‘index.php?route=sdtclass/upload_image’,
  3.                     type: ‘post’,
  4.                     dataType: ‘json’,
  5.                     data: new FormData($(‘#form-upload-image’)[0]),
  6.                     cache: false,
  7.                     contentType: false,
  8.                     processData: false,
  9.                     /* beforeSend / complete / success / error */
  10. });

返回数据

数据类型:json

参数介绍:

error:有则上传错误,包含错误信息

success:有则上传成功,包含成功提示语。

code:上传后的图片路径,可以写入value,

注:如写入img标签请注意带上 image/ 路径或者自定义的图片路径,由于考虑兼容二开所以返回里不带这个路径。

返回处理示例:

  1. /* beforeSend / complete / success / error */
  2. success: function(json) {
  3.     $(element).parent().find(‘.text-error’).remove();
  4.     if (json[‘error’]) {
  5.         $(element).parent().find(‘input’).after(‘<div class=“text-error”>’ + json[‘error’] + ‘</div>’);
  6.     }
  7.     if (json[‘success’]) {
  8.         alert(json[‘success’]);
  9.         $(element).parent().find(‘input’).val(json[‘code’]);
  10.         $(element).parent().find(‘img’).attr(“src”,“image/”+json[‘code’]);
  11.     }
  12. },

其他细节参考GIT代码里的注释。

附上HTML的图:

 

 

opencart 2.x VS 3.x 分析之–数据层

经常看我网站的应该知道鄙人由于之前自己的备份机制出问题的同时,又刚好机器阵列挂掉无法修复。导致的毁灭性悲剧(所有网站代码严重倒退),还好总算熬过来了。开始要着手于自己网站的重建工作。对,我网站多,所以想想也可怕啊。。(我咋那么多废话,)进入正题。于是乎我要重建3C爱好者,反正重新做,就用3.X的,但是部分数据还是要的。毕竟数据还是很重要的。虽然很多产品图片也没了。于是乎就有了这个研究了。

下面是从2.1 和 3.02 的数据表对比分析。也大概看了model层两三次。部分以后研究后再更新说明。

数据表的增加和删除

一:增加了customer_affiliate 表用于存储加盟数据,加盟会员的三个表都删了,我看过后台,会员体系和加盟体系合并了;

二:增加了一个customer_approval 用于审批的,也包括存储会员类型(会员或加盟);

三:banner的相关表中有两个合并了,一个是图片存储一个是详情的,两个合并在一起了;

四:customer_search  表的增加,这个应该是存储用户搜索数据的,用于分析或者别的;

五:用户自定义字段增加 validation 应该是用于是否验证,好像2.3 就开始有了。

六:event 事件表增加了状态和排序

七:增加extension_install表用于存储扩展安装的信息,可能和后台对接官方安装那个有关,或者ocmod。具体要研究处理层。

八:extension_path 表的增加,同上,应该是存储路径相关的。

九:去掉了order_custom_field数据表

十:增加了order_shipment 用于存储发货信息吧可能。

十一:url_alia 表改为 seo_url表,并且增加了语言字段和商店字段

十二:增加了一个session表

十三:增加了 shipping_courier 运送快递信息存储表,应该是为运单查询插件做铺垫(参考上面的十)

十四:增加了统计表statistics

十五:增加了主题表,应该2.2或者2.3开始有吧。

十六:增加了translation表,用于存储翻译吧

字段名的变化和删除

一:api表的删除了两个字段和一个字段名的更改,删除的字段参考上面session表的说法;

二:cart增加API;

三:用户表增加了个language_id,看了下model,是存储用户当前语言设置的。这个设计挺好;

四:用户表去掉了审批字段approval,改用上面提到的新增的表customer_approval处理;

五:用户表增加了code字段,不知道干嘛的,看起来和密码找回有关。待以后分析处理层代码方知;

六:customer_activity 表的字段activity_id 名称修改

七:information_description表description 字段类型变化

八:modification 表增加一个字段,应该是存储安装那个表相关的数据。

九:order去掉了支付货币ID,支付税收ID字段。

十:order_total表去掉text字段,就是用于存储 xx元 这样的。其实确实多余。

其他

一些字段的存储类型变化;

一些字段的存储大小变化;

迁移

一些字段的增删和一些表的合并,增加了迁移难度,但是也是可以做的,有需要升级OC的可以找我升级数据哦。QQ:184923973

 

【记录】国内用户使用谷歌字体

以前大家都是用的360的,现在360的关了,去年就关了。所以咋办,我记得谷歌字体后来有一个谷歌自己国内版本?今天百度果然第一个就是,然后打开是一个页面,我尝试替换了下也确实可以引用。

  1. 找到类似
  2. <link href=“//fonts.googleapis.com/css?family=***” rel=“stylesheet” type=“text/css” />
  3. 替换域名部分
  4. <link href=“//fonts.googlefonts.cn/css?family=***” rel=“stylesheet” type=“text/css” />

opencart的话在:catalog/view/theme/*/template/common/header.tpl

OC后台在:admin/view/stylesheet/stylesheet.css 的第一行

其他程序根据实际情况查找,最笨的方法是用编辑器批量搜索。或者熟悉框架根据框架查找,比较可能的一般在header footer 文件,或者CSS文件里引入。

如图:

【资源】分享一个lnmp后补SSL的sh脚本

忙?懒?反正我是赶在最后一天来处理自己网站的SSL的。哦,我还有好几个站呢。所以,写了个.sh脚本,就不用一个个去折腾啦。代码筛选(整理)摘录自lnmp脚本。所以本文只能算分享。哈哈哈。这样不需要重新去执行一次lnmp vhost add来重新添加。没啥问题。

首先在任意目录,你喜欢就好,我在 /root/lnmp1.x/目录下。

  1. cd /root/lnmp1.x
  2. vi add_ssl.sh

然后按下insert按钮,进行插入如下内容:

  1. Echo_Yellow()
  2. {
  3.   echo -n $(Color_Text “$1” “33”)
  4. }
  5. Color_Text()
  6. {
  7.   echo -e ” \e[0;$2m$1\e[0m”
  8. }
  9. domain=“”
  10.     while :;do
  11.         Echo_Yellow “Please enter domain(example: www.lnmp.org): “
  12.         read domain
  13.         if [ “${domain}” != “” ]; then
  14.                 echo ” Your domain: ${domain}”
  15.             break
  16.         else
  17.             Echo_Red “Domain name can’t be empty!”
  18.         fi
  19.     done
  20.     Echo_Yellow “Enter more domain name(example: lnmp.org *.lnmp.org): “
  21.     read moredomain
  22.     if [ “${moredomain}” != “” ]; then
  23.         echo ” domain list: ${moredomain}”
  24.     fi
  25.     vhostdir=“/home/wwwroot/${domain}”
  26.     echo “Please enter the directory for the domain: $domain”
  27.     Echo_Yellow “Default directory: /home/wwwroot/${domain}: “
  28.     read vhostdir
  29.     if [ “${vhostdir}” == “” ]; then
  30.         vhostdir=“/home/wwwroot/${domain}”
  31.     fi
  32.     echo “Virtual Host Directory: ${vhostdir}”
  33.     email=“”
  34.     while :;do
  35.         Echo_Yellow “Please enter Administrator Email Address: “
  36.         read email
  37.         if [ “${email}” == “” ]; then
  38.             Echo_Red “Administrator Email Address cannot be empty!”
  39.         else
  40.             echo “Server Administrator Email:${email}”
  41.             break
  42.         fi
  43.     done
  44.     letsdomain=“”
  45.         if [ “${moredomain}” != “” ]; then
  46.             letsdomain=“-d ${domain}”
  47.             for i in ${moredomain};do
  48.                 letsdomain=${letsdomain}” -d ${i}”
  49.             done
  50.         else
  51.             letsdomain=“-d ${domain}”
  52.         fi
  53. wget https://dl.eff.org/certbot-auto –no-check-certificate -O /bin/certbot
  54. chmod +x /bin/certbot
  55.         if grep -Eqi “CentOS” /etc/issue || grep -Eq “CentOS” /etc/*-release; then
  56.             yum -y install epel-release
  57.         fi
  58. country=`curl -sSk –connect-timeout 10 -m 60 https://ip.vpser.net/country`
  59.     if [ “${country}” = “CN” ]; then
  60.         if [ -s ~/.pip/pip.conf ]; then
  61.             grep “index-url” ~/.pip/pip.conf
  62.             echo “pip.conf exist.”
  63.         else
  64.             echo “Create pip.conf…”
  65.             mkdir ~/.pip
  66.             cat > ~/.pip/pip.conf <<EOF
  67. [global]
  68. index-url = https://pypi.doubanio.com/simple/
  69. [install]
  70. trusted-host=pypi.doubanio.com
  71. EOF
  72.         fi
  73.         sed -i ‘s#pypi.python.org/packages#pypi.doubanio.com/packages#g’ /bin/certbot
  74.     fi
  75. echo “Starting create SSL Certificate use Let’s Encrypt…”
  76.     /bin/certbot certonly –email ${email} –agree-tos -n –webroot -w ${vhostdir} ${letsdomain}
  77.     lets_status=$?
  78.     if [ “${lets_status}” = 0 ]; then
  79.         Check_Lets_Cron
  80.         echo “Let’s Encrypt SSL Certificate create successfully.”
  81.     else
  82.         Echo_Red “Let’s Encrypt SSL Certificate create failed!”
  83.     fi
  84. Check_Lets_Cron()
  85. {
  86.     if crontab -l|grep -q “/bin/certbot renew –disable-hook-validation”;then
  87.         echo “Let’s encrypt crontab renew rule is exist.”
  88.     else
  89.         echo “Add Let’s encrypt crontab renew rule…”
  90.         (crontab -l ; echo ‘0 3 */7 * * /bin/certbot renew –disable-hook-validation –renew-hook “/etc/init.d/nginx reload”‘) | crontab –
  91.     fi
  92. }

然后按下ESC按钮退出编辑,ctrl+Q组合然后输入wq保存文件。

  1. #执行权限设置
  2. chmod +x add_ssl.sh
  3. #执行脚本
  4. ./add_ssl.sh

然后根据提示操作输入域名,输入要一起签约的域名,然后还有就是现在网站所在的路径,和邮箱。然后就可以执行了。如果报错根据错误提示百度解决或者付费找我解决。

关于wordpress、opencart等配置SSL。百度很多,,不过我也可以开一篇来写。done.

【迅科专题】linux常用命令–压缩解压tar、zip、bz2

上一次写过一篇关于zip打包的:http://blog.xukhost.com/2141.html

还有一篇是zip解压的:http://blog.xukhost.com/2096.html

好吧以前的风格很喜欢说:“呵呵”,真是笑死我了。【不管以前的风格了我也懒得去修改】

今天整理如下:

路径和通配符

通配符,如:mysql-bin*  或  ./* 或  *.php

绝对路径如:/home/www/*

相对路径如:./* 或 * 或 ../bak/*

zip的压缩/解压

zip文件解压:unzip xxx.zip

zip文件压缩:zip -r xxx.zip ./*

PS:-r 参数是递归目录;

PS2:后面的 ./* 是代表当前目录下的所有文件,参考路径和通配符的知识点

PS3:-d参数用于删除压缩包中的某文件

例如:zip -d bak.zip temp.php

PS4:-m参数用于追加压缩文件

例如:zip -m bak.zip /home/a.sql

tar文档相关参数

首先先认识几个参数

-x : 解压

-d :删除压缩包中的文件

-r :追加文件

上面这几个参数只能用其中一个,但是可以追加下面的参数:

-v :查看进度

-z :带gzip的属性

-j :带bz2的属性

-Z :有compress属性的

-f :后面指定文件名

tar/tar.gz/tar.z文档解压

tar文件解压:tar xvf xxx.tar

tar.gz文件解压:tar zxvf xxx.tar.gz

tar.bz2文件解压:tar jxvf xxx.tar.bz2

另一种bz2解压方法:bzip2 -d xxx.tar.bz2 然后把得到的tar文件用上面方式解压

tar.z文件的解压:tar Zxvf xxx.tar.z

tar/tar.gz/tar.z文档压缩

和zip打包一样分为四个部分:命令+参数+打包后的文件名+需要打包的文件名。然后根据参数规则例句如下:

打包当前目录下所有文件为tar文件

tar -cvf bak.tar ./*

其中c是把文件打包,v是查看进度(可以不带),f是指定文件名,后面是所需要打包的文件名。

tar.gz:tar -czvf bak.tar.gz ./*

tar.bz2:tar -cjvf bak.tar.bz2 ./*

tar.z:tar -cZvf bak.tar.z ./*

注意:命令里这里的z必须是大写哈。

看不懂的可以自己建立一个目录复制点文件进去反复测试。

 

经验分享-移动端固定输入框到底部兼容问题

很久没写教程啦,说好的手机模板开发也拖到前天才开始(虽然核心之前写了),可想而知不是一般的忙。至于赚了多少钱嘛就不提了,都是泪。所以还是分享下这次的经验吧。由于需要开发手机模板,把搜索和菜单做成一个类似微信的模式,于是乎如下图。

是不是很棒棒,感觉自己帅帅哒。点搜索会进入输入框,也可以切换回来。但是,,,点击输入框后会弹出输入法,如果用微信,QQ浏览器发现没问题,可是夸克浏览器(UC旗下)就有问题了。出现如下图界面。。。

一看就知道兼容问题啦。我先贴一下样式代码。大概如下:

  1. #search {
  2.     displayblock;
  3.     height48px;
  4.     z-index: 10;
  5.     positionfixed;
  6.     bottom: 0
  7.     left: 0;
  8. }

可是这种兼容问题挺尴尬的,一方面我越来越少写前端了,另一方面这种在手机上才能模拟的现象一时半会不知道怎么调试,由于周末出差,于是搁置先忙其他。今天下午想着不行啊这个必须解决才有动力继续下去。搜索了很多资料,方法都试了不可行。不过有一个方案倒是不错。如下:

 

但是我发现这一样行不通,于是我在想,能不能判断下,来定义bottom?ennnnnn,不对,定义top?于是乎:

  1. <script type=“text/javascript”>
  2.     var winHeight = $(window).height(); //获取当前页面高度
  3.     $(window).resize(function() {
  4.         var thisHeight = $(this).height();
  5.         if (winHeight – thisHeight > 50) {
  6.             $(‘#search’).css(‘top’, ‘0’);
  7.         } else {
  8.             $(‘#search’).css(‘top’, ‘auto’);
  9.         }
  10.     });
  11. </script>

这样成了,点击输入框它跑置顶上面去了,这不是和前面搜索到的不喜欢的方案一个道理了嘛?要么,展开一个阴影层,然后顺便加点关键词上去?感觉是下下策。既然可以重新获得屏幕高度,那么屏幕高度减去底部高度48不就可以了?

  1. <script type=“text/javascript”>
  2.     var winHeight = $(window).height(); //获取当前页面高度  
  3.     $(window).resize(function() {
  4.         var thisHeight = $(this).height();
  5.         newHeight = thisHeight – 48; //屏幕高度减去48得到的高度
  6.         if (winHeight – thisHeight > 50) {
  7.             $(‘#search’).css(‘top’, newHeight);
  8.         } else {
  9.             $(‘#search’).css(‘top’, ‘auto’);
  10.         }
  11.     });
  12. </script>

感觉就是棒棒哒的思路有没有?可是现实是,不行,而且,可笑的事实是 +48!!!而不是 -48 ???这哪根葱的道理哇???不合理但是就是解决了问题了。。。于是乎QQ和微信看了下,确实不对,再改回去-48的话,嗯,就没毛病了。。。所以一个+一个-?那,判断下浏览器就好了?然后我想了个问题,我好像始终只测试了QQ、微信、夸克?然后测试了谷歌浏览器、QQ浏览器、UC浏览器、发现-48是对的。唯独夸克奇葩。。那好吧,我,,,最终这样。。。

ennnnnnnn,这次,,,算是完美了。各种浏览器测试没问题。哦对了,补充下,我换安卓了。自然上面是兼容安卓的:QQ、微信、QQ浏览器、UC浏览器、夸克浏览器、谷歌浏览器、系统浏览器。至于IOS嘛,嗯,,要找下身边的人借一台看看了。如有后续再补充。

另外附上一个如何判断夸克浏览器的标识信息方法,自己打印出来的。上图有判断方法,光标位置上就是,有需要可以记录下来。

最后附上完美解决的截图:

 

opencart技巧–宽或高自动计算研究开发思路

由于我要开发个模块,模块里需要高度一样,好对齐。宽度又不需要固定,如果不剪切,原图又不是很好,如果客户用的图片太大了加载速度慢。

那,就是上面这个模块。于是只好改造剪切图片的方法啦。

跟踪代码

首先,查看catalog/model/tool/image.php

从这里读一读代码,这个第一个方法传入了三个参数,分别是指定文件、宽度、高度。然后判断有没有这个文件啊,这个文件路径啊,大小啊日期啊什么的。经过一系列判断后,文件才被剪切,然后把缓存的地址加上config配置的网址返回给处理层。

然后看到:

  1. $image = new Image(DIR_IMAGE . $image_old);
  2. $image->resize($width$height);
  3. $image->save(DIR_IMAGE . $image_new);

查看调用的核心文件 system/library/image.php

然后可以看到 resize这个方法,这个就是处理的方法啦。可以看到如下代码:

  1. $scale_w = $width / $this->width;
  2. $scale_h = $height / $this->height;
  3. if ($default == ‘w’) {
  4.     $scale = $scale_w;
  5. elseif ($default == ‘h’) {
  6.     $scale = $scale_h;
  7. else {
  8.     $scale = min($scale_w$scale_h);
  9. }
  10. if ($scale == 1 && $scale_h == $scale_w && $this->mime != ‘image/png’) {
  11.     return;
  12. }
  13. $new_width = (int)($this->width * $scale);
  14. $new_height = (int)($this->height * $scale);
  15. $xpos = (int)(($width – $new_width) / 2);
  16. $ypos = (int)(($height – $new_height) / 2);

重点就在这里啦。要先在这个代码的上面计算好宽度高度。

计算

我们来假设一个400*200的图片等比缩小是多少?200*100啊,那么如果高度不给,这个用(小学还是初中学的我也不记得了)方式来求解啊。

于是得到 x = (200*200) / 400

解出来不就是 x = 100 吗?

嗯,逆向求解嘛。高度呢?也同理啊。

也就是:

新的宽度 = (旧宽 * 新高) / 旧高

新的高度 = (旧高 * 新宽) / 旧宽

写成代码

从跟代码可以看出四个值的来源,于是乎就写个判断和计算。判断他们的参数是auto的时候,重现计算赋值给左边。代码如下:

调用方法

这个嘛,参考上一个文章或看图,三个参数的第二个是宽度,第三个是高度,哪个希望自动,就哪个用auto代替。如图:

扩展文章

SDT技术网公开类库及使用说明

SDT技术网公开类库及使用说明

面向对象的初衷,就是为了不要重复造轮子,所以我会不定期公开一些大家用得上,至少是开发的人用得上的model类或者system核心类【嗯,目前都是先发OC的,也只整理了一两个】。

针对程序

目前仅:opencart 1.5 ~ 2.3

类类型

model类

system核心

vqmod / ocmod 【虚拟化写入】

共享地址

http://git.oschina.net/yfore_com/sdtclass

类库说明

验证用户

sdtclass / opencart / upload / catalog / model / sdtclass / isme.php

它的出现:

opencart有一个缺陷,就是比如打开地址簿,上面的ID随意修改都可以进入任何页面。虽然如果不是用户本人的地址对应信息不会暴露。不过这样也不是很好。其他插件也遇到过类似的情况,如果某些作者开发的插件WHERE不够严谨,就会有漏洞啦。所以最好自己加下判断。下面是示例代码。适合新手。

用法:

  1. //引入model
  2. $this->load->model(‘sdtclass/isme’);
  3. $isme = $this->model_sdtclass_isme->getOrder($order_id);
  4. if(!$isme) {
  5.     //判断如果不是用户自己的,则重定向到其他页面,这里自己决定重定向的页面
  6.     $this->response->redirect($this->url->link(‘common/home’, true));
  7. }

需要参数:1个

用这个参数查询是否是当前用户的信息,上面是示例。其他方法参考示例使用。

图片剪切自动计算宽或高

sdtclass / opencart / upload / system / library / image.php

它的出现:

oc自带的剪切图片必须声明宽度和高度两个,但是这样剪切有个缺点,就是会出现白底,如果想定义其中一个,然后就可以自动算另一个咋办呢?于是。。

用法:

  1. //引入model
  2. $this->load->model(‘tool/image’);
  3. //图片剪切
  4. //宽度自动
  5. $image = $this->model_tool_image->resize($image, ‘auto’,$height);
  6. //高度自动
  7. $image = $this->model_tool_image->resize($image, $width, ‘auto’);

需要参数3个,分别是:图片、宽度、高度,宽度和高度可以写auto或数字。

PS:这个系统就有了,不过我改进了下,可以提取里面的代码也可以直接替换。也可以写成vqmod代码哇。

其他

后面继续更新。具体看GIT。

 

opencart上传产品后前台不显示的若干原因和解决办法

opencart上架产品后,前台不显示的原因挺多的,要么是设置问题,要么是环境问题,要么是插件设置之类的。

设置

首先,产品设置了什么分类?还是没设置分类?如果有设置分类,去对应的分类查看产品,因为首页的模块不一定有显示你上架的产品。除非你设置了最新产品模块放首页。其次,你设置的分类是子分类,你在主分类是看不到的。这一点是OC设计问题,可以找我买插件解决。然后你去看看子分类是否有。

如果设置的分类也没有,那回头看看产品的状态是否启用,如果是关闭是不会显示的哦。后台有个复制产品功能,复制的产品默认是关闭的。请注意。

插件

有一些多商家插件,或者需要特殊设置的产品才显示出来,也是有的。之前就遇到过。需要关联商家才显示,是插件的代码逻辑就这样。虽然可以在select查询语句的where条件里去掉这个查询,但是如果这个是必须的,那么不建议修改。

环境

之前遇到过,怎么排查都没问题,但是我一个个打印where条件的时候,发现时间有问题,在仔细对比后发现录入的产品时间比实际上数据库的时间要早。比如录入的日期是31号,但是SQL查询的时间还是30号,就导致无法输出这个产品。如果是VPS云服务器,建议调整mysql系统和服务器系统时间,如果是虚拟主机,只好改代码了。具体修改如下图:

图左是文件路径,右边是对应的代码。GMT+6这个设定主要是因为,数据库的时间对应时区是GMT+6这个,那么我就要让上架产品的时候,默认选择的日期是对应数据库的日期。就不用每次都是改为前一天了。

好了,方法提供了,如果还是不懂,就付费修改吧。按照图的两个注释中间的代码添加,那么问题来了,如何知道时间差和时区呢?打印下就知道了。

打印查询

需要修改,肯定要知道时区要怎么设定,首先要查询数据库时间,和主机时间,查询对比。得到时差,查询时区,就知道要设置什么时区了。如下:

代码不贴了,看图,在getProduct()这个方法下面写入图中代码,自己多打打字吧。代码都用英文的括号和引号、分号,切记~~

然后前台随便打开一个产品,页头会输出信息,如果没,请刷新后台缓存。就是扩展管理里,右上角的ocmod缓存刷新。如果有其他缓存请一并刷新。

 

vqmod for opencart插件制作进阶与技巧

15年的时候,我写过一篇文章《略谈 vqmod for opencart 插件制作过程》,也不知道被哪些人抄袭过去了。不过无所谓了。文章梳理的思路还是在我这里。今天对这篇文章进行进一步补充。

file标签

如果有多个类似文件,我们写很多个吗?其实可以不必要,利用path和逗号解决这个问题。

  1. <!– 修改最新产品模块 –>
  2. <file name=“catalog/view/theme/*/template/module/latest.tpl”>
  3. <!– 规则 –>
  4. </file>
  5. <!– 修改热卖产品模块 –>
  6. <file name=“catalog/view/theme/*/template/module/bestseller.tpl”>
  7. <!– 规则 –>
  8. </file>
  9. <!– 改为 –>
  10. <file path=“catalog/view/theme/*/template/module/” name=“latest.tpl,bestseller.tpl”>
  11. <!– 规则 –>
  12. </file>

其中,上面的 * 代表任何文件,如果有多个模板可以这么解决。

operation标签

如果一个地方,搜索不到,导致整个XML不起作用怎么办呢?可以定义跳过,不过不要总使用这样的,比如你TPL搜索到了代码,但是C层或者M层搜索不到,那样会导致页面报错。所以C层和M层不建议使用跳过,而V层可以。

  1. <file name=“catalog/view/theme/*/template/product/product.tpl”>
  2.     <operation error=“skip”>
  3.         <!– 规则 –>
  4.     </operation>
  5. </file>

当然了,如果你要写个注释,比如这个功能干嘛的。你可以这样写:

  1. <file name=“catalog/view/theme/*/template/product/product.tpl”>
  2.     <operation error=“skip” info=“添加xx功能”>
  3.         <!– 规则 –>
  4.     </operation>
  5. </file>

regex

如果你想用正则搜索怎么办呢?有时候普通搜索很难定位,其实vqmod也是支持的啦。

  1. <file name=“catalog/view/theme/*/template/product/product.tpl”>
  2.     <operation error=“skip” info=“添加xx功能”>
  3.         <search position=“replace” regex=“true”><![CDATA[~<div(.*?)class=”(.*?)image(.*?)”(.*?)>~]]></search>
  4.         <!– 规则 –>
  5.     </operation>
  6. </file>

正则方面以后会写一期文章,如果你不熟悉,可以用别的替代方法,比如上面提到的文章里提到的index,也可以用下面这个。

offset

这个是用于搜索到的第几行,用于position的参数是after或者before的时候。可以是正数或者负数。如果是after,搜索到的行,往下数一行然后添加代码,就是1。如果你是before,然后往上数两行再添加代码在上面,就是2。

下面搜索这段代码添加作为例子。

  1. <div class=“col-sm-12”>
  2.     <label class=“control-label”><?php echo $entry_rating; ?></label>
  3.     &nbsp;&nbsp;&nbsp; <?php echo $entry_bad; ?>&nbsp;
  4.     <input type=“radio” name=“rating” value=“1” />
  5.     &nbsp;
  6.     <input type=“radio” name=“rating” value=“2” />
  7.     &nbsp;
  8.     <input type=“radio” name=“rating” value=“3” />
  9.     &nbsp;
  10.     <input type=“radio” name=“rating” value=“4” />
  11.     &nbsp;
  12.     <input type=“radio” name=“rating” value=“5” />
  13.      &nbsp;<?php echo $entry_good; ?></div>
  14. </div>

用XML对这段代码进行添加代码。如下四个示例:

  1. <file name=“catalog/view/theme/*/template/product/product.tpl” keep=“true”>
  2.     <operation error=“skip”>
  3.         <search position=“after” offset=“1”><![CDATA[<input type=”radio” name=”rating” value=”1″ />]]></search>
  4.         <add><![CDATA[<b>测试1</b>]]></add>
  5.     </operation>
  6.     <operation error=“skip”>
  7.         <search position=“after” offset=“-1”><![CDATA[<input type=”radio” name=”rating” value=”2″ />]]></search>
  8.         <add><![CDATA[<b>测试2</b>]]></add>
  9.     </operation>
  10.     <operation error=“skip”>
  11.         <search position=“before” offset=“1”><![CDATA[<input type=”radio” name=”rating” value=”3″ />]]></search>
  12.         <add><![CDATA[<b>测试4</b>]]></add>
  13.     </operation>
  14.     <operation error=“skip”>
  15.         <search position=“before” offset=“-1”><![CDATA[<input type=”radio” name=”rating” value=”4″ />]]></search>
  16.         <add><![CDATA[<b>测试4</b>]]></add>
  17.     </operation>
  18. </file>

你会得到下面的缓存代码:

大家从上面的图片中不难发现,before的时候offset是负数1的时候和直接用after,不用offset没区别,after的时候offset是负数1的时候和直接用before不用offset的也没区别,负数值大的时候,offset是-5,position是after等同于offset=4,position是before。所以其实offset有负数功能,但是也没太大意义。

iafter和ibefore

相比于after和before,前面加个i的区别就是,在搜索到的代码后面或者前面添加。下面给个例子:

【别问我为啥颜色不一样,我有几个编辑器。】

当sql这里要添加代码的时候,比如 telephone = ‘” . $this->db->escape($data[‘telephone’]) . “‘,

代码:

  1. <operation info=“添加手机号”>
  2.     <search position=“iafter”><![CDATA[city = ‘” . $this->db->escape($data[‘city’]) . “‘,]]></search>
  3.     <add><![CDATA[ telephone = ‘” . $this->db->escape($data[‘telephone’]) . “‘,]]></add>
  4. </operation>

这样的话,就会在搜索到的代码后面,加入add里指定的代码。值得注意的是,平时使用其他的position时,add定义的你怎么换行都没问题,如果是iafter、ibefore和replace的时候,代码的开头最好紧挨着<add><![CDATA[ 写,为啥这样呢,因为这样SQL又是一整行,而且有时候不适合换行。也可能对后面别人开发的插件代码干扰。以后讲讲vqmod的兼容问题。

ibefore这里不举例子了,同理的。搜索的前面加,和搜索的后面加的效果。

输出:

  1. //iafter 的话
  2. city = ‘” . $this->db->escape($data[‘city’]) . “‘, telephone = ‘” . $this->db->escape($data[‘telephone’]) . “‘,
  3. //ibefore的话
  4.  telephone = ‘” . $this->db->escape($data[‘telephone’]) . “‘,city = ‘” . $this->db->escape($data[‘city’]) . “‘,

PS:最近太忙了,更新频率自然下降很多了。以后多抽空更新。欢迎关注我们公众号“SDT技术网”。