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字段自动写入当前时间戳
);
}