jQuery-纠结的jquery validation插件

jQuery Validation Plugin

这两天在二开ShopNC B2B2C版本的时候需要弄到校验的功能,然后才发现这个插件真的很纠结。

最大的纠结是rules数组的key值到底是元素的ID还是元素的NAME。

一开始以为很简单就直接去官网查看了,然后发现没有直白的说是ID还是NAME呀!!!

好吧,也许是我自己不知道在哪里看吧,那最简单的就是测试一下呗,然后就知道了,原来是NAME选择器。

这边就记录一下吧。

rules : {
lv : {
required : true,
},
‘Go[]’ : {
required : true,
}
},

其中lv是radio元素的用法,Go是checkbox的用法

文件格式unix与dos转换,CRLF与LF的区别查看

这两天被一个客户的网站系统搞得很头痛的,开发的好好地不知道哪里错了,新建的文件都是不能正确执行的。

怎么检查代码都是不正确的,噢,文件是PHP的文件,经过调试,最终定位在凡是require_once进来的文件都是不会被初始化的。

奇怪的是,原先的程序代码是可以的,但是一旦修改了,就会出现空白的情况。

一直翻查程序文件都没问题。

终于在调试的过程不断的变换编码中发现一个问题:就是程序里面的代码会莫名其妙的成了“乱码”直接显示出来了。

好吧,引入今天的话题吧。

文件的格式虽然都叫做纯文本,但是他们的存储格式还是有不同的,比如这个文件格式就分unxi、dos、mac。

文件格式之外,存储的内容还有编码的区别,比如utf-8、ansi等的区别。

同一个编码还存在有BOM没有BOM的区别。

当然,还有CRLF与LF的区别,天呐,真的会疯了的。

我不就想要好好编个程嘛~

下面就是使用notepad++来查看这些内容的。

第一、文档格式

编辑、文档格式转换

  1. 转换为Windows格式
  2. 转换为UNIX格式
  3. 转换为MAC格式

当前的文档格式会成灰色。

VI操作:

set fileformat=[unix|dos]

这个决定下面换行符的行为模式。

第二、CRLF与LF的查看

视图、显示符号、显示全部字符

然后你会发现,全部的字符后面都增加了CRLF或者LF了,具体是根据你的文档格式来定的。

这个决定行与行之间是什么关系,比如本来应该单行注释一行,紧跟一行正确代码,然后这个不正确的话就变成了同一行了,然后文件就错了。而使用这些智能的编辑器,他显示是自动转换的,结果你是死活不知道原来他的处理已经并成一行了。

第三、存储的编码

编码、选择合适的编码

这个决定文件的字符是正常文字还是“乱码”。

这样子之后就正常了~

获取当前页面的全部链接用于检查内外链情况

最近,在完善ECSTORE的分销系统时,因为早期的遗留问题,造成页面的链接的不统一,要弄好分销系统的第一步就是不能链接串了,所以需要排查,一个个的排查很累噢。

下面就是使用原生的JS获取当前的链接辅助排查。

// 列出当前页面的全部链接

console.log('START');
for( var aa in document.links){
console.log( document.links[aa].href )
};
console.log('END');

// 列出不以什么为开头的链接

console.log('START');
var matchURL = /http:\/\/m\.shanmai\.cn\/p\/wiwy\//;
for( var aa in document.links){
if( document.links[aa].href.test(matchURL)===false ) console.log( document.links[aa].href );
};
console.log('END');

// 列出不以什么为开头的链接并设置对象的外框在页面中显示出来

console.log("START");
var matchURL=/http:\/\/m\.shanmai\.cn\/p\/wiwy\//;
for(var aa in document.links){
if(document.links[aa].href.test(matchURL)===false){
console.log(document.links[aa].href);
document.links[aa].style="display: inline-block;background-color: #ff0000;color: #00ff00;border: 6px solid #0000ff;"}
}
console.log("END");

// 列出本站且不以什么为开头的链接并设置对象的外框在页面中显示出来

console.log("START");
var matchURL=/http:\/\/m\.shanmai\.cn\/p\/wiwy\//;
for(var aa in document.links){
var oo=document.links[aa];
if(oo.href.test(/shanmai\.cn/)){
if(oo.href.test(matchURL)===false){
console.log(oo.href);
document.links[aa].style="display: inline-block;background-color: #ff0000;color: #00ff00;border: 6px solid #0000ff;"
}
}
}
console.log("END");

使用办法就是直接打开浏览器的开发者工具,或者直接按F12键打开,然后在控制台中输入命令即可。

怎么获取手机端的页面信息

前天修改了ECSTORE商城的转向,实现根据上网终端,自动将访问地址转向正确的链接,简单的说就是给你一个PC端的链接,你用手机访问,就能自动切换到手机端的链接上。

然后,我擦就出现了今天这个问题,之前用file_get_contents获取WAP端的内容并获取手张图片的代码忽然不能工作了。

经过排查,手机端调用的时候全部都访问PC端的页面了,我擦,数据不正确是正常的。

那么,怎么处理?

下面就是增加手机端访问的代码,其实很简单的。

参考网址:php 模拟手机访问页面并抓取数据

其实就是偷懒,去那边拿了一个手机头部定义哈~感激

// 定义常用的变量
$timeout = 60;
 $url = 'http://www.shanmai.cn/wap/article-1364.html';
 $header = array(
 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4'
 ); 
 
 // 方法 1.用curl
 $ch = curl_init(); 
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
 curl_setopt($ch, CURLOPT_URL, $url);
 $contents = curl_exec($ch);
 print_r($contents);
 
 // 方法 2.用file_get_contents
 $opts = array(
 'http'=>array(
 'method'=>'GET',
 'timeout'=>$timeout,
 'header'=>$header
 )
 );
 $cx = stream_context_create($opts);
 $contents = file_get_contents( $url, false, $cx );
 print_r($contents);

