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'//路径别名
    )
    )
  3. 控制器中添加
    ```php
    $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);
}

原文地址:https://www.cnblogs.com/jesse131/p/9079314.html

时间: 2024-10-03 00:30:35

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

libgdx学习记录16——资源加载器AssetManager

AssetManager用于对游戏中的资源进行加载.当游戏中资源(图片.背景音乐等)较大时,加载时会需要较长时间,可能会阻塞渲染线程,使用AssetManager可以解决此类问题. 主要优点: 1. 大多数资源加载器AssetLoader都是异步加载,可以避免阻塞渲染线程. 2. 通过引用计数来进行释放资源. 3. 通过一个对象来管理所有其他资源. 主要函数: load(path,type)加载某个路径的资源文件,后面type指定所要加载的资源类型.这个函数只是将资源文件加入到资源队列中,并不会

程序的机械级表示学习记录

程序的机械级表示学习记录 X86的三代寻址方式 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全. 8086的分段模式. IA32的带保护模式的平坦模式. 对于机械级编程的两种重要抽象 ISA:机械级程序的格式和行为,定义为指令集体系结构,它定义了处理器状态.指令的格式,以及每条指令对状态的影响. 虚拟地址:机器级程序使用的存储器地址,提供的存储器模型看上去是一个非常大的数组.存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来的. 在GCC中获得汇编代码与反汇编 获得汇编代码:

struts2 学习记录 过滤器 国际化

struts2接触不是一天两天了,但是一直没有用它做什么项目,但老师确一直说它有很大的学习价值,所以还是把我学习到的东西给记录一下,记录的东西没有规律,只是给自己留个备份, struts2中最关键的是action,action可以用来传值,用起来很方便,它可以用el表达式在jsp页面上展示出来,也可以用ognl,el只能表达作用域里面的值,而struts2里面还有个放数据的地方叫做ActionContext,这个类里面可以放不在作用域里的键值对,但是el表达式还是可以获取到,但是效率很低,所以尽

libgdx学习记录19——图片动态打包PixmapPacker

libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题,这里针对的是0.9.9版本) 2. 使用TexturePacker将图片打包好然后作成一张大图添加进来. 第二种方法是常用方法,但是不太灵活,添加.删除某些图片不太方便,改动较大.这里可以考虑使用PixmapPacker将图片进行动态打包. 主要方法: pack(String name, Pixm

C#学习记录4——结构体,接口

1.结构体 对于C++语言来说,其实结构体和类几乎没有什么太大的区别.类能够实现的功能,使用结构体大部分也可以. 不过,在C#里面,我们把结构体看作是一种轻量的类的替代品.它和类一样有构造方法,属性,成员属性/数据,甚至是操作符.注意struct构造方法必须有传入参数. 当然struct也不是完全支持类的所有功能的. 首先,结构体无法进行继承.也就是说,结构体不想类那样灵活,代码也无法复用. 其次,也是非常重要的一点:结构体是一种值类型,而类是引用类型.这两种类型的区别,可以查看C#学习记录3上

libgdx学习记录23——图片移动选择

模拟移动选择图片,采用相机实现. 1 package com.fxb.newtest; 2 3 import com.badlogic.gdx.ApplicationAdapter; 4 import com.badlogic.gdx.Gdx; 5 import com.badlogic.gdx.graphics.Color; 6 import com.badlogic.gdx.graphics.GL10; 7 import com.badlogic.gdx.graphics.Texture;

libgdx学习记录17——照相机Camera

照相机在libgdx中的地位举足轻重,贯穿于整个游戏开发过程的始终.一般我们都通过Stage封装而间接使用Camera,同时我们也可以单独使用Camera以完成背景的移动.元素的放大.旋转等操作. Camera分为PerspectiveCamera(远景照相机)和OrthographicCamera(正交照相机). PerspectiveCamera为正常的照相机,当距离物体越远,则物体越小,一般在3D空间中使用. OrthographicCamera忽略了其Z轴,不管距离物体多远,其大小始终不

libgdx学习记录11——平铺地图TiledMap

地图对于游戏场景十分重要,很多游戏都需要对地图进行编辑,可使用TileMap进行编辑并生成对应的tmx格式地图文件. 编辑好后,可通过TmxMapLoader来读取地图文件.可通过一个正交相机OthographicCamera和正交地图渲染器OrthogonalTiledMapRenderer来进行显示. 实例如下: 1 package com.fxb.newtest; 2 3 import com.badlogic.gdx.ApplicationAdapter; 4 import com.ba

Python学习记录day3

Python学习记录 day3 今天是银角大王武sir讲课.先回顾了上节课所学,然后讲到了面向对象思想. set set是一个无序且不重复,可嵌套的元素集合 class set(object):     """     set() -> new empty set object     set(iterable) -> new set object     Build an unordered collection of unique elements.