最近工作中用到Yii框架,为此专门在网上找了些相关教程学一下,尽管教程比较老,但学完后至少对Yii框架有了基本了解,特别是widget的使用,感觉Yii真的很强大。
一、框架介绍与安装
框架源码下载
点击官网
安装
在命令行进入到framework 目录
执行 :
php yiic.php webapp ../blog
在 windows系统中运行 yiic 时,如果出现"php.exe" 不是内部或外部命令,也不是可运行的程序,或批处理文件,需要把php目录添加环境路径里面去。
二、创建与设置默认控制器并载入模板
创建控制器
class IndexController extends Controller{
public function actionIndex(){
echo 'jesse';
}
}
访问:index.php?r=index/index
r=后面,第一个是控制器,第二个是方法, r就是路由route的缩写
配置默认控制器
默认访问:控制器SiteController下面的actionIndex方法
Config/main.php是主配置文件,在其中加入:
'defaultController' => 'Index',
载入外部文件
Css与js等一些文件放入assets里面,按照前后台分开
Yii::app()->request->baseUrl
Yii::app()返回的是你在index.php里创建的CWebApplication实例。在一次请求处理过程中,这是个唯一的实例。
Yii::app()主要负责一些全局性的功能模块。
载入视图
$this->render();会加载布局
$this->renderPartial();不会加载布局(也不能载入框架自带的jquery等)
建立文件夹需要根据控制器名字来建立,里面的文件名也就是render或者renderPartial方法传递的名字
如何在视图中处理分配的数据
在Yii框架中,数据以对象的形式存在
<?php foreach ($article as $v):?>
<li><?php echo $v->title;?></li>
<?php endforeach;?>
扩展自定义函数
在protected目录下建立funtions.php文件
在单入口引入函数require_once('./protected/functions.php');
三、前台模板载入与layouts使用
将静态模板文件(js、css、img)放置在assert文件夹中,在views文件夹下的php模板中调整好静态文件的链接
将php模板中的文件中的公共部分可提取放置在layouts文件夹内,并在components/Controller.php文件中设置所使用的公有布局文件
四、gii模块使用与widget使用
gii模块使用
打开模块,在config/main.php
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'Enter Your Password Here',//设置密码
'ipFilters'=>array('127.0.0.1','::1'),
),
访问创建http://localhost/yiitest/shop/index.php?r=模块名字
生成Generators
添加后台ID
需要在main.php里面配置
'gii'=>array(
),
'admin'//加入后台你创建的ID
访问模块modules
http://localhost/yiitest/shop/index.php?r=模块/控制器/方法
小物件widget使用
CActiveForm 类下面找方法
<?php $form = $this->beginWidget('CActiveForm') ?>
<?php echo $form->textField(模型,'表单名',html属性)) ?>
<?php $this->endWidget() ?>
五、验证码的使用与规则设置
验证码的使用
public function actions(){
return array (
'captcha'=> array(
'class'=> 'CCatpchaAction',
'height'=> 25,
'width'=>80,
'minLength'=>4,
'maxLength'=>4
)
)
)
带有点击刷新:
$this->widget('CCaptcha',array('showRefreshButton'=>false,'clickableImage'=>true,'imageOptions'=>array('alt'=>'点击换图','title'=>'点击换图','style'=>'cursor:pointer')));
显示错误信息
<?php echo $form->error('模型','name名')?>
修改核心类:
在framework/web/widgets/ captcha/CCaptchaAction.php修改run方法里面:
$this->renderImage($this->getVerifyCode(TRUE));
设置验证规则:
在loginForm.php的rules方法里:
array('name','captcha','错误信息');
array('verify',' captcha','message'=>'验证码错误');
通过验证:
$loginForm->attributes = $_POST['LoginForm'];
$loginForm->validate();
为模块设置单独布局文件
- 在模块下面的视图views文件夹里面的components文件中设置public $layout='//layouts/xx';xx是自己的布局,去掉/
- 在模块下面的视图views文件夹里面建立layouts文件夹,里面放置模块的布局文件,
- 如果后台模块没有公共区域直接在布局文件里
六、数据库连接配置与模型定义
数据库连接配置
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=blog',
'emulatePrepare' => true,//PDO扩展
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'tablePrefix' => 'hd__'//定义表前缀,
'enableParamLogging' => TRUE//开启调试信息的SQL语句具体值信息
)
查询动作
User::model()->find(
'username=:name',
array(':name'=>'admin')
)
七、session使用与redirect和createUrl
session使用
存储:
Yii::app()->session['logintime'] = time();
调用:
Yii::app()->session['logintime']
清除:
Yii::app()->session->clear();
Yii::app()->session->destroy();
退出登陆:
Yii::app()->user->logout();
redirect跳转
如果在当前控制器下:
$this->redirect(array('index'))//跳转到当前控制器index方法
访问其他控制器方法:
$this->redirect(array('控制器/方法'))
createUrl方法使用
在视图中用
$this->createUrl('控制器/方法',get参数);
$this->createUrl('article/index',array('aid'=>3));
八、模型规则与标签设置开启前台验证
标签设置
public function attributeLabels(){
return array(
'passwd' => '原始密码',
);
}
规则设置
public function rules(){
return array(
array('passwd','required', 'message'=>'原始密码必填'),
);
}
开启前台验证
必须用render(),在小物件中调用
$form=$this->beginWidget('CActiveForm', array(
'id'=>'contact-form',
'enableClientValidation'=>true,
'clientOptions'=>array(
'validateOnSubmit'=>true,
),
));
九、修改动作与成功提示信息
操作成功提示
控制器中:
Yii::app()->user->setFlash('s','添加成功');
视图中:
If(Yii::app()->user->hasFlash('s')){
echo Yii::app()->user->getFlash('s');
}
十、AR类的增删查改
增加
$model = new Model();
$model->attributes = $_POST['user'];
$model->save();
save方法,在new Model的时候是增加,在$model::model()的时候是修改。
删除
model::model()->deleteByPk($id)
查询
find() 查询一条信息
例:find('username=:name' ,array(':name'=>'admin'))
findByPk() 通过主键来查询
例:findByPk(1)
findBysql() 通过SQL来查询出一条
例:findBySql('SELECT * FROM {{admin}}')
findAll() 查询多条信息
例:findAll('color=:color' ,array(':color'=>'red'))
findAllByPk() 通过主键来查询,可以多个主键
例:findAllByPk (array(1,2))
findAllBysql() 通过SQL来查询出多条
例:findAllBysql ('SELECT * FROM {{admin}}')
更改
$model = Model::model();
$info = $model->findByPk($id);
if(isset($_POST['user'])){
$info->attributes = $_POST['user'];
$info->save()//此时save是修改
}
$this->render('edit',array('model'=>$info));
十一、小物件创建radio与select
//创建redio
<?php
echo $form->radioButtonList(
$articleModel,
'type',
array(0=>'普通',1=>'热门'),
array('separator'=>' ')
)
?>
//创建上传图片
$form = $this->beginWidget('CActiveForm', array('htmlOptions'=>array('enctype'=>'multipart/form-data')));
<?php echo $form->fileField($articleModel, 'thumb') ?>
//创建select
<?php echo $form->dropDownList($articleModel,'cid', $cateArr) ?>
//创建textarea
<?php
echo $form->textArea(
$articleModel,
'info',
array('cols'=>50,'rows'=>10,'maxlength'=>100)
)
?>
十二、上传类与扩展第三方类略图类的使用
上传类
$model = new model();
$model->thumb = CUploadedFile::getInstance($model,'thumb');
if($model->thumb){
$name = 'img_' . time() . mt_rand(0,999);
$img = $name . '.' . $model->thumb->extensionName;
$model->thumb->saveAs('uploads/' . $img);
$model->thumb = $img;
}
扩展缩略图类
- 在extensions中建立CThumb/CThumb.php文件
- 在main.php里面配置
'components'=> array(
'thumb' => array(
'class' => 'ext.CThumb.CThumb'//路径别名
)
)
- 控制器中添加
$path = dirname(Yii::app()->BasePath) . '/uploads/';
$thumb = Yii::app()->thumb;
$thumb->image = $path . $imgName;
$thumb->width = 130;
$thumb->height=95;
$thumb->mode = 4;
$thumb->directory = $path;
$thumb->defaultName = $preRand;
$thumb->createThumb();
$thumb->save();
十三、分页类与后台权限认证
分页类
//controller
$criteria = new CDbCriteria();//AR的另一种写法
$model = Model::model();
$total = $model->count($criteria);//统计总条数
$pager = new Cpagination($total);//实例化分页类
$pager->pagerSize = 3;//每页显示多少条
$pager->applyLimit($criteria);//进行limit截取
$info = $model->findAll($criteria);//查询截取过的数据
$data = array('info'=>$info,'pages'=>$pager);
$this->render('index',$data);
//views
$this->widget('CLinkPager', array(
'header' => '',
'firstPageLabel' => '首页',
'lastPageLabel' => '末页',
'prevPageLabel' => '上一页',
'nextPageLabel' => '下一页',
'pages' => $pages,
'maxButtonCount'=> 5,
));
权限验证
public function filters(){
return array(
'accessControl' //可以用 + -来控制那个方法是否验证
);
}
public function accessRules(){
return array(
array(
'allow',
'actions' => array('index'),
'users' => array('@')
),
array(
'deny',
'users' => array('*')
),
);
}
allow 允许 deny 拒绝
- 代表所有用户
- @ 代表登陆用户
- ? 代表匿名用户
配置默认登陆界面,在main.php
'user'=> array(
//加上
loginUrl => array('admin/login/index')
)
十四、前台数据分配
十五、伪静态路由与缓存
隐藏单入口
- 保证apache配置文件httpd.conf里的LoadModule rewrite_module modules/mod_rewrite.so开启(去掉#)
- 将相对应目录的AllowOverride 改为ALL
- 在根目录下,即在index.php同级目录下新建.htaccess
.htaccess文件内容如下
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php
开启缓存
在main.php的组件components中配置设置缓存
'cache' => array(
'class' => 'system.caching.CFileCache'
)
也就是framework/caching/CFileCache.php
片段缓存
<?php if($this->beginCache($id,array('duration'=>1))): ?>
//缓存内容
<?php $this->endCache();endif ?>
duration 时间,以秒为单位
整页缓存
public function filters(){
return array(
array(
'system.web.widgets.COutputCache + index',
'duration' => 30,
'varyByParam'=> array('aid')
)
);
}
数据缓存
$value = Yii::app()->cache->get($id)
if($value == false){
Yii::app()->cache->set($id, $value);
}