• 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);
    }
    
  • 相关阅读:
    听说,好久不更了......
    JavaScript中数组常用方法
    html5常用英语单词
    重写与重载的区别
    RelativeLayout以及ListView
    树莓派基础配置
    通过yum安装lnmp-phpmyadmin
    POJ1850
    基于字典序的组合生成算法
    全排序之字典排序
  • 原文地址:https://www.cnblogs.com/jesse131/p/9079314.html
Copyright © 2020-2023  润新知