YII框架使用详解:
第一步:创建项目
1.从官方下载最新的yii框架源码
2.解压后进入框架的framework目录
3.使用yiic脚本创建webapp应用test,yiic webapp X:\xxx\xxx\test
本质上yiic脚本引用的是yiic.php,也可以直接用此文件创建项目
4.入口文件是index.php,复制framework也就是yii框架的源码一份
放在项目里,并修改Index.php的路径引入,确保路径正确
5.访问项目路径,如果看到一个“My Web Application”的页面,项目就成功创建了。
#补充
最好是先把框架解压后放到apache可以访问的路径下,然后访问
yourhost/requirements/index.php
然后查看所需要的组件是否已经安装
Yii需要PHP 5.2.0以上版本,支持PDO组件,mysql 4.0版本以上或者更高。
>>>>>>>>>>>###
>>>>>>>>>>>###
第二步:配置项目
1.首先我们先要熟悉项目的结构:
test/
index.php    :Web 应用入口脚本文件
framework/    :Yii框架目录
css/          :css文件目录
assets/        :包含公开的文件,如jquery等
images/      :图片目录
themes/        :包含应用主题
protected/                包含受保护的应用文件
      yiic                  yiic 命令行脚本
      yiic.bat              Windows 下的 yiic 命令行脚本
      commands/              包含自定义的 'yiic' 命令
        shell/              包含自定义的 'yiic shell' 命令
      components/            包含可重用的用户组件
        MainMenu.php        'MainMenu' 挂件类
        Identity.php        用来认证的 'Identity' 类
        views/              包含挂件的视图文件
            mainMenu.php    'MainMenu' 挂件的视图文件
      config/                包含配置文件
        console.php        控制台应用配置
        main.php            Web 应用配置
      controllers/          包含控制器的类文件
        SiteController.php  默认控制器的类文件
      extensions/            包含第三方扩展
      messages/              包含翻译过的消息
      models/                包含模型的类文件
        LoginForm.php      'login' 动作的表单模型
        ContactForm.php    'contact' 动作的表单模型
      runtime/              包含临时生成的文件
      views/                包含控制器的视图和布局文件
        layouts/            包含布局视图文件
            main.php        所有视图的默认布局
        site/              包含 'site' 控制器的视图文件
            contact.php      'contact' 动作的视图
            index.php        'index' 动作的视图
            login.php        'login' 动作的视图
        system/            包含系统视图文件
