03 04 2015

Yii框架:MVC框架
Model:模型
View:视图
Controller:控制器

Yii特点:
1、美籍华人开发
2、重量级框架
3、PDO
4、没有集成Smarty(显示与逻辑没有分离)
5、脚手架(自动生成项目目录)


Yii开发网站的步骤
1、找到Yii的核心资源包
2、新建项目
3、将framework文件夹复制到项目中
4、利用Yii的脚手架来自动生成项目目录
   1)在framework/yiic,脚手架
   2)打开命令提示符窗口(Linux打开终端)
   3)切换到framework目录中
   4)利用yiic自动生成项目目录
     yiic webapp ../app
   5)输入完上边命令后,点击回车,会出现对话框,点击确定既可
   6)有些学生电脑不识别yiic命令
     解决办法:将php5的路径配置到path环境变量
   7)有些Win7的学生,无权执行此操作
     解决办法:所有程序->附件->命令提示符(鼠标右键->以管理员身份运行)

项目目录
app------------------------应用程序
  assets-------------------公用文件
  css----------------------样式表
  images-------------------图片
  protected----------------代码文件
    commands---------------自定义的shell命令
    components-------------组件文件夹
      Controller.php-------所有控制器父类
      UserIdentity.php-----自定义组件的父类
    config-----------------配置文件夹*********
      main.php-------------全局配置文件
    controllers------------控制器文件夹*******
    data-------------------数据库脚本
    extensions-------------扩展的应用程序
    messages---------------翻译过的信息
    migrations-------------移植数据库的脚本
    models-----------------模型文件夹*********
    runtime----------------运行时临时文件目录
    views------------------视图文件夹*********
      layouts--------------母版页文件夹
  themes-------------------主题
  index.php----------------入口文件
framework------------------yii资源包
  yiic---------------------脚手架
  yiilite.php--------------每个类对应的目录

控制器的命名规则
1、必须采用大驼峰的命名规则
2、必须以Controller来结尾

控制器中方法的命名规则
1、必须采用小驼峰的命名规则
2、必须以action来开头
actionIndex()   actionLogin()   actionDelete()


views如何存储模板文件
1、在views下新建一个控制器名的文件夹
2、控制名的文件夹下新建视图文件
views
  控制器
    xxx.php
    xxx.php
    xxx.php
  控制器
    xxx.php

错误单词
Error:硬件错误、无法恢复的错误
Exception:运行时错误(逻辑错误)
Bug:错误

设置默认的控制器、方法
1、找到config/main.php全局配置文件
2、在main.php中的第一行添加如下代码
   "defaultController"=>"控制器/方法名",

定义全局使用的常量
1、找到index.php入口文件
2、在入口文件中定义常量


Yii的路由:
1、访问入口文件(访问的是默认的控制器、默认的方法)
http://localhost/项目/app/index.php
2、问号的方式
http://localhost/项目/app/index.php?r=控制器/方法
http://localhost/项目/app/index.php?r=控制器/方法/名/值/名/值
3、pathinfo的方式
http://localhost/项目/app/index.php/控制器/方法
http://localhost/项目/app/index.php/控制器/方法/名/值/名/值

urlManager(url管理):设定pathinfo模式的路径
1、找到config/main.php全局配置文件
2、去掉下边代码的注释
/*
'urlManager'=>array(
 'urlFormat'=>'path',
 'rules'=>array(
  '<controller:\w+>/<id:\d+>'=>'<controller>/view',
  '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
  '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
 ),
 ),
*/


控制器的定义格式
class XxxController extends Controller
{
  public function actionXxx()
  {
 逻辑代码;

    //转发到指定的模板文件
 $this->renderPartial("xxx");

 $data = array(
  "名"=>值,
  "名"=>值,
  "名"=>值
 );
 $this->renderPartial("xxx",$data);
  }
}


从控制器转发到指定的视图页面
1、转发到视图页面,不调用母版页
$this->renderPartial("index");
$this->renderPartial("index",数组);
2、转发到视图页面,调用母版页
$this->render("index");
$this->render("index",数组);


母版页:编写头和脚
1、在views/layouts下新建一个xxx.php
2、建议母版页的名字就是项目名(不是必须)
3、找到componenets/Controller.php
   修改如下代码
   public $layout='//layouts/column1';
   将column1改为母版页的名字(注意:不要扩展名)


模型的命名规则
1、必须采用大驼峰的命名规则
2、必须以表名来命名

模型的父类
CFormModel:select、update、delete
CActiveRecord:select、update、delete、insert