当然,还有其他方法,如fsockopen等,不过不常用就不写了。

参考链接:

 

 

ECSTORE-后台管理视图详情的翻页功能扩展

ECSTORE系统后台的管理视图是很方便我们的功能开发,唯一不足的是,如果我们的详情的内容有翻页,那么就必须在管理控制器里面写ajax_html方法,然后来调用传入的方法,生成翻页内容。

延伸:可以查看会员列表中的预存款里面的翻页,只要记录大于10项就可以看到了

可是,实际上,在finder的定义中我们已经写过一次代码了,完全没必要再写一次代码,但是,如果直接将连接指向finder内的方法的话,我们会发现,tab的表头一直再重复,很麻烦,怎么办呢?

二次开发呗~

我们的目标是:将那个表头去掉。

找到文件:

\app\desktop\lib\finder\builder\detail.php

找到行

if( count($this->detail_pages)>1){
echo $tab_header;
}

修改为下面代码:

if( count($this->detail_pages)>1 && ($_GET['noshow']==false) )
{
echo $tab_header;
}

保存。

然后,只要在翻页的地方将连接上增加&noshow=true然后就可以实现将表头去掉的功能了。

其他调用就看你自己的了咯~

2017.08.18 续

解决完这个问题后,同事有开发了一个详情页,然后按照这个逻辑操作,结果发现,tab切换的第一屏是有tab表头的,但是!当点击下一页的时候却发现表头消失了。

很诡异噢,实在没有时间检查一直拖到今天下午才检查,才发现,原来,这是一个误伤。

根本不需要重新二开呀,本来功能就是可以翻页的。

问题出在之前的同事开发的时候不知道从哪里找了一个模板,模板里面有一个开头:

<div>
<div container='true'>
...
</div>
</div>

只需要将这两行开头的去掉,问题就解决了,就不会出现重复的问题了,原因是因为加载的机制决定了这个是不能出现的,出现就会嵌套进去了。

JS-百度云盘垃圾文件清理免费版

最近百度云盘增加了垃圾文件清理的功能,他能自动筛选出重复的文件及空文件,可惜,他是给会员使用的。

难道我们只能体验不能自动?

那肯定是不行的了,毕竟百度云盘的API接口没有开放,你想自动化都是没办法的啦,除非你将文件都拷贝到“我的应用数据”里面,而且还要开启早期的接口权限,要不基本上我看没戏。

扩展:百度个人云存储(PCS) | 文件API列表

那么我们能做啥呢?

列出清单然后一个个复制有点不方便噢,感觉一个个的删除过去麻烦,怎么办?那就自动列出一个清单,方便我们复制粘贴呗。

只要在垃圾文件清理界面,开启浏览器的“开发者工具(按F12就能打开)”,如果你不知道就算了,文章也别看下去了。

然后在控制台中,粘贴下面的代码,然后回车就会新打开一个新页面,然后里面都是当前页的文件及目录了,比较好的是,按照目录来展示噢,这个是唯一的亮点。

var wWindow = open();
var aItems = document.querySelectorAll('dd.g-clearfix.group-view-item.choosen');
var dLists = {};
aItems.forEach(function(el)
{
 let path = el.querySelectorAll('div.file-path a')[0].innerHTML.replace(/\s*/g,'');
 let value = el.querySelectorAll('div.file-name a')[0].innerHTML;
 if(dLists[ path ]==undefined) dLists[ path ]=[];
 dLists[ path ].push(value);
});
for( path in dLists )
{
 console.log(path);
 wWindow.document.write( '<h1>' + path + '</h1>' );
 wWindow.document.write( '<ul>' );
 if(dLists[path].length>0)
 {
 dLists[path].forEach(function(row){
 wWindow.document.write( '<li>'+row+'</li>' );
 });
 }else wWindow.document.write( '<li>没有文件</li>' );
 wWindow.document.write( '</ul>' );
}
wWindow.document.close();

然后,根据清单一个个手动删除吧。

当然,如果你有开通PCS权限的话,他是提供文件接口的,就可以根据这个清单自动删除了噢,具体接口还能不能用,没有尝试,所以,呵呵,自行测试呗。不过估计有点悬。

微信-公众号网页授权信任登录开发调试

最近帮朋友增加ECSHOP商城系统的微信信任登录功能,不过他的公众号还没下来,难道不能开发?

想了一下,手上已经有一个公众号是认证的了,能不能用他来搞呢?

当然,最害怕的是会影响原先的应用。

试了一下,哈,问题解决,还没干扰。

解决办法是:

接口调用的时候需要传redirect_uri参数,而我们的公众号的微信授权登录填写的就是这个地址。

所以了,只要是redirect_uri下面的应用都是能收到授权信息的。

那就将code回传到这个redirect_uri地址,然后自己在做转发不就行了?

简单吧^_^

附上转发代码:

转发的网址比较复杂,所以使用了base64编码了~

error_reporting( E_ALL ^ E_NOTICE );
if( isset($_GET['URL']) )
{
$URL = base64_decode( $_GET['URL'] );
unset( $_GET['URL'] );
$URL .= (strpos($URL,'?')===false?'?':'&') . http_build_query( $_GET );
header( 'Location:' . $URL );
}

mysql-#1170 – BLOB/TEXT column ‘keywords’ used in key specification without a key length

今天,在开发客服系统文档中心的时候,定义数据库结构的时候出现如下错误提示:

mysql-#1170 – BLOB/TEXT column ‘keywords’ used in key specification without a key length

真令人烦恼噢,查了一下,都没有正解,检查了一下最终原来是因为:

这个字段定义是索引,但是类型却是longtext类型的。