ThinkPHP3.2.3 零起步3 – 入门实例
写一个简单的入门实例加说明,方便学习:
前台一个简单的页面显示数据
后台管理数据
1、简单的登录页面
2、文章管理界面
3、文章添加、修改界面
================================================================
ThinkPHP3.2.3是按MVC结构组织文件的
观察 /Application/Home 目录,有清晰的Model/View/Controller结构(文件夹名),实际上页面也是按MVC流程来显示的:
Model 提供数据
Controller 负责页面的显示,数据的显示,页面按钮事件的处理等 >> 网页的入口
View 提供html页面,内部动态的数据由变量代替,其值由Controller提供 >> Controller调用
1、自动生成Admin目录(网站在根目录下)
在/index.php中添加
define('BIND_MODULE', 'Admin');
打开浏览器,输入http://localhost/admin即可自动生成/Application/Admin目录,结构和Home一样
2、首先来分析文章管理页的实现
Model文件:无
Controller文件:/Application/Admin/Controller/IndexController.class.php
View文件:/Application/Admin/View/Index/index.html
ThinkPHP规定Controller文件默认的格式为:[View中文件夹名称]Controller.class.php
View中需要先建立Index文件夹,再添加index.html文件
index.html文件中的样式和图片,默认保存在/Public下,index.html中按如下方式调用:
其中__PUBLIC__默认值为/Public
数据库连接信息 默认位置: /Application/Common/Conf/config.php
在此文件中添加数据库连接信息,如:
'配置值' 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => '127.0.0.1',// 服务器地址 'DB_NAME' => 'test', // 数据库名 'DB_USER' => 'root', // 用户名 'DB_PWD' => '123456', // 密码 'DB_PREFIX' => 'think_', // 数据库表前缀 'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8 );
IndexController.class.php文件内容分析:
//CommonController是继承自Controller的二级类 //extends CommonCotroller 作用是先执行CommonController中的方法,判断用户是否登录 //如果没有登录则跳转到登录页面 class IndexController extends CommonController { /** * @函数 index :对应 View/Index/index.html文件 * @功能 显示后台管理主页面 */ public function index(){ //设置页面内容是html编码格式是utf-8 header("Content-Type:text/html; charset=utf-8"); //设置index.html中变量username的值为session('username') //在index.html中对应变量为:{$username} $this->assign('username',session('username')); //实例化文章模型 //M操作是thinkphp实例化操作,将数据表think_article实例化成对象,以调用thinkphp中封装好的各种数据操作方法 //ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法用于高效实例化一个基础模型类,D方法用于实例化一个用户定义模型类。 //对数据表进行简单的CRUD操作而无复杂的业务逻辑时,使用M方法;业务逻辑比较复杂,且涉及的表众多,需要使用 ThinkPHP 模型中一些高级功能如自动验证功能(create()方法中实现)、关联模型等,使用D方法 //think_:表前缀 $news=M('article'); $count=$news->count();//调用thinkphp的方法,返回表记录的数量 //调用thinkphp的分页类page实现分页显示效果 //分页显示文章列表,每页2篇文章 //import('ORG.Util.Page'); $page=new \Think\Page($count,2);//后台管理页面默认一页显示2条文章记录 $page->setConfig('prev', "上一页"); //上一页 $page->setConfig('next', '下一页'); //下一页 $page->setConfig('first', '首页'); //第一页 $page->setConfig('last', '末页'); //最后一页 $page->setConfig('theme','%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%'); //设置分页回调方法 $show=$page->show(); //查询并筛选数据 //使用thinkphp内置的方法,执行sql语句 //下面的句子相当于:select id,subject,author,createtime from think_article order by id desc $news_list=$news->field(array('id','subject','author','createtime'))->order('id desc')->limit($page->firstRow.','.$page->listRows)->select(); //对原始信息过滤 $this->filter($news_list); //设置index.html中对应变量的值 $this->assign('news_count',$count); $this->assign('title','后台管理系统'); $this->assign('news_list',$news_list);//文章数据 $this->assign('page_method',$show);//分页数据 $this->display();//显示index.html } /** * @函数 quit * @功能 登出账户,跳转至登录页面。并清除Session */ public function quit(){ session(null);//清空所有session信息 //U方法用于完成对URL地址的组装,可以自动根据当前的URL模式和设置生成对应的URL地址; 自动跳转到 View/Login/index(注意:会先执行 LoginController.class.php) redirect(U('Login/index'), 0, '重新登录'); } /** * @函数 article * @功能 编辑新的文章 */ public function article(){ //跳转到Article控制器的index方法 redirect(U('Article/index'), 0, '写新文章'); } /** * @函数 delete * @功能 删除文章 */ public function delete(){ //跳转至Article控制器来实现 if($_GET['id']){ //跳转到 Admin/Contrlloer/ArticleController.class.php,执行其中的delete方法,并传参 id=_Get['id'] redirect(U('Admin/Article/delete/id/'.$_GET['id']), 0, '删除文章'); } else{ $this->error('参数错误!'); } } /** * @函数 edit * @功能 编辑文章 */ public function edit(){ if($_GET['id']){ redirect(U('Admin/Article/index/id/'.$_GET['id']), 0, '写新文章'); } else{ $this->error('参数错误!'); } } /*-----------------------内部方法------------------------*/ /** * @函数 filter * @功能 对数据库中的信息进行裁剪和过滤 */ private function filter(&$list){ foreach($list as $key=>$value){ //设置显示的创建时间 $list[$key]['createtime']=date("Y-m-d H:i:s",$value['createtime']); //设置显示的最后修改时间 if(!$value['lastmodifytime']){ $list[$key]['lastmodifytime']="无"; }else{ $list[$key]['lastmodifytime']=date("Y-m-d H:i:s",$value['lastmodifytime']); } //文章标题过长时裁剪 if(strlen($list[$key]['subject'])>80){ $list[$key]['subject']=$this->cutString($list[$key]['subject'],0,20).'...'; } } } /** * @函数 cutString * @功能 字符串裁剪(仅适用于UTF-8) */ private function cutString($str, $from, $len) { return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'. '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s', '$1',$str); } }
Index/index.html文件重要内容分析:
{$username}
文章标题 | 作者 | 添加时间 | 最后修改 | 选项 | |
---|---|---|---|---|---|
{$vo['subject']} | {$vo['author']} | {$vo['createtime']} | {$vo['lastmodifytime']} | ||
{$page_method}
|
ArticleController.class.php文件内容分析
assign('title','添加/修改文章'); if($id=(int)$_GET['id']){ $article=M('article'); $article_item=$article->where("id=$id")->find(); $this->assign('article_item',$article_item); $this->assign('btn_ok_text','完成修改'); $this->assign('btn_ok_act','update'); }else{ $this->assign('btn_ok_act','add'); $this->assign('btn_ok_text','添加文章'); } $this->display(); } /** * @函数 add * @功能 文章添加完成,写入数据库 */ public function add(){ header("Content-Type:text/html; charset=utf-8"); //调用D方法实例化表对象 $article=D('Article'); //create():创建数据对象,最大的作用是自动获取表单数据并完成一系列的操作和过滤(通过自动验证、自动完成、令牌证等等)。创建好的数据对象可以用于写入数据库等操作 //一般与D('XXX')一起用 if($article->create()){ //设置表内字段值 $article->message = $_POST['editorValue']; $article->author = session('username'); //将文章写入数据库 //success方法与error方法用于实现带提示信息的页面跳转功能,可实现添加数据后显示提示信息并跳转的效果 if($article->add()){ //add():添加数据 $this->success('文章添加成功,返回上级页面',U('Index/index')); }else{ $this->error('文章添加失败,返回上级页面'); } }else{ $this->error($article->getError()); } } /** * @函数 delete * @功能 删除文章 */ public function delete(){ $article=M('article'); if($article->delete($_GET['id'])){ $this->success('文章删除成功'); }else{ $this->error($article->getLastSql()); } } /** * @函数 update * @功能 更新修改后的文章到数据库 */ public function update(){ header("Content-Type:text/html; charset=utf-8"); $article=M('Article'); $data = array('subject'=>$_POST['subject'],'message'=>$_POST['editorValue'],'lastmodifytime'=>time()); $id=$_POST['id']; $article->where('id='.$id)->setField($data); // 根据条件保存修改的数据 $this->success('文章更新成功'); } /** * @函数 quit * @功能 登出账户,跳转至登录页面。并清除Session */ public function quit(){ session(null);//清空所有session信息 redirect(U('Login/index'), 0, '重新登录'); } }
Model/ArticleModel.class.php 文件分析
执行 create()方法时会进行自动验证与自动填充,即执行:_validate 和 _auto //标题自动验证 protected $_validate=array( array('subject','require','文章标题必须非空'),//默认情况下用正则验证 array('subject','callback_checklen','标题内容过长',0,'callback'), array('message','require','文章内容必须非空'), ); //字段长度验证回调函数(ThinkPHP会自动帮我们传递参数) function callback_checklen($data){ if(strlen($data)>200){ return false; } return true; } //自动完成,在create时自动执行 //array('填充字段','填充内容','填充条件','附加规则'); //填充字段 protected $_auto=array( array('createtime','time',1,'function'),//对createtime字段自动写入当前时间戳 ); }