thinkphp地区联动+autocomplete联动输入怎么实现

ThinkPHP教程 列表
相关参考课程ThinkPHP 自动填充(自动完成)详解及实例ThinkPHP 自动填充
ThinkPHP 内置了数据对象的自动填充功能,可以用来处理默认值、数据过滤以及其他系统写入字段的自动处理。
要使用自动填充功能,只需要在对应的
里面定义 $_auto 属性(由多个验证因子组成的数组)。$_auto 属性是由多个填充因子组成的数组,语法格式如下:
protected $_auto = array(
array(填充字段,填充内容[,填充条件][,附加规则])
ThinkPHP自动填充格式说明:
必须。需要填充的表单字段,这个字段不一定是数据库字段,也可以是表单的一些辅助字段,例如验证码等。
必须。要对字段自动填充的内容。
可选。包括:
Model:: MODEL_INSERT 或者 1 :新增数据时候填充(默认)
Model:: MODEL_UPDATE 或者 2 :更新数据时候填充
Model:: MODEL_BOTH 或者 3 :全部情况下填充
可选。包括:
string:字符串,表示填充内容为字符串(默认)
function:使用函数,表示填充的内容是一个函数返回值
callback:使用方法,表示填充的内容是一个当前 Model 的方法返回值
field:字段,表示填充的内容是一个其他字段的值
自动填充例子
用户注册或修改资料时,可能用到的自动填充例子:
class UserModel extends Model{
protected $_auto = array (
// 新增的时候把status字段设置为1
array('status','1'),
// 对password字段在所有情况下使用md5函数处理
array('password','md5',3,'function'),
// 对username字段在新增时回调getName方法
array('username','getName',1,'callback'),
// 对regdate字段在新增时写入当前时间戳
array('regdate','time',1,'function'),
// 对regip字段在新增时写入用户注册IP地址
array('regip','get_client_ip',1,'function'),
和自动验证一样,自动完成机制需要使用 create 方法才能生效:
$Article = D(&User&);
if(!$User-&create()){
// 如果创建数据对象失败(可能是验证未通过等),输出错误提示信息
exit($Article-&getError());
// 继续下一步流程如将数据写入数据表
与自动验证不同的是,自动填充无效时(如调用一个不存在的函数或自动填充的字段不存在等)并不导致创建数据对象(create())失败,只能通过调试或实际数据入库来检测自动填充是否正确有效。
动态改变自动完成规则
和自动验证一样,可以在操作方法中使用 setProperty方法 动态的更改自动完成的规则:
$Dao = D(&User&);
$auto = array (
// 仅对password字段进行处理
array('password','md5',1,'function')
$User-&setProperty(&_auto&,$auto);
if(!$User-&create()){
更多可参看《》。
M方法中使用自动填充功能
参见《》。
充分利用功能强大的 ThinkPHP 自动填充(自动完成)功能,能够快捷简便的构建表单入库数据,程序结构也会更加明晰。
本章节内容共分 3 部分:1.
ThinkPHP 自动填充(自动完成)详解及实例2.
<(我爱开发网) — 提供最好的 、、、 及自由、创新、研究、探索
Linux/Windows Mono/DotNet [ Open Source .NET Development/ 使用开源工具进行DotNet软件开发]锐意进取,志存高远.成就梦想,只争朝夕.从你开始,创新世界.【That I exist is a perpetual supprise which is life. Focus on eCommerce】
bigautocomplete是一款Jquery插件。用它实现仿搜索引擎文本框自动补全插件功能很实用,使用也很简单,引入了插件之后写几行代码就可以实现,可以灵活设置。
先看效果图:
上图是通过ajax请求服务器返回的数据。下面简单介绍如何使用。
一、如何使用:
& &引入jquery.bigautocomplete.js和jquery.bigautocomplete.css文件到你的页面中。
二、参数说明:
$("xxxxx").bigAutocomplete({data:[...],url:"",width:0,callback:{}})
data(可选):
data:格式{data:[{title:null,result:{}},{title:null,result:{}}]}
url和data两个参数必须有一个,且只有一个生效,data优先。
url(可选):
url为字符串,用来ajax后台获取数据,返回的数据格式为data参数一样。
width(可选):
下拉框的宽度,默认使用输入框宽度。
callback(可选):
选中行后按回车或单击时回调的函数,用于返回选中行的其他数据及做一些操作。
三、示例:
& 1、本地数据:
html代码:
&input type="text" id="tt" value="" class="text" /&
javascript代码:
$(function(){
$("#tt").bigAutocomplete({
width:543,
data:[{title:"中国好声音",result:{ff:"qq"}},
{title:"中国移动网上营业厅"},
{title:"中国银行"},
{title:"中国移动"},
{title:"中国好声音第三期"},
{title:"中国好声音 第一期"},
{title:"中国电信网上营业厅"},
{title:"中国工商银行"},
{title:"中国好声音第二期"},
{title:"中国地图"}],
callback:function(data){
alert(data.title);
js中data里的result可以不写。
2、ajax请求:
html代码:
&input type="text" id="company" value="" class="text" /&
javascript代码:
$(function(){
$("#tt").bigAutocomplete({
width:543,
url:'http://localhost/test/suggestCom',
callback:function(data){
//alert(data.title);
服务端返回数据格式:
{"data":[{"title":"\u5317\u4eac\u73b0\u4ee3"},{"title":"\u5317\u4eac\u57ce\u5efa\u96c6\u56e2\u\u8d23\u4efb\u516c\u53f8"},{"title":"\u5317\u4eac\u5efa\u5de5\u96c6\u56e2\u\u8d23\u4efb\u516c\u53f8"},{"title":"\u5317\u4eac\u9996\u90fd\u65c5\u6e38\u96c6\u56e2\u\u8d23\u4efb\u516c\u53f8"},{"title":"\u5317\u4eac\u533b\u836f\u96c6\u56e2\u\u8d23\u4efb\u516c\u53f8"},{"title":"\u5317\u4eac\u4e00\u8f7b\u63a7\u80a1\u\u8d23\u4efb\u516c\u53f8"},{"title":"\u5317\u4eac\u91d1\u\u56e2\u\u8d23\u4efb\u516c\u53f8"},{"title":"\u5317\u4eac\u71d5\u4eac\u\u96c6\u56e2\u516c\u53f8"},{"title":"\u5317\u4eac\u5e02\u71c3\u6c14\u96c6\u56e2\u\u8d23\u4efb\u516c\u53f8"},{"title":"\u5317\u4eac\u4f4f\u603b\u96c6\u56e2\u\u8d23\u4efb\u516c\u53f8"}]}
服务端的代码:(以ThinkPHP示例)
public function suggestCom(){
$wd = $_POST['keyword'];
$keywords = $
$company_model = M('Company');
$res = $company_model-&where("name like '%".$keywords."%' or abbr like '%".$keywords."%' ")-&limit(10)-&select();
foreach($res as $v){
$suggestions[]= array('title' =& $v['name']);
echo json_encode(array('data' =& $suggestions));
默认是POST过来的数据,名称是keyword,返回数据是和本地data一致的。
附上jquery.bigautocomplete.js和jquery.bigautocomplete.css文件代码:
jquery.bigautocomplete.js
&View Code
jquery.bigautocomplete.css
&View Code
css经过改写,以适应某些情况不兼容的bug。
页面html代码:
&View Code
阅读(...) 评论()
随笔 - 14653
评论 - 993Thinkphp实现自动验证和自动完成
作者:天空还下着雪
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Thinkphp实现自动验证和自动完成的相关资料,需要的朋友可以参考下
Thinkphp的自动验证和自动完成都是根所表单提交的内容来的,对部分数据进行规则验证和处理后插入到数据库。
1、自动验证格式:
array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
array(验证字段2,验证规则,错误提示,[验证条件,附加规则,验证时间]),
验证条件:
self::EXISTS_VALIDATE 或者0 存在字段就验证(默认)
self::MUST_VALIDATE 或者1 必须验证
self::VALUE_VALIDATE或者2 值不为空的时候验证
验证时间:
self::MODEL_INSERT或者1新增数据时候验证
self::MODEL_UPDATE或者2编辑数据时候验证
self::MODEL_BOTH或者3全部情况下验证(默认)
2、自动完成格式:
array(完成字段1,完成规则,[完成条件,附加规则]),
array(完成字段2,完成规则,[完成条件,附加规则]),
完成时间:
self::MODEL_INSERT或者1&& 新增数据的时候处理(默认)
self::MODEL_UPDATE或者2&& 更新数据的时候处理
self::MODEL_BOTH或者3 所有情况都进行处理
小实例(注册)
HTML布局:
&form class="form-horizontal" action="{:U('Login/register')}" method="post" autocomplete="off" enctype="multipart/form-data"&
&div class="form-group"&
&label class="col-lg-2 control-label"&用户名&/label&
&div class="col-lg-4"&
&input class="form-control" type="text" name="username" /&
&div class="form-group"&
&label class="col-lg-2 control-label"&密码&/label&
&div class="col-lg-4"&
&input class="form-control" type="password" name="password" /&
&div class="form-group"&
&label class="col-lg-2 control-label"&重复密码&/label&
&div class="col-lg-4"&
&input class="form-control" type="password" name="repassword" /&
&div class="form-group"&
&label class="col-lg-2 control-label"&头像&/label&
&div class="col-lg-4"&
&input class="form-control" type="file" name="portrait" id="imgpath" /&
&img style="width: 100%;" src="" id="showimgpath" alt="头像"/&
&span class="help-block"&关像的大小为80*80px&/span&
&div class="form-group"&
&label class="col-lg-2 control-label"&性别&/label&
&div class="col-lg-4"&
&div class="btn-group" data-toggle="buttons"&
&label class="btn btn-default active"&
&input type="radio" name="gender" autocomplete="off" value="1" checked /& 男
&label class="btn btn-default"&
&input type="radio" name="gender" autocomplete="off" value="0" /& 女
&div class="form-group"&
&label class="col-lg-2 control-label"&电话号码&/label&
&div class="col-lg-4"&
&input class="form-control" type="input" name="phone" /&
&div class="form-group"&
&label class="col-lg-2 control-label"&邮箱&/label&
&div class="col-lg-4"&
&input class="form-control" type="input" name="email" /&
&div class="form-group"&
&div class="col-lg-2 col-lg-offset-2"&
&button class="btn btn-primary btn-block btn-submit" type="submit"&注册&/button&
模型(MemberModel)
namespace Admin\M
use Think\M
class MemberModel extends Model {
/* 自动验证 */
protected $_validate = array(
array('username', '', '用户名是唯一的!', self::EXISTS_VALIDATE, 'unique', self::MODEL_INSERT),
array('password', 'require', '没有填写密码!', self::EXISTS_VALIDATE, '', self::MODEL_INSERT),
array('repassword', 'password', '重复密码不正确!', self::EXISTS_VALIDATE, 'confirm', self::MODEL_INSERT),
array('phone','11','电话号码长度不对!', self::EXISTS_VALIDATE, 'length', self::MODEL_INSERT),
array('email', 'email', '邮箱格式不正确!',self::EXISTS_VALIDATE, '', self::MODEL_INSERT)
/* 自动完成 */
protected $_auto = array(
array('password', 'encrypt', self::MODEL_INSERT, 'callback'),
array('state','1',self::MODEL_INSERT),
array('portrait', 'portrait', self::MODEL_INSERT, 'callback'),
array('create_time', 'createTime', self::MODEL_INSERT, 'callback')
/* 给密码加密 */
public function encrypt() {
return md5(crypt(I('post.password/s'), 'zh'));
/* 创建时间 */
public function createTime() {
return time();
/* 上传头像 */
public function portrait() {
if($_FILES['portrait']['name']) { // 如果上传的头像
$upload = new \Think\Upload();// 实例化上传类
$upload-&maxSize
3145728 ;// 设置附件上传大小
$upload-&exts
array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload-&rootPath =
'./Uploads/portrait/'; // 设置附件上传根目录
// 上传单个文件
$upload-&uploadOne($_FILES['portrait']);
if(!$info) {// 上传错误提示错误信息
$this-&error($upload-&getError());
}else{// 上传成功 获取上传文件信息
$portraitPath = './Uploads/portrait/'.$info['savepath'].$info['savename'];
$image = new \Think\Image();
$image-&open($portraitPath);
// 生成一个居中裁剪为80*80的缩略图
$image-&thumb(150, 150,\Think\Image::IMAGE_THUMB_CENTER)-&save($portraitPath);
return $info['savepath'].$info['savename'];
对应的数据表结构:
在控制器中检测及插入到数据库:
/* 注册 */
public function register() {
if(IS_POST) {
$member = D('member');
if($member-&create()) {
if($member-&add()) {
$this-&success('注册成功!');
$this-&error('注册失败!');
exit($member-&getError());
$this-&display();
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具jquery.autocomplete 插件扩展滚动条加载更多
项目中用到autocomplete插件,但是插件的原有功能,不能满足项目全部需求所以修改了增加了以下几点功能:
1 粘贴文本自动加载数据
2 滚动条滚动到底部加载更多数据
3 与页面插件联动更新数据(清除缓存)
4 增加插件赋值给一个隐藏域,就可以得到文本和值 (做.net的用起来比较方便)
如果要启用滚动条加载更多数据
配置参数时加上
scroll:true,
pagingMore:true
在加载更多时请求的url参数会有一个page的参数
它标识当前请求的是第几页数据
ps(这个分页有一个小bug 假如总数据量正好是分页个数的倍数,当请求最后一页,它不能识别是否有下一页,所以可以再次请求下一页,由于时间原因我没有做改进,不影响正常使用)
$(document).ready(function () {
var $Text = //显示文本框
var $Value = //存值文本域
var $TxtBtnOrg = //联动控件1
var $UserGroup = //联动控件2
$Text.autocomplete(../Ajax/AutoCompleteAjax.ashx, {
minChars: 0,
type: POST,
extraParams: {//数据请求时的参数
type: 自己定义请求类型,
OrgIDs: function () {
if($TxtBtnOrg) return $TxtBtnOrg.val() },//联动控件取值13.
groupID:function () { return $UserGroup.val() }//联动控件取值
width: $Text.width(),
autoFill: false,
scroll:true,
pagingMore:true,
matchContains: word,
mustMatch: true,
dataType: json,
valueControl: $Value,
formatItem: function (row, i, max) {
+ row.k + ;
formatMatch: function (row, i, max) {
return row.k +
formatResult: function (row, value) {
return row.k;
setValue: function (data) {
//在此给隐藏域赋值
var data = data.data ||
var value = data.v || ;
$Value.val(value);
if (value != ) $Value.change();
//调用值改变事件
parse: function (data) {
var parsed = [];
for (var i = 0; i & data. i++) {
var row = data[i];
if (row) {
parsed[parsed.length] = {
data: row,
value: row.k,
result: this.formatResult && this.formatResult(row)
//用户ID反查Name值 (可以通过初始化隐藏域值进行初始化文本,当然也可以在后台把两个控件都赋值),因需求而定
if($Value.val()!= && $Text.val()==) $.post(../Ajax/AutoCompleteAjax.ashx,
{ type:getNameByID,gettype: &%=this.AutoCompleteType%&,id:$Value.val()},
function(data){console.log(data); if(data&& data.name) $Text.val(data.name) },json);
function Control_Reset() {
//当然这里的控件是不存在的,取控件应该不用我来教了
$Text.val().flushCache();//清除缓存列表()
$Value.val();
后台返回数据
private string GetAutoCompleteUser(string type)
string keys = request[q];
int count = Convert.ToInt32(request[limit]);//这个限定返回条数我们可以理解为分页大小
string tmpOrgIDs_ = request[OrgIDs];
int page = 1;
int.TryParse(request[page], out page);
//分页的页码(由于我在第一次请求时没有值page所以初始值为1)
DataTable dt = GetDtData(type);
var tmpData = dt.AsEnumerable();
var tmpData2 = tmpData.DistinctBy(c =& c.Field(ID)).Where(c =& c.Field(NAME).Contains(keys)).ToList();
if (count != 0 && page != 1)//这里count如果为0 返回所有符合条件的数据
tmpData2 = tmpData2.Skip((page - 1) * count).Take(count).ToList();
else if (count != 0)
tmpData2 = tmpData2.Take(count).ToList();
JArray tmpJarr = new JArray(from o in tmpData2
select new JObject(
new JProperty(o, o[ORG_NAME]),
new JProperty(k, o[NAME]),//personName
new JProperty(c, o[code]),
new JProperty(v, o[id].ToString())//userID
return tmpJarr.ToString();
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'当前位置: >
jQuery的自动完成插件 Autocomplete使用下载
时间: 10:26 来源:互联网 作者:源码搜藏 浏览:
jQuery的自动完成插件1.2.3 这个 jQuery插件 乔恩Zaefferer的(现在已经过时到jQuery用户界面) 的jQuery自动完成插件 ,用小的修改,以使UP / DOWN键,使输入元素文本的导航。 其中,自动完成是在通过UP / DOWN箭头键文本导航可能需要一个textarea元素用于
jQuery的自动完成插件1.2.3
使用代码示例:
$(&#f_prj_name&).autocomplete(&/list_projects_of_prefix&,&{
&&&&minChars:&1,
&&&&width:&310,
&&&&matchContains:&true,
&&&&autoFill:&false,
&&&&formatItem:&function(data,&i,&n,&v)&{
&&&&&&&&return&i&+&&:&&+&v;&&&&&&&&&&&&
&&&&formatResult:&function(data,v)&{
&&&&&&&&return&v;
而服务器返回的数据很简单,返回的文本每一行放一个匹配的结果即可。
运行后界面如下图所示:
乔恩Zaefferer的(现在已经过时到jQuery用户界面),用小的修改,以使UP / DOWN键,使输入元素文本的导航。其中,自动完成是在通过UP / DOWN箭头键文本导航可能需要一个textarea元素用于这是特别有用。这种微小的修补程序与记录在开发文件(jquery.autocomplete.js)相关线路的意见。该.min和.pack文件有没有在代码中的注释具体修复。
我们用它在为当用户想要写一个Twitter用户名或新的鸣叫中以前使用#标签,所以&@&和&#&是触发脚本。虽然没有触发,不过,仍然插件的劫持UP / DOWN箭头键使文字的导航一个痛苦的屁股当用户有多条线路。这种修改可以防止这种行为,劫持箭头键,只有当自动完成脚本已被触发。
原来的插件现在已经废弃,但这个mod使用jQuery 1.3.2效果很好THRU 1.4.4。
简介原来的插件,和原来的插件选项的说明都包含在文档文件夹中。(在jQuery的网站文件有望最终关闭。)
这种修改不应该打破任何在这些文档文件讨论的选项。
删节更新日志
1.2.3 --AGA
合并后的光盘的叉:删除depricated $ .browser(jQuery的1.9+)
合并miketaylr的叉:帐户在新戏改良后处理关键事件
正确的打字错误在之前的合并之一介绍
新的精缩和盒装版本
1.2.2 --AGA
合并agmcleaod的叉:加失败的选项哈希:失败
合并borkor的叉:新的选项不跳到第一个或最后一个位置:scrollJumpPosition
删除傻console.debug()行从测试遗留下来的。
1.2.1 --AGA
新增选项来激活选择列表与点击,而不是两个。clickFire默认为false。(请求人fgosfacdjtq /建议。)
增加的选择放弃输入焦点的项目选择。inputFocus被默认设置为true,但在选项设置为false将取消此行为。
绕过浏览器JS错误,当用户点击搜索结果列表的滚动条,然后单击导致名单毫不掩饰的名单之外。
上一页/下一页键更改劫持防止缺省行为只有在选择列表中是可见的。帮助input元素内的文本导航。
扩展setOptions时使用递归合并。(要求/建议由smarques)。
1.1.1 --AGA
UP / DOWN箭头键更改劫持防止缺省行为只有在选择列表中是可见的。帮助input元素内的文本导航。
见&changelog.txt&预1.1.1项由原作者。
下载地址/agarzola/jQueryAutocompletePlugin
你可能感兴趣的内容}

我要回帖

更多关于 thinkphp联动菜单 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信