Fork me on GitHub

Yii1.1.16学习记录

最近工作中用到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);
}
posted @ 2018-05-23 20:57  Jesse131  阅读(995)  评论(0编辑  收藏  举报