zoukankan      html  css  js  c++  java
  • YII学习笔记

    YII知识小结:

    1.YII默认控制器为 SiteController 默认控制器可以通过配置文件 application/config/main.php修改,指定 defaultController即可, 如 'defaultController' => 'home',

    2.控制器的默认方法为actionIndex 可以通过定义控制器属性 defaultAction来设置,如 public $defaultAction = 'lists';

    3.获取Controller ID Yii::app()->getController()->id 获取Action ID Yii::app()->getController()->getAction()->id 类:system.web.CWebApplication

    4.获取POST参数 Yii::app()->request->getPost('name'); 获取GET参数 Yii::app()->request->getQuery('name');

    5.判断提交方式 Yii::app()->request->isPostRequest Yii::app()->request->isAjaxRequest 类:system.web.CHttpRequest

    6.view中导入js、css、Meta 类:system.web.CClientScript

    //导入CSS
    Yii::app ()->clientScript->registerCssFile ( Yii::app()->baseUrl.'/uploadify.css', CClientScript::POS_HEAD );
    //导入YII集成JQUERY
    Yii::app ()->clientScript->registerCoreScript ( 'jquery' );
    //导入外部JS
    Yii::app ()->clientScript->registerScriptFile ( Yii::app()->baseUrl.'/jquery.uploadify.min.js', CClientScript::POS_HEAD );
    //Meta信息
    Yii::app()->clientScript->registerMetaTag('关键字','keywords');
    Yii::app()->clientScript->registerMetaTag('些描述','description');
    Yii::app()->clientScript->registerMetaTag('作者','author');
    Yii::app()->clientScript->registerMetaTag(' text/html;charset=utf-8', null, 'Content-Type');

    7.生成URL可以使用 Yii::app()->createUrl('post/read', array('id' => 1))

    8.main.php引用其他配置文件可用'params'=>require(dirname(__FILE__).'/params.php'), params.php直接返回数组即可,如return array();访问方式则为Yii::app()->params['paramName']

    9.数据在保存、查找、验证前后调用before、afeter方法,如:beforeSave、afterSave、beforeValidate

    protected function beforeSave() 
    {
        if(parent::beforeSave()) {
            if($this->isNewRecord) {
                $this->create_time = date("Y-m-d H:i:s");
            } else {
                $this->update_time = date("Y-m-d H:i:s");
            }
            return true;
        } else {
            return false;
        }
    }

    10.表单验证时可以指定应用场景,如$model = new Post('create') 或者通过$post->scenario = 'create' 指定

    11.获取http://127.0.0.1/test/index?var=val的内容:

    Yii::app()->request->getUrl /test/index?var=val
    Yii::app()->request->getHostInfo http://127.0.0.1
    Yii::app()->request->getPathInfo test/index
    Yii::app()->request->getRequestUri /test/index?var=val
    Yii::app()->request->getQueryStringvar=val

    12.判断是否为AJAX动作:

    Yii::app()->request->isAjaxRequest

    13.GET,POST,REQUEST

    Yii::app()->request->getParam('id');//request
    Yii::app()->request->getQuery('id');//get
    Yii::app()->request->getPost('id');//post

    AR:
    数据库配置:

    'db'=>array(
                //'class'=>'system.db.CDbConnection',
                'connectionString' => 'mysql:host=localhost;dbname=yii',
                'emulatePrepare' => true,
                'username' => 'root',
                'password' => '',
                'charset' => 'utf8',
                //默认false,设置为true即开启记录绑定参数,但是性能代价比较高
                'enableParamLogging' => 'true',
                // 开启表结构缓存(schema caching)提高性能
                // 'schemaCachingDuration'=>3600,
            ),


    创建记录:

    $post=new Post;
    $post->title='sample post';
    $post->content='content for the sample post';
    $post->create_time=time();
    $post->save();

    也可以直接POST给属性:

    $model->attributes=$_POST['Post'];
    $model->save();

    读取记录:

    // 查找满足指定条件的结果中的第一行
    $post=Post::model()->find($condition,$params);
    // 查找具有指定主键值的那一行
    $post=Post::model()->findByPk($postID,$condition,$params);
    // 查找具有指定属性值的行
    $post=Post::model()->findByAttributes($attributes,$condition,$params);
    // 通过指定的 SQL 语句查找结果中的第一行
    $post=Post::model()->findBySql($sql,$params);

    如上所示,我们通过 Post::model() 调用 find 方法。 请记住,静态方法 model() 是每个 AR 类所必须的。 此方法返回在对象上下文中的一个用于访问类级别方法(类似于静态类方法的东西)的 AR 实例。

    如果 find 方法找到了一个满足查询条件的行,它将返回一个 Post 实例,实例的属性含有数据表行中相应列的值。 然后我们就可以像读取普通对象的属性那样读取载入的值,例如 echo $post->title;。

    如果使用给定的查询条件在数据库中没有找到任何东西, find 方法将返回 null 。

    调用 find 时,我们使用 $condition 和 $params 指定查询条件。此处 $condition 可以是 SQL 语句中的 WHERE 字符串,$params 则是一个参数数组,其中的值应绑定到 $condation 中的占位符。例如:

    $post = Post::model()->find('id=:id',array(':id'=>1));


    CDbCriteria:用$criteria实例作为find()的查询条件

    $criteria=new CDbCriteria;
    $criteria->select='title';  // 只选择 'title' 列
    $criteria->condition='postID=:postID';
    $criteria->params=array(':postID'=>10);
    $post=Post::model()->find($criteria); // $params 不需要了

    改写:用数组直接取代$criteria,数组的键和值各自对应标准(criterion)的属性名和值

    $post=Post::model()->find(array(
        'select'=>'title',
        'condition'=>'postID=:postID',
        'params'=>array(':postID'=>10),
    ));

    计数:

    // 获取满足指定条件的行数
    $n=Post::model()->count($condition,$params);
    // 通过指定的 SQL 获取结果行数
    $n=Post::model()->countBySql($sql,$params);
    // 检查是否至少有一行复合指定的条件
    $exists=Post::model()->exists($condition,$params);

    更新记录:

    // 更新符合指定条件的行
    Post::model()->updateAll($attributes,$condition,$params);
    // 更新符合指定条件和主键的行
    Post::model()->updateByPk($pk,$attributes,$condition,$params);
    // 更新满足指定条件的行的计数列
    Post::model()->updateCounters($counters,$condition,$params);

    例如:

    Post::model()->updateAll(array('title'=>'hello'),'id=1');

    删除记录:

    // 删除符合指定条件的行
    Post::model()->deleteAll($condition,$params);
    // 删除符合指定条件和主键的行
    Post::model()->deleteByPk($pk,$condition,$params);

    例如:

    Post::model()->deleteAll('id=:id',array(':id'=>6));

    数据验证:
         当调用 save() 时, AR 会自动执行数据验证。 验证是基于在 AR 类的 rules() 方法中指定的规则进行的。

    if($post->save())
    {
        // 数据有效且成功插入/更新
    }
    else
    {
        // 数据无效,调用  getErrors() 提取错误信息
    }

    将表单提交过来的数据赋值给AR属性:

    $post->title=$_POST['title'];
    $post->content=$_POST['content'];
    $post->save();

    简化:

    // 假设 $_POST['Post'] 是一个以列名索引列值为值的数组
    $post->attributes=$_POST['Post'];
    $post->save();

    使用 AR 处理事务
    每个 AR 实例都含有一个属性名叫 dbConnection ,是一个 CDbConnection 的实例,这样我们可以在需要时配合 AR 使用由 Yii DAO 提供的 事务 功能:

    $model=Post::model();
    $transaction=$model->dbConnection->beginTransaction();
    try
    {
        // 查找和保存是可能由另一个请求干预的两个步骤
        // 这样我们使用一个事务以确保其一致性和完整性
        $post=$model->findByPk(10);
        $post->title='new post title';
        $post->save();
        $transaction->commit();
    }
    catch(Exception $e)
    {
        $transaction->rollBack();
    }

    命名范围(named scope) 表示一个命名的查询规则,它可以和其他命名范围联合使用并应用于 Active Record 查询。
    用法:命名范围主要是在 CActiveRecord::scopes() 方法中以名字-规则对的方式声明。 如下代码在 Post 模型类中声明了两个命名范围, published 和 recently。

    class Post extends CActiveRecord
    {
        ......
        public function scopes()
        {
            return array(
                'published'=>array(
                    'condition'=>'status=1',
                ),
                'recently'=>array(
                    'order'=>'create_time DESC',
                    'limit'=>5,
                ),
            );
        }
    }

    例子:查找最近发布的5篇帖子

    $posts=Post::model()->published()->recently()->findAll();

    ***总体来说,(1)命名范围必须出现在一个 find 方法调用的左边。
                       (2)最终结果就像给一个查询添加了一系列过滤器。
                       (3)命名范围可用于 find,update 和 delete 方法。
                       (4)默认的命名范围(defaultScope())只会应用于 SELECT 查询。INSERT, UPDATE 和 DELETE 查询将被忽略。
                       (5)命名范围只能用于类级别方法。也就是说,此方法必须使用 ClassName::model() 调用。



    在视图层(../views/..)添加CSS文件或JavaScript文件

    Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl ."/js/TableView.js"); 
    Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . "/js/datechooser.js");

    批注1:在视图层引用与在控制层引用的方式一样。但在视图层中引用加载的要晚一些。
    批注2:引用路径是使用baseUrl,而不是basePath。
    批注3:关于参数CClientScript::POS_END,作用是延时加载,提高页面渲染效率。例如:
    Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . "/js/jqueryui/jquery-ui.min.js", CClientScript::POS_END);
    引入jquery核心部件:

    Yii::app()->clientScript->registerCoreScript('jquery'); 

    批注:不论在页面中的何种位置引用,最终yii会将jquery.js文件放入yii的assets文件夹下。即/projectName/assets/82qg58/jquery-1.6.1.min.js。

    一、在../layouts/main.php中引入
    1,直接引入

    <!-- css -->
    <link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/print.css" media="print" />
    <!-- 图片 -->
    <link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/js/autocomplete/indicator.gif" />
    <!-- js -->
    <script type="text/javascript" src="<?php echo Yii::app()->request->baseUrl; ?>/js/jquery.js"></script>

    2,yii方式引入

    <?php
    <!-- (一)简单用法 -->
    <!-- js -->
        Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . "/js/jqueryui/jquery-ui.min.js", CClientScript::POS_END);
    
    
    <!-- (二)复杂用法 -->
    if($this->user->id) {
            Yii::app()->clientScript->registerScriptFile(Yii::app()->createUrl('/account/info', array('format' => 'js')), CClientScript::POS_END);
    }
    
    if($this->user->id) {
            Yii::app()->clientScript->registerScriptFile(Yii::app()->createUrl('site/baseJs'));
    }
    ?>

    插入meta信息: 

    Yii::app()->clientScript->registerMetaTag('keywords','关键字');
    Yii::app()->clientScript->registerMetaTag('description','一些描述');
    Yii::app()->clientScript->registerMetaTag('author','作者');  


    获取网站路径等小元素

    在view中得到当前controller的ID方法 :Yii::app()->getController()->id;

    在view中得到当前action的ID方法 :Yii::app()->getController()->getAction()->id;

    yii获取ip地址 :Yii::app()->request->userHostAddress;

    yii判断提交方式 :Yii::app()->request->isPostRequest

    得到当前域名: Yii::app()->request->hostInfo

    得到proteced目录的物理路径 :YII::app()->basePath;

    获得上一页的url以返回 :Yii::app()->request->urlReferrer;

    得到当前url :Yii::app()->request->url;

    得到当前home url :Yii::app()->homeUrl

    得到当前return url :Yii::app()->user->returnUrl

    项目路径 :dirname(Yii::app()->BasePath)

    Yii::getPathOfAlias('webroot') &nbsp; 如果你自己有个目录下有些类或文件常用,可以在main.php的最上边定义一个路径别名,别名可以被翻译为其相应的路径。如果是多个可以在main.php中的array中加一个配置

    如:
    'aliases'=>array(
      'local'=>'path/to/local/'
    ), 

    获取布局文件:$this->getLayoutFile('main');

  • 相关阅读:
    字体向上滚动
    地图改变图层
    移动地图
    [转] nodejs安装不了和npm安装失败的解决方法
    git回滚merge
    处理网站缓存问题
    webpack初学笔记 之 小案例篇demo1
    正则表达式整理
    关于返回值为图片 音频 视频的处理
    jquery ui datepicker 插件如何设置只能选择日期 禁止输入日期
  • 原文地址:https://www.cnblogs.com/thinksasa/p/3780549.html
Copyright © 2011-2022 走看看