最近工作中用到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();

为模块设置单独布局文件

  1. 在模块下面的视图views文件夹里面的components文件中设置public $layout='//layouts/xx';xx是自己的布局,去掉/
  2. 在模块下面的视图views文件夹里面建立layouts文件夹,里面放置模块的布局文件,
  3. 如果后台模块没有公共区域直接在布局文件里

六、数据库连接配置与模型定义

数据库连接配置

'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'=>'&nbsp')
)
?>
//创建上传图片
$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;
}

扩展缩略图类

  1. 在extensions中建立CThumb/CThumb.php文件
  2. 在main.php里面配置
'components'=> array(
'thumb' => array(
'class' => 'ext.CThumb.CThumb'//路径别名
)
)
  1. 控制器中添加
$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);
}

Yii1.1.16学习记录的更多相关文章

  1. 16 | “order by”是怎么工作的? 学习记录

    <MySQL实战45讲>16 | “order by”是怎么工作的? 学习记录http://naotu.baidu.com/file/0be0e0acdf751def1c0ce66215e ...

  2. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  3. Matlab 进阶学习记录

    最近在看 Faster RCNN的Matlab code,发现很多matlab技巧,在此记录: 1. conf_proposal  =  proposal_config('image_means', ...

  4. 在Ubuntu Server下搭建LAMP环境学习记录

    更新于2015/6/16日,因图片地址失效,请在此地址查看:http://note.youdao.com/share/?id=1c249ae6dc6150cbf692adec67b23a33& ...

  5. 【转】BLE 学习记录

    原文网址:http://m.blog.csdn.net/blog/chiooo/43985401 BLE 学习记录 ANROID BLE 开发,基于 bluetoothlegatt 分析 mBluet ...

  6. Material Calendar View 学习记录(二)

    Material Calendar View 学习记录(二) github link: material-calendarview; 在学习记录一中简单翻译了该开源项目的README.md文档.接下来 ...

  7. Thrift学习记录

    Thrift学习记录 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++,Java,Python,PHP,Ruby,Erlang, ...

  8. ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

    分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...

  9. GIT初始学习记录

    目录 GIT学习记录 配置github与gitlib两个账号 基本操作 git init:初始化仓库 git status:查看仓库状态 git add :向缓存区中添加文件 git commit 保 ...

随机推荐

  1. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

  2. 07-部署Flanneld网络

    部署Flanneld网络 Flanneld:用于解决容器之间网络互通,这里我们要配置TLS认证. Docker1.12.5:docker的安装很简单,这里也不说了. 配置Flanneld 这里我们使用 ...

  3. RabbitMQ常见错误1

    java.lang.IllegalStateException: Invalid configuration: 'exchange' must be non-null. at com.rabbitmq ...

  4. Delphi常用快捷键

    delphi是我学编程时的入门语言,用过一年多的时光,个人对它还是挺喜欢的.现在用的少了,一些快捷键和语法也有些遗忘了,这里对delphi的快捷键做个总结,留个纪念.嘿嘿,不知道还有多少人还用着这门语 ...

  5. jquery实现点击文字后变成文本框且可修改

    $(function() { //获取class为caname的元素 $(".caname").click(function() { var td = $(this); var t ...

  6. MongoDB设计系列

    原创文章,如果转载请标明出处.作者. https://www.cnblogs.com/alunchen/p/9762233.html 1 前言 MongoDB作为现今流行的非关系型文档数据库,已经有很 ...

  7. C#格式规范

    前言 之前工作中整理的一篇编码规范. 代码注释 注释约定 只在需要的地方加注释,不要为显而易见的代码加注释 使用 /// 生成的xml标签格式的文档注释 方法注释 所有的方法都应该以描述这段代码的功能 ...

  8. ios --xib自定义,解决在导航栏不透明的情况下,自定义xib view高度被压缩64的问题

    在使用xib自定义view的时候,个人习惯性的直接使用xib中的约束,所以自然而然的要打开Autolayout.以前在使用的时候没有发现什么问题,最近项目中使用的时候突然发现在导航栏透明的情况下,出现 ...

  9. Java 多态 ——一个案例 彻底搞懂它

    最近,发现基础真的hin重要.比如,Java中多态的特性,在学习中就是很难懂,比较抽象的概念.学的时候就犯糊涂,但日后会发现,基础在日常工作的理解中占有重要的角色. 下面,我将用一个代码实例,回忆和巩 ...

  10. elasticsearch6.7 05. Document APIs(9)Bulk API

    8.Bulk API 可以把多个index或delete操作放在单个bulk API中执行.这样可以极大地提高索引速度. /_bulkAPI使用如下的JSON结构: action_and_meta_d ...