父类
class CActiveRecord
{
  //参数:模型的类名
  public static function model($className)
  {
 include 'protected/models/'.$className.'.php';
 $model = new $className();
 return $model;
  }
}
class BbsInfo extends CActiveRecord
{
  public static function model($className=__CLASS__)
  {
 return parent::model($className);
  }
}
控制器
//获得一个模型对象
$bbsInfo = BbsInfo::model();


网站sina
create database sina;
use sina;
1、论坛
bbs_userInfo
bbs_bbsInfo
bbs_reviews
2、邮箱
mail_userInfo
mail_mailInfo

模型的定义格式
class 模型名 extends CActiveRecord
{
  public static function model($className=__CLASS__)
  {
 return parent::model($className);
  }
  public function tableName()
  {
 return "表名";//完整的表名
 return "{{表名}}";//省略了表的前缀的表名
  }
}


设置数据库的配置信息
1、找config/main.php全局配置文件
2、找到如下代码
/*
'db'=>array(
 'connectionString' => 'mysql:host=localhost;dbname=库名',
 'emulatePrepare' => true,
 'username' => 'root',
 'password' => '密码',
 'charset' => 'utf8',
 'tablePrefix'=>'bbs_',//表的前缀
),
*/
3、修改数据库的配置信息


 

数据库操作
1、查询多条记录,返回值:二维数组
$model = 模型::model()或$model = new 模型();
$result = $model->findAll();
$result = $model->findAll(条件);
$result = $model->findAll(array(
 "select"=>"字段,字段...",
 "condition"=>"条件",
 "order"=>"排序的字段",
 "limit"=>"每页显示几条记录",
 "offset"=>"每页记录的起始值"
));
$result = $model->findAllBySql("select语句");

2、查询一条记录,返回值:一维数组
$model = 模型::model()或$model = new 模型();
$result = $model->find();
$result = $model->find(条件);
$result = $model->findByPk(主键值);
$result = $model->findBySql("select语句");

3、修改记录,返回值:受影响的行数
$model = 模型::model()或$model = new 模型();
$result = $model->updateAll(关联数组,条件);
$result = $model->updateByPk(主键值,关联数组);

4、删除记录,返回值:受影响的行数
$model = 模型::model()或$model = new 模型();
$result = $model->deleteAll(条件);
$result = $model->deleteByPk(主键值);

5、添加记录,返回值:布尔值
$model = new 模型();
$model->字段 = 值;
$model->字段 = 值;
$model->字段 = 值;
$model->字段 = 值;
$result = $model->save();

6、执行sql语句,获得多条记录,返回值:二维数组
$db = Yii::app()->db;
$st = $db->createCommand("select语句");
$result = $st->queryAll();

7、执行sql语句,获得一条记录,返回值:一维数组
$db = Yii::app()->db;
$st = $db->createCommand("select语句");
$result = $st->queryRow();

8、执行insert、update、delete语句,返回值:受影响的行数
$db = Yii::app()->db;
$st = $db->createCommand("insert|update|delete语句");
$result = $st->execute();

9、执行count函数,返回值:一个整数
$model = 模型::model()或$model = new 模型();
$result = $model->count();
$result = $model->count(条件);
$result = $model->countBySql("select count(*) from 表 where 条件");
$result = $model->countBySql("select sum(字段) from 表 where 条件");


Yii框架实现数据库分页的办法
1、执行sql语句
2、$model->findAllBySql("select语句");
3、$model->findAll(array("limit"=>"","offset"=>""));

  
 

 

跳转页面
1、从控制器跳转到指定的视图页面,走母版页
$this->render("xxx");
$this->render("xxx",关联数组);
2、从控制器跳转到指定的视图页面,不走母版页
$this->renderParital("xxx");
$this->renderParital("xxx",关联数组);
3、从控制器跳转到其他的控制器(重定向)
$this->redirect("其他控制器的url地址");


Yii框架对get参数特殊处理
class XxxController extends Controller
{
  public function actionXxx($参数名,$参数名...)
  {
 $变量 = $_GET["参数名"];//正确
  }
}
注意:
1、方法中的参数名必须与get中的参数名相同
2、方法中一旦添加了参数,那么这个get参数必须存在
   如果get中不存在该参数,报错

错误处理页面(只能处理404错误[访问的页面不存在])
1、修改main.php全局配置文件(设置错误页面)
2、在控制器的方法中获得错误信息
   $error = Yii::app()->errorHandler->error;
   code:错误编号
   type:错误类型
   file:报错文件
   message:错误信息

路径别名
system:路径(framework)
application:路径(app/protected)
zii:路径(framework/zii)


面包屑(当前位置)
1、在母版页中的指定位置添加如下代码
<?php
  $this->widget("zii.widgets.CBreadcrumbs",array(
 "homeLink"=>"<a href='地址'>网站首页</a>",
 "links"=>$this->breadcrumbs,
 "separator"=>" &raquo; "
  ));
