yii学习笔记1
1、windows下,如果php没有加入环境变量,要使用YII命令行操作,先修改framework/yiic.bat,以便找到php.exe
if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe的绝对路径
2、创建第一个程序
命令:% yii/framework/yiic webapp /www/app
linux下:/framework/yiic webapp ../app
如果切换到/framework下的话,使用./yiic webapp ../app
3、yiic shell错误提示
Error: index.php does not exist or is not an entry script file.
解决方法:
yiic shell ../../index.php //找到index.php文件
4、修改项目文件夹 protected/config/main.php
如果用Gii,去掉Gii的注释
默认数据库配置为sqlite,注释掉sqlite的配置,下面是mysql的配置,去掉注释
数据库后面写上要用的表名前缀 如'tablePrefix' => 'tbl_',
5、利用Gii创建模型(Model)
访问Gii:http://localhost/blog/index.php?r=gii
输入密码,点Model Generator
一个数据表对应一个Model
6、实现CRUD操作
Gii页面,转到Crud Generator
需要哪个模型实现CRUD操作就一个一个写上去生成
7、路由:http://localhost/yiidemo/index.php?r=user/login
8、创建一个控制器:UserController.php views文件夹也要有一个user文件夹
9、render是调用layout渲染一个view,并显示出来。
renderPrtial直接显示一个view。
renderText是显示一个静态的string字符串
10、修改布局文件:protected/components/Controller.php public $layout='//布局文件目录/布局文件名';
11、测试yii框架是否有连接上控制器
在控制器里面随便一个地方输出:var_dump(Yii::app()->db)
Yii::app():Yii框架是纯OOP框架,每次web请求,相当于通过创建一个对象,让对象调用相关方法执行。对象是我们框架应用的核心对象,我们也可以通过代码获得这个应用对象(Yii::app())
12、find()会产生一条记录信息,其会返回一个直接对象出来
我们可以通过对象调用自己的属性直接获得具体商品信息
对象->属性;
findAll() 返回了一个数组,里边有好多对象元素信息,用foreach遍历然后才能输出
find() 直接返回了一个对象,可以通过对象获得具体商品信息。
通过sql语句获得信息:fandAllBysql($sql)
13、表单处理
<form>开始:<?php $form = $this->beginWidget('CActiveForm'); ?>
</form>结束:<?php $this -> endWidget(); ?>
//表单前面的名字(用户名、商品名之类的,不过是用英文表示)
<?php echo $form->labelEx($model,'字段名'); ?>
//表单的输入框
<?php echo $form->textField($model,'字段名',array('size'=>60,'maxlength'=>128)); ?>
//表单的文字域
<?php echo $form->textArea($model,'字段名',array('cols'=>30,'rows'=>5)); ?>
checkBox():复选框
dropDownList():下拉列表
radioButton():单选按钮
listBox():列表框
passwordField():密码框
fileField():上传控件
查询:findAll($condition,$param)
$condition 就是数据库查询where条件
例:$serch = $model -> findAll("name like :name and price > :price",array(':name'=>'诺%','price'=>500))
//想要查询具体的"字段" select
//想要查询具体的"条件" condition
//想要查询具体的"排序" order
//想要查询具体的"分组" group
//想要查询具体的"限制" limit
//想要查询具体的"偏移量" offset
$infos = $model -> findAll(array(
'select'=>'goods_name,goods_price',
'condition'=>"goods_name like '诺%'",
'order'=>'goods_price desc',
'limit'=>3,
'offset'=>6,
));
//通过criteria实现信息的查询
$criteria = new CDbCriteria();
$criteria -> select = "goods_name,goods_price";
$criteria -> condition = "goods_name like '摩%'";
//$criteria -> limit = 6;
$criteria -> order = "goods_price";
$infos = $model -> findAll($criteria);
14、模型有两个关键方法
创建数据模型model对象
new Goods(); 调用save()方法的时候执行insert语句
Goods::model(); 调用save()方法的时候执行update语句
/**
* 返回当前模型对象的静态方法
* @param string $className
* @return CActiveRecord
*/
public static function model($className = __CLASS__){
return parent::model($className);
}
/**
* 返回当前数据表的名字
* @return string
*/
public function tableName(){
return '{{数据表名,不带前缀}}';
}
另外,表单前显示的中文要用attributeLabels()
public function attributeLabels(){
return array(
'字段名' => '显示的中文名'
);
}
表单验证方法 rules(){
return array(
array('字段名','required(必须填写的意思)','message'=>'显示的内容'),
array('字段名','required(必须填写的意思)','message'=>'显示的内容'),
array('repassword','compare(匹配后面的值)','compareAttribute(用于比较的属性)'=>'password','message'=>'显示的内容'),
array('username','length','min'=>3,'max'=>12,,'message'=>'用户名必须大于3个字符,小于12个字符'),
array('username,email','unique(唯一)'),
array('email','email(匹配email)'),
);
}
加ajax处理方法
<?php $form = $this->beginWidget('CActiveForm',
array(
'id'=>'_form',
'enableAjaxValidation'=>true,//开启ajax验证
'enableClientValidation'=>true,//开启客户端验证,生成js
)) ?>
储存之前做的处理
public function beforeSave(){
if($this->isNewRecord){ //如果是新插入
$this->password = $this->encypt($this->password);
$this->creattime = time();
}
return true;
}
15、把数据传递到模版方法
$this->render('模版名',array('传递的名字'=>需要传递的变量,......))
16、yii数据添加三个步骤
一、创建对象模型
$model = new 模型类名;
二、要添加的字段数据
$model -> 字段名 = '数据';
$model -> 字段名 = '数据';
$model -> 字段名 = '数据'
三、调用save()方法实现数据添加
if($model -> save()){
echo 'success';
}else{
echo 'fail';
}
17、$this->redirect('连接地址') 转到连接地址,比如if语句执行成功后转到链接地址
18、attributes属性已经集成foreach,可以直接使用,方法:
$model->attributes=$_POST['User'];
等于foreach($_POST['User'] as $key=>$value){
$model->$key=>$value;
}
19、$form->dropDownlist($model,'id'/*要写入的字段*/,CHtml::listData($menus,'id','menuname'),array('encode'=>false))
Chtml::dropDownList('pid',$id,CHtml::listData($menus,'id','menuname'),array('encode'=>false) 默认选中
例子:
<?php echo Chtml::dropDownList('Menu[pid]',$pid,CHtml::listData($menus,'id','menuname'),array('encode'=>false,'empty'=>'=顶级菜单='))?>
Menu[pid]----要写入数据库的值
$pid------要选中的选项(主键)
CHtml::listData------用来生成列表选项的数据(数组格式)
20、public function rules(){
return array(
array('username','required','requiredValue'='张三','message'=>'用户名必须为“张三”')
array('pid','numerical','integerOnly'=>true)
)
}
21、用户登录实现
用LoginForm模型
第一步实例化,$login=new LoginForm;
第二步收集表单信息,$login->attributes=$_POST['LoginForm'];
第三步校验信息,if($login->validate() && $login->login()){};validate()方法校验数据走rules方法,是否填写正确在模型用自定义方法校验;login()方法校验是否持久化储存成功(session)
前台判断是否登录:<?php echo Yii::app()->user->getIsGuest ?>(游客登录),输出登录名<?php echo Yii::app()->user->name ?>
22、提示信息Flash
setFalsh(); 设置提示信息
getFalsh(); 获取提示信息
hasFalsh(); 提示信息有无
例如:
setFlash('success','登陆成功'); //当执行的时候会在session里存储‘success’信息
hasFlash('success'); //当执行时会判断session里有没有success这个变量
getFlash('success'); //当执行时会获取session里变量名为success的变量值,之后会删除session里的这个变量
23、session操作
Yii框架封装的Yii::app->session;
设置session变量:
Yii::app()->session['var']='value';
使用: echo Yii::app()->session['var'];
移除: unset(Yii::app()->session['var']);
更为复杂一点的使用时如何配置你的session
配置项可设在 protected/config/main.php的components中:
'session'=>array(
'autoStart'=>false(/true),
'sessionName'=>'Site Access',
'cookieMode'=>'only',
'savePath'='/path/to/new/directory',
),
将session保持在数据库的设置:
'session' => array (
'class' => 'system.web.CDbHttpSession',
'connectionID' => 'db',
'sessionTableName' => 'actual_table_name',
),
好,还有什么呢?对了,为了调试,有时需要知道当前用户的session ID,
该值就在 Yii::app()->session->sessionID 中。
最后,当用户退出登录(logout),你需要消除痕迹,可使用:
Yii::app()->session->clear() 移去所有session变量,然后,调用
Yii::app()->session->destroy() 移去存储在服务器端的数据。
24、创建超链接
Yii::app()->createUrl($route,$params);
25、CDbCriteria常用
$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->join = 'xxx'; //连接表
$criteria->with = 'xxx';//调用relations
$criteria->limit =10; //取1条数据,如果小于0,则不作处理
$criteria->offset =1; //两条合并起来,则表示 limit 10 offset1,或者代表了。limit 1,10
$criteria->order = 'xxx DESC,XXX ASC' ;//排序条件
$criteria->group = 'group 条件';
$criteria->having = 'having 条件 ';
$criteria->distinct = FALSE;//是否唯一查询
26、YII获取另一个控制器的方法
$minfo = Yii::app()->runController('admin/models/list'); 用runController获取admin模块下面的models控制器下的actionList方法
27、YII取得数据库数据
Yii::app()->db->createCommand()->select('*')->from('{{model}}')->queryAll();
28、YII插入meta信息
Yii::app()->clientScript->registerMetaTag('keywords','关键字');
Yii::app()->clientScript->registerMetaTag('description','一些描述');
Yii::app()->clientScript->registerMetaTag('author','作者');