一、Introduction
YII,易框架。纯OOP,面向对象的,用了很多设计模式。
二、安装和使用Yii
1. 安装
不同于ci和tp等,yii提供两种安装方式,使用composer或者下载应用模版。官网推荐使用前者。根据官网指引,下载windows版的composer-setup.exe,然后安装最新的composer,根据指引下载composer.phar,放到在php.exe的同级目录,在这个目录创建composer.bat,里面写入@php "%~dp0composer.phar" %*,将php.exe添加到环境变量path,运行composer.bat,然后在cmd输入composer –v,查看是否安装成功。然后按照yii官网提示,执行php composer.phar create-project yiisoft/yii2-app-basic basic 2.0.13安装basic版的template或执行php composer.phar create-project yiisoft/yii2-app-advanced advanced2.0.13安装进阶版的,也就是hmvc版的,本质上一样,只是目录结构的复杂度的区别。目录结构中,vendor中放供应商的包,也就是第三方类包,比如yii、smarty、htmlpurifer等,在advanced的目录中,console放控制台脚本,就是cmd运行的php。另外,不同于tp等的是,yii框架的入口文件在web目录下。
2. 使用
在站点下创建项目目录,将yii的basic中所有文件和目录复制到项目目录下。
在浏览器运行项目,运行的前提是设置了config目录下的web.php中的'cookieValidationKey'=> 'K2Jpjy23ujgXhnIltznpy67pLL0ro8rD',设置密钥。
控制器命名要以Controller.php结尾,比如GoodsController.php,控制器需要设置命名空间,类名与文件名相同,方法名以action开头,类似java的ssh框架的一些命名规范,比如:
模型的命名没有规则,需要继承Model模型,如果这个模型要对应一张表,需要继承ActiveRecord。
在控制器生成模型,先引入模型,然后使用new关键字;或者不引入而是直接只用路径。引入类,非常类似java中使用类时的引入。也是yii面向对象的一个体现。
$blogModel = new Blog;
$blogModel = new \app\models\Blog;
视图,在views下创建与控制器名字一致的目录,比如blog,静态页以php结尾,比如lst.php。
在控制器加载视图和传数据
return $this->render('lst', [
'name'=> 'tom',
'age'=> '12',
]);
在视图接收数据直接使用php标签。
在yii访问的url默认是http://www.php2.com/yiiblog/web/index.php?r=blog/lst
在views下面有layout布局文件的目录,使用return会默认使用这个目录下的布局文件。
如果使用自定义的布局,可以在这个目录下创建自己的布局文件,然后在控制器中,定义布局属性,使用自定义的布局文件,比如,创建了mylayout.php的布局文件,在控制器中
//定义布局文件
public $layout = 'mylayout';
如果不使用布局文件,可以设置public $layout = false;或者调用renderPartial方法,
return$this->renderPartial('lst', [
'name'=> 'tom',
'age'=> '12',
]);
注意,yii中数组的写法使用了php5.4以后扩展的写法,以中括号括住内容。
三、Yii的代码生成器
1. 准备工作
配置数据库
'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=eshopphp',
'username' => 'root',
'password' => '123456',
'charset' => 'utf8',
'tablePrefix' => 'es_',
// Schema cache options (for production environment)
//'enableSchemaCache' => true,
//'schemaCacheDuration' => 60,
//'schemaCache' => 'cache',
];
2. 进入gii页面
http://www.php2.com/yiiblog/web/index.php?r=gii
3. 生成
生成模型,crud等。
4. 在yii中显示中文
在web.config中添加
'language' => 'zh-cn',
5. 资源管理包
yii中的资源管理包,用于管理css、js等文件。比如如果需要在页面中引入样式文件。
$this->registerCssFile('index.css');
$this->registerJsFile('index.js');
四、使用Yii制作一套增删改查翻页
首先,改db.php为要使用的数据库和表前缀。
然后导入日志的模版到views/blog下,制作布局文件。
制作布局文件时推荐使用yii提供的布局的范例,因为yii提供的布局中使用了csrf,防跨站表单提交技术。
然后,把模版中的样式和js文件等复制到web目录下。
设置使用自定义的布局文件,在控制器中,public$layout = 'blog';或者在页面中,context->layout = 'blog'; ?>也可以在视图页设置标题
title = '博客别表';
$this->context->layout = 'blog'; ?>
1. 添加
复制add的模板到add.php。
使用gii生成日志模型。
修改生成的模型中的表单验证规则。
修改add.php的提交路径,并在form表单中添加用于csrf的隐藏域,
编写控制器
request->isPost)
{
//生成模型
$model = new Blog;
//接收表单
$model->attributes = Yii::$app->request->post();
//添加时间加入模型
// $model->addtime = date('Y-m-d H:i:s');
//验证表单并且插入数据库
if($model->insert())
{
return $this->redirect(['blog/lst']);
}
else
{
var_dump($model->getErrors());
}
}
return $this->render('add');
}
/**
* 博客列表页
*/
public function actionLst()
{
$blogModel = new Blog;
$blogModel = new \app\models\Blog;
return $this->render('lst', [
'name' => 'tom',
'age' => '12',
]);
}
}
2. 翻页搜索
在模型中添加搜索翻页的方法
/**
* 翻页和搜索
*/
public function search($perPage = 5)
{
//预查询返回一个query对象
$query = $this->find();
/**************************搜索*****************************/
//设置搜索的条件
//标题
$title = Yii::$app->request->get('title');
if($title)
{
$query->andFilterWhere(['like', 'title', $title]);
}
/**************************翻页*****************************/
$page = new Pagination([
'totalCount' => $query->count(),
'pageSize' => $perPage,
]);
/************************取数据************************/
$data = $query->offset($page->offset)->limit($page->limit)->all();
return [
'data' => $data,
'page' => $page,
];
}
在控制器中调用模型中的搜索翻页方法
/**
* 博客列表页
*/
public function actionLst()
{
$model = new Blog;
$data = $model->search(2);
// var_dump($data);die;
return $this->render('lst', $data);
}
3. 删除
编写控制器中的delete方法
/**
* 删除方法
*/
public function actionDelete($id)
{
$model = new Blog;
$model->findOne($id)->delete();
$this->redirect(['blog/lst']);
}
表单中删除按钮
删除
4. 修改
编写控制器的修改方法
/**
* 修改方法
*/
public function actionSave($id)
{
//生成模型
$model = new Blog;
//先将要修改的数据放入模型
$model = $info = $model->findOne($id);
if(Yii::$app->request->isPost)
{
//用修改好的数据覆盖原数据
$model->attributes = Yii::$app->request->post();
//添加时间加入模型
// $model->addtime = date('Y-m-d H:i:s');
//验证表单并且修改数据
if($model->save())
{
return $this->redirect(['blog/lst']);
}
else
{
//错误信息传到页面
return $this->render('save',
['error' => $model->getErrors(), 'info' => $info]
);
}
}
return $this->render('save', ['info' => $info]);
}