?>
2、在控制器的方法中添加如下代码
$this->breadcrumbs = array(
  "文本信息"=>"链接地址",
  "文本信息"=>"链接地址",
  "文本信息"=>"链接地址",
  "文本信息"
);


网站的架构模式
C/S:客户端服务器模式
B/S:服务器模式

Yii框架中自带的表单挂件(表单封装类)
framework/web/widgets/CActiveForm.php
在视图页面添加如下代码来制做表单
<?php
 //开始一个表单,相当于<form method="" action="" name="" enctype="">
 //$form是CActiveForm类的对象
 $form = $this->beginWidget("CActiveForm",array(
  "action"=>APP."/Login/login",//提交地址
  "method"=>"post",//提交方式
  "htmlOptions"=>array(
   "name"=>"frm",//表单名
   "enctype"=>"multipart/form-data",//设置表单编码方式
  ),
  "enableClientValidation"=>true,//是否支持客户端的表单验证
  "clientOptions"=>array(
   "validateOnSubmit"=>true,//当表单提交时,启动验证
  )
 ));
?>
<?php echo $form->textField()?>
<?php echo $form->hiddenField()?>
<?php echo $form->passwordField()?>
<?php echo $form->textArea()?>
<?php echo $form->radioButton()?>
<?php echo $form->checkBox()?>
<?php echo $form->dropDownList()?>
<?php echo $form->fileField()?>
<?php
  $this->endWidget();
?>

yii的表单验证
1、视图的表单必须用Yii的表单
2、Yii的表单必须添加如下两个参数
"enableClientValidation"=>true,//是否支持客户端的表单验证
"clientOptions"=>array(
   "validateOnSubmit"=>true,//当表单提交时,启动验证
)
3、在指定的模型中添加rules方法
public function rules()
{
  return array(
 array("表单元素名","验证规则","message"=>"提示信息"),
 array("表单元素名","验证规则","message"=>"提示信息"),
 array("表单元素名","验证规则","message"=>"提示信息"),
  );
}
4、在视图页面显示指定的提示错误信息
<?php echo $form->error(模型对象,"表单元素名")?>


验证码
1、Yii提供的验证码
framework/web/widgets/captcha/CCaptchaAction.php
  (1)回到控制器中,添加如下方法(引用其他类)
     public function actions()
     {
        return array(
    "引用类的别名"=>array(
  "class"=>"引用类的路径"
           ),
    "引用类的别名"=>array(
  "class"=>"引用类的路径"
           ),
    "引用类的别名"=>array(
  "class"=>"引用类的路径"
           ),
 );
     }
   (2)视图页面如何调用
       引用的路径:<?php echo APP?>/控制器/引用类的别名


在main.php全局配置文件中设置缓存
'components'=>array(
   "cache"=>array(
 class=>"system.caching.CFileCache"
   ),
   ......
)

后台管理的制做(模块):gii功能(自动生成新的模块)
1、修改main.php全局配置文件,开启gii功能
   (1)去掉gii模块的注释
   (2)添写一个密码(密码随意)
2、访问gii的地址
   http://localhost/项目/app/index.php?r=gii
   http://localhost/项目/app/index.php/gii
3、自动生成新的模块
    Controller Generator 自动生成控制器
    Crud Generator  自动生成CURD操作
    Form Generator  自动生成表单
    Model Generator  自动生成模型
    Module Generator  自动生成模块
   (1)点击“Module Generator”
   (2)输入Module ID:“admin”
   (3)点击“Preview”按扭,进行预览
   (4)点击“Generate”生成新的模块
4、重新配置main.php配置文件
   modules => array(
 "admin",//己经创建的新的模块admin模块
 "webo",//webo模块
 "gii"=>array(
    ....
        )
   )
5、新的模块访问的地址
http://localhost/项目/app/index.php?r=模块/控制器/方法/名/值
http://localhost/项目/app/index.php/模块/控制器/方法/名/值
http://localhost/bbs/app/index.php/admin/default/index
6、新模块的目录结构
modules
  admin
    components--------组件文件夹
    controllers-------控制器文件夹
    messages----------翻译过的信息
    models------------模型文件夹
    views-------------视图文件夹
      layouts---------母版文件夹
    AdminModule.php---当前模块的入口文件
7、设置后台的默认控制器和方法
   到后台的入口文件中找到init方法,在该方法的最后添加一句代码
   $this->defaultController = "控制器/方法";
8、设置后台的母版页
   到后台的入口文件中找到beforeControllerAction方法,
   在该方法中的第一句添加一句代码
   $controller->layout = "/layouts/母版文件名";

 

 

 

 

 

 

 

发表评论