2.在protected/controllers/里面新建一个AdminController.php
<?php
class AdminController entends Controlle
r{
$name="briup";
public function actionIndex(){
  $this->renderPartial('index',array('gender'=>'男','age'=>30));
}
}
?>
3.在protected/views目录里创建一个admin目录,在admin目录里创建一个index.php
文件,作为Index页面的模板。
<?php
echo $this->name;echo "<br>";
echo $gender;echo "<br>";
echo $age;echo "<br>";
?>
##注:在上面的例子里,演示了如何创建一个控制器和一个视图文件
其中renderPartial()方法用来调用模板,render()方法用法和其一样,不同的是,
renderPartial()方法不会调用默认的layout模块。
name的用法和age以及gender不同,如果你熟悉面向对象,很容易就能理解,在接下来的每个页面中都能调用name属性,
而age和gender是只有这个页面才能使用。
4.配置基本设置:
在config/main.php里添加的配置可以使用Yii::app()->xxx来访问,如配置项目的名称为'name'=>'Mytest',则在项目里就可以调用Yii::app()->name得到'Mytest',
修改默认的控制器(默认为Site):'defaultController’=>'admin',
##注:这个文件只有一个return array(....);
那么这个是怎么用的呢?
只需要另外一个文件引入这个文件,就能得到此文件返回的数据
例:$arr=require_once("main.php");
5.修改url的输入方式:
首先在index.php文件所在目录下创建一个.htaccess文件,
内容如下:
RewriteEngine on   
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l   
RewriteRule . index.php 
然后在main.php中:
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName' => false,
'rules'=>array(
  '<controller:\w+>/<id:\d+>'=>'<controller>/view',
  '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
  '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
)
,
),
jquery框架定义
##注:使用.htaccess文件的前提是使用apache服务器,并且开启了rewrite
模块,在windows下无法直接创建.htaccess文件,可以建一个普通的文本,进入dos界面,命令 .htaccess文件。
6.修改默认的layout布局
上节课已经讲过renderPartial()和render()的用法,其中render()方法在调用的时候会调用默认的布局,
YII给我们提供的只是一个测试用的默认布局,所以我要对其进行修改,在控制器中添加代码:
$this->layout='my',//把当前的默认布局调整为使用layouts里面的my.php
在my.php中添加如下代码:
<?php echo $content; ?>
$content就是页面的view的所有的内容
7.页面跳转:
$this->redirect('/admin/test');跳转到admin控制器的test,action
如果有需要的话,后面还可以附带更多的参数。
第二种方式:
$this->redirect(array('site/test','name'=>'test2','param'=>2));
$this->redirect(array('test','name'=>'test2','param'=>2));
8.Yii widget的的用法:
widget是小部件的意思,Yii框架引入widget的概念,widget是
一些包含自己逻辑处理和视
图的独立的组件,比如有可能是一
个复杂的日历组件,一个签到模块等。
1.首先我们在protected目录下创建一个widget目录
2.比如我们要创建一个签到组件,取名为sign,在widget目录下
创建一个sign目录。
3.在sign目录下创建一个signWidget.php文件
<?php
class signWidget extends Cwidget{
  public function init()
    {
        //当视图中执行$this->beginWidget()时候会执行这个方法
        //可以在这里进行查询数据操作
    }
    public function run()
    {
        //当视图中执行$this->endWidget()的时候会执行这个方法
        //可以在这里进行渲染试图的操作,注意这里提到的视图
  是widget的视图
        //注意widget的视图是放在跟widget同级的views目录下面,
  例如sign的视图会放置在
        //  /protected/widget/sign/views/sign.php
        $this->render('sign', array(
            'str'=>'WIDGET视图变量',
        ));
    }
//这个文件里的$this是Widget的对象,而不是Controller对象
}
?>
4.在sign目录下创建一个views目录,里面放置sign需要渲染的视图
5.在普通页面的视图中这样调用组件:
<?php $this->beginWidget('application.widget.sign.signWidget'); ?>
...可能小部件需要用到这里主体内容...
<?php $this->endWidget(); ?>
>>>>
第二种使用widget的方式:
在components里面创建Mywidget.php,代码如下:
<?php
class MyWidget extends CWidget{
public $userid;
public function init(){}
public function run(){
  $this->render('myview',array('name'=>'Ronnie','age'=>24));
}
}
然后在components/views/  里面创建myview.php  代码如下:
<?php
echo $name;echo"<br>";
echo $age;echo "<br>";
echo $this->userid;
最后是使用此widget,例如在index页面使用:
<?php $this->widget('mywidget',array('userid'=>'9527'));?>
//传的参数userid会传给Mywidget的属性userid.
>>>>>>>>>>>>##
>>>>>>>>>>>>##
如果我们先把一些初始化配置生效,可以在控制器文件里面建一个init()方法
此方法会自己执行,很多框架都是这样。
第三步:配置数据库连接
yii项目的主要配置文件在config目录里,主要是main.php这个文件
现在编辑这个文件:
'components'=>array(
'db'=>array(
  'connectionString' => 'mysql:host=localhost;dbname=mysql',
  'emulatePrepare' => true,
  'username' => 'root',
  'password' => '123456',
  'charset' => 'utf8',
  ),
'db2'=>array(
  'class'=>'CDbConnection';//注意这里,选择数据库连接类
  'connectionString' => 'mysql:host=localhost;dbname=mysql',
  'emulatePrepare' => true,
  'username' => 'root',
  'password' => '123456',
  'charset' => 'utf8',
),
),
然后通过Yii::app()->db或者Yii::app()->db2就能获得数据库连接
的对象了。
或者直接通过new CDbConnection($dsn,$user,$password);直接
到数据库连接对象。
>>>>>>>>>>>###
>>>>>>>>>>>###
第四步:Yii的DAO(Database access objects数据库操作对象)
1.数据查询,可分为两种模式:
1.1 $command=$db->createCommand($sql);
//如果需要的话$command->text=$newsql;可以更改sql语句
$rows=$command->queryAll(); //返回所有记录
$row=$command->queryRow();//返回一条记录
$column=$command->queryColumn();//返回第一列的所有数据
$val=$command->queryScalar();//返回第一列的第一个值(非数组)
1.2 $command=$db->createCommand($sql);
//如果需要的话$command->text=$newsql;可以更改sql语句
$res=$command->query();
while($row=$res->read())!==false)){
  $rows[]=$row;
}
或者 $rows=$res->readAll();
2.非查询
$command=$db->createCommand($sql);
//如果需要的话$command->text=$newsql;可以更改sql语句
$res=$command->execute();//返回影响的记录条数
3.事物处理
$transaction=$db->beginTransaction();
try
{
$db->createCommand($sql1)->execute();
$db->createCommand($sql2)->execute();
//....
$transaction->commit();
}
catch(Exception $e) // 如果捕获异常
{
$transaction->rollBack();
}
4.占位符的使用,防止sql注入攻击
$sql="select * from goods where name <> :name";
$command=$db->createCommand($sql);
$name="longbb";
$command->bindParam(":name",$name,PDO:PARAM_STR);
$res=$command->queryAll();
5.不使用完整的sql语句的CRUD操作,Command对象
$command =$db->createCommand();// 注意参数留空了。。
/
/ 可用的方法列表如下:
->from():        构建FROM子句
->select(): SELECT子句
->selectDistinct(): SELECT子句,并保持了记录的唯一性
->where():        构建WHERE子句
->join():        在FROM子句中构建INNER JOIN 子句
->leftJoin():    在FROM子句中构建左连接子句
->rightJoin():    在FROM子句中构建右连接子句
->naturalJoin():  添加一个自然连接子片段
->group():        GROUP BY子句
->having():      类似于WHERE的子句,但要与GROUP BY连用
-
>order():        ORDER BY子句
->limit():        LIMIT子句
详解:
5.1.1
// 使用from() 如果制定了多个表需要使用逗号分隔的字符串,
就像原生SQL语句那样:
from('tbl_user, tbl_post, tbl_profile');
// 当然,你也可以使用表别名, 还可以使用完整的数据库限定名
from('tbl_user u, public.tbl_profile p');
5.1.2
select()默认返回全部列(*);
/
/ 但你可以这样:
select('username, email');
// 或使用表限定,或使用别名
select('tbl_user.id, username name');
// 或使用数组作为参数
select(array('id', 'count(*) as num'));
5.1.3
//使用where子句
//where子句也是使用占位方式,防止sql注入攻击
where('id=:id', array(':id'=>$id))
// 在where()中使用 AND
where(array('and', 'id=:id', 'username=:username'), array(':id'=>$id, ':username'=>$username
);
// 在where()中使用 OR 与 AND用法相同,如下: 
where( array('and', 'type=1', array('or', 'id=:id','username=:username') ),array(':id'=>$id, ':username'=>$username ));
此sql语句翻译过来就是 : where type=1 and (id=$id or username=$username);
// 在where()中使用in 操作符用法
where(array('in', 'id', array(1,2,3)))
// 在where()中like用法
where( array('like', 'name', '%tester%') );
where( array('like','name', array('%test%', '%sample%')) ) // 等于 name LIKE '%test%' AND name LIKE '%sample%
5.1.4
//group()子句
group('id');
group('id,name');
group(array('id','name'));
5.1.5
//having子句
having('id>:id and name <> :name',array(':id'=>$id,':name'=>$name);)
5.1.6
//order()子句
order('id');
order('id DESC');
order('id ASC,name DESC');
order(array('id ASC','name DESC'));
5.1.7
//limit()子句
limit($row,$offset);
>>>>>>>>>##
5.1.8
//insert()语句
insert($table,$param);
//例:
insert('goods',array('good_name'=>'Test'));
5.1.9
//update语句
update($table,$set,$where,$params)
//例:
update('goods',array('good_name'=>$name),'id =:id',array(':id'=>3));
5.1.10
//delete语句
delete($table,$where,$params);
//例:
delete('goods','good_id>:id',array(':id'=>7));
6.使用YII的AR(Active Record),AR是YII中很强大的功能体系。
AR一般用来做不是特别复杂的尤其是针对单表的CRUD。
6.1.1
使用YII的脚手架:
进入protected目录,输入命令yiic shell ../index.php
#注意:此时php的可执行程序要在环境变量里,要不然就要在yiic之前加上php的执行文件路径,还有在index.php文件里要注释掉
require_once($yii)这句,不然会重复引入Yii类.还有,脚手架创建AR类需要使用默认的db,在main.php配置里,我们可以更改db后面的数据库来创建我们需要的AR类,不建议修改YII源码,免得升级不兼容。
成功指定上一个命令之后,创建一个User类:
>>model User user
其中user表是 默认的数据库连接db库中的一个表
创建成功之后会在models目录里看到一个User.php
class User extends CActiveRecord
{
public static function model($className=__CLASS__)
{
  return parent::model($className);
}
public function tableName()
{
  return 'user';
}
......
}
如果我们只是为了使用脚手架才修改的默认的db,在创建之后还需要把默认的db修改回来,免得影响我们系统的运行。
更换了db之后是不是这个AR也不能用了?答案是肯定的
怎么解决呢?只需要在User中重写getDbConnection()方法即可,
当然我们也可以直接修改CActiveRecord类的getDbConnection()方法,一劳永逸,但是之前说过了,不建议修改源码,防止框架升级之后出现兼容问题。
在User中重写 getDbConnection()方法:
public function getDbConnection(){
//把User所依赖的数据库连接换成了db2.
return Yii::app()->db2;
}
如果user
表中没有主键,那么我们在使用AR的时候就不太方便,
这个时候只需要在User类中重写primaryKey()方法
public function primaryKey(){
return 'id';
//如果主键是联合的
//return array('id','name');
}
还有,如果需要使用表前缀,比如我们数据库中有个表叫tbl_user,
在CDbConnection这个类中配置tablePrefix为你需要的表前缀
我们创建的AR类叫做User,定义的表前缀为tbl_,那需要重写
tableName()方法:
public fucntion tableName(){
//亲,记得这里是两层{}哦!
return '{{user}}';
}
6.1.2
AR的插入数据库操作。
例子:
$user=new User();
$user->qname="wc";
$user->save();
这里的qname并不是类中属性,而是数据表user中的一个字段
因为访问的时候调用了__set()方法处理的,如果访问或者设置一个
不存在的字段,就会产生一个异常。
#注意:如果是手脚架创建的Model,验证规则里面主见自增是 required,要去掉,不然插入不了。
如果是User::model()返回的User对象的话需要设置 $user->isNewRecord=true;
#可以打印$user->errors显示sql错误信息。
#$id = $post->attributes['id']; //返回插入的最后一条id值
更新操作:
User::model()->updateAll($sets,[$condition],[$params]);
User::model()->updateByPk($pk,$sets,[$condition],[$params]);//$pk也可以为多个,多个的话用一个数组表示
删除操作:
User::model()->deleteAll($condition,$params);
User::model()->deleteByPk($pk,$condition,$params);
查询操作:
多条记录:
User::model()->findAll($condition,$params);
User::model()->findAllByPk($pks,$condition,$params);
User::model()->findAllBySql($sql,$params);
单条记录:
User::model()->findByPk($postID,$condition,$params);
User::model()->find($condition,$params);
User::model()->findBySql($sql,$params);
##返回结果会有attributes属性,是一条结果的一个数组
  /**
  CDbCriteria类主要是为CActiveRecored创造查询条件
  */
  $criteria =new CDbCriteria;
  $criteria->addCondition("id=1"); //查询条件,即where id =1 
  $criteria->addInCondition('id', array(1,2,3,4,5));//代表where id IN (1,23,,4,5,); 
  $criteria->addNotInCondition('id',array(1,2,3,4,5));//与上面正好相法,是NOT IN 
  $criteria->addCondition('id=1','OR');//这是OR条件,多个条件的时候,该条件是OR而非AND
  $criteria->addSearchCondition('name','分类');//搜索条件,其实代表了。。where name like '%分类%' 
  $criteria->addBetweenCondition('id', 1, 4);//between1 and 4 
  $criteria->compare('id',1);  //这个方法比较特殊,他会根据你的参数自动处理成addCondition或者addInCondition,
                                  //即如果第二个参数是数组就会调用addInCondition 
//防注入
  $criteria->addCondition("id = :id");
  $criteria->params[':id']=1; 
  $criteria->select = 'id,parentid,name';//代表了要查询的字段,默认select='*'; 
  $criteria

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论