修改默认访问控制器
main.php
添加如下页面
return array(
'defaultController'=>'index',
打开相关注释
array(
'class'=>'CWebLogRoute',
),
a)搭建静态页面
i.搭建前台界面
1.将资源文件拷贝到项目当中(创建两个文件,前后台资源)
当前Yii框架请求的基地址<? php echo Yii::app()->request->baseUrl ?>
设置页面公共布局(修改布局)
i.找到blog/protected/components/controller.php
修改为
i. Public $layouts/index
ii.在blog/protected/views/layouts目录下创建文件index.php
修改该文件
1.公共头部分
echo $content
2.公共尾部
============
搭 建后台页面
使用gii组件创建后台分组模块(默认情况下,gii是关闭的)在main.php中将其开启
1.加载后台登陆表单
实例化表单对象
a) $loginform=new LoginForm();
b) 将对象分配到视图层
i. $this->renderPartial('login',array('loginForm'=>$loginform));
ii. 在页面当中加载form表单小物件
<?php
$form=$this->beginWidget("CActiveForm");
?>
iii.在form表单结束的位置添加小物件的结束
$this->endWidget()
iiii.在form小物件当中加载表单控件
a) Echo $form->textField($loginForm,"username",array("class"=>123))
b)Echo $form->passwordField(...)
Loginform 中需要添加captcha
那么在login.php中如何处理验证码呢
<?php
class LoginController extends Controller
{
public function actionLogin()
{ //实例化登陆对象
$loginform=new LoginForm();
$this->render("login",array('loginform'=>$loginform));
}
public function actions(){
return array(
'captcha'=>array(
'class'=>'CCaptchaAction','width'=>70,'height'=>30,'minLength'=>1,'maxLength'=>4,'fixedVerifyCode'=>substr(md5(time()),11,4),
),
);
}
}
?>
1.需要在控制器当中添加actions方法
publc function actions(){
Retrun array(
'captcha'=>array(
'class'=>'CCptchaAction',
'width'=>100,
'height'=>50,
'minLength'=>1,
'maxLength'=>4,
)
)
}
2.在模板当中直接通过a)¥this->widget('CCaptcha',array("showrefreshButton")),尝试了一下,无法在logincontroller中简单定义,再在login中补全
并在login.php中如此定义
<?php $this->widget("CCaptcha",array('showRefreshButton'=>true,'clickableImage'=>true,'imageOptions'=>array('alt'=>'点击换图','title'=>'点击换图','style'=>'cursor:pointer','width'=>70,'height'=>50,'minLength'=>1,'maxLength'=>5,'fixedVerifyCode'=>substr(md5(time()),11,4))));?>
拓展自定义函数的方法:
在frameworks/base中创建文件function.php
并在项目入口文件中,run方法调用之前,加载该文件
include "../../base.php";
表单验证
将表单提交的数据压入至loginForm对象当中
if(!empty($_POST['LoginForm']))
{
$loginform->username=$_POST['LoginForm']['username'];
$loginform->password=$_POST['LoginForm']['password'];
$loginform->captcha=$_POST['LoginForm']['captcha'];
//这个相当于$loginform->name=$_POST['LogForm']['name'];
}
在执行验证之前,需要先制定验证的规则
修改文件 LoginForm.php
public function rules()
{
return array(
array('username','required','message'=>'用户名不能为空'),
array('password','required','message'=>'密码不能为空'),
array('captcha','captcha','message'=>'验证码错误'),
//array('rememberMe', 'boolean'),
//array('password', 'authenticate'),
);
}
3.执行验证
在控制器方法中可以通过loginform对象当中的validate方法执行验证
那么验证的代码如下
<?php echo $form->error($loginform,'username');?>
<?php echo $form->error($loginform,'password');?>
<?php echo $form->error($loginform,'captcha');?>
显示错误信息
==================================================
对后台登陆的用户名和密码进行验证:
a)验证在那里进行配置
b)规则如何写
i.在LoginForm类当中rules方法当中添加规则;
1. array('password','authenticate');
a)使用自定义方法对password字段进行数据验证
2. 需要在blog/protected/models当中创建用户的model类型
a)
需要先连接数据库,修改在main.php中包括的database.php。
注意到在configController.php中user:这样写必须在models文件中写下user.php
如下
1 ?php
2 class User extends CActiveRecord
3 {
4 //必须要使用两个方法
5 public static function model($className=__CLASS__)
6
7 {
8 return parent::model($className);
9 }
10 public function tableName()
11 {
12 return "user";
13 }
14
15
16
17
18 }
19 ?>
b)在LoginForm.php当中对方法,authenticate进行数据验证:
a)验证用户名或者密码是否正确
public function authenticate($attribute,$params)
{
if(!$this->hasErrors())
{
//$this->_identity=new UserIdentity($this->username,$this->password);
//if(!$this->_identity->authenticate())
//$this->addError('password','Incorrect username or password.');
//用户名和密码的正确性进行验证
//查询数据库
$usermodel=User::model();
$data=$usermodel->find('name=:name and password=:pass',array(":name"=>$this->username,":pass"=>$this->password));
if(!empty($data))
{
//说明用户名密码正确
}
else
{
$this->addError('password','用户名或者密码错误');
}
}
}
完成登陆:
a)判断验证是否成功
i.if($loginForm->validate())
{
1.执行登陆
}
2.//添加session
3.//2跳转后台首页
<?php
class LoginController extends Controller
{
public function actionLogin()
{ //实例化登陆对象
// var_dump($_POST);
$loginform=new LoginForm();
if(!empty($_POST['LoginForm']))
{
$loginform->username=$_POST['LoginForm']['username'];
$loginform->password=$_POST['LoginForm']['password'];
$loginform->captcha=$_POST['LoginForm']['captcha'];
//这个相当于$loginform->name=$_POST['LogForm']['name'];
}
//验证数据之前,需要在loginform指定验证规则
if($loginform->validate())
{
//登陆成功
Yii::app()->session['username']=$_POST['LoginForm']['username'];
Yii::app()->session['isLogin']=1;
//这里不需要再session_start();
p($_SESSION);
//跳转到后台的主页
$this->redirect(array("default/index"));//这里加数组就可以接着前面的那个模块
}
else
{
}
$this->render("login",array('loginform'=>$loginform));
}
public function actions()
{
return array(
'captcha'=>array(
'class'=>'CCaptchaAction','width'=>70,'height'=>30,'minLength'=>1,'maxLength'=>4,'offset'=>2,
),
);
}
}
?>
b)在模板当中可以输出session的值
<?php echo Yii::app()->session['username'];?>
事实上按照Yii框架的用法
可以这样
我们现在loginController.php中,写上
if($loginform->validate() && $loginform->login())
{
$this->redirect(array('default/index'));
}
else
{
}
之后就会调用loginform中的login方法,而这个loginform.php中的login方法,需要调用UserIdentity的authenticate方法
我们再在UserIdentity.php中写下数据验证的方法
$usermodel=User::model();
$data=$usermodel->find('name=:name and password=:pass',array(":name"=>$this->username,":pass"=>$this->password));
5.退出:给退出添加超链接
<a href="<?php echo $ths->createUrl("login/logout")?>"></a>
$this->createUrl('admin/default/index');
createUrl它回根据真实地址,组织成路由格式的地址
6修改密码的操作(属性标签)
a)先对旧密码进行验证
b)对新密码两次输入是否一致进行验证
c)提交数据库进行更新
7.创建属性标签
在 blog/protected/models/user.php文件当中
添加
b)使用属性标签:
在页面当中通过form小组间的label的方法调用
1.<?php echo $form->label($user,'username');?>
2.<?php echo $form->label($user,'username');?>
3.<?php echo $form->label($user,"newpass");?>
4<?php echo $form-label($user,'repass')?>
c)加载元素控件
<?php echo $form->textField($user,'username',
array("class"=>"form_input","value"=>Yii::app() ->user->name,"readonly"=>"readonly"));?>
但是需要注意我们要在model的user文件中创建属性newpass,和repass
8.对表单验证添加规则
a)打开文件 blog/protected/models/User.php,新建规则方法
public function rules()
{
return array(
//原始密码不能为空
array("password","required","message"=>"原始密码不能为空"),
array("newpass","required","message"=>"新密码不能为空"),
array("repass","required","message"=>"确认密码不能为空"),
array("repass",'compare','compareAttribute'=>'newpass','message'=>'两次密码输入不一致'),
);
}对数据进行验证:
i.在控制器当中,将提交的数据进行压入处理
代码如下
$model=User::model();
if(!empty($_POST['User']))
{
$model->newpass=$_POST['User']['newpass'];
$model->repass=$_POST['User']['repass'];
$model->username=$_POST['User']['username'];
$model->password=$_POST['User']['password'];
}
c)$model->validate();
如果验证失败,需要将错误显示;
在模主页面中使用
<?php echo $form->error($user,'newpass');?>
验证原始密码
a)首先,对于原始密码的验证一定要查询数据库,而没有任何一个规则可以帮助我们查询数据库进行对比
除了查询和修改,我们还可以增加
增
save方法
$model=new model();
$model=attributes=$_POST['user']
$model->save();(在插入的时候)会先帮你验证数据
save方法,在new Model的时候是增加,在$model::model()的时候是修改
查询单条
$find()查询一条
find('name=:name',array(":name"='admin'))
findByPk(array(1,2))通过主键来查询
findBysql()通过SQL来查询出一条
查询多条
就把find更改为findAll
删
model::model()->deleteByPk($id)
IV。为了使用不同的规则在不同的场景下生效:
1.可以 在规则后指定on场景
2例如:
a)Array("password",....,'on'=>'edit');
2.需要在控制器的方法当中指定场景名称
$model->scenario="edit";//自定义会显得特别清晰
Public function rules()
{
return array(
Array('password',"checkPass"),
)
public function checkPass()
{
$usermodel=User::model();
$data=$usermodel->find('name=:name and password=:pass',array(":name"=>Yii::app()->user->name,":pass"=>$this->password));
if(empty($data))
{
$this->addError('password',"原始密码不正确");
}
1.验证原始密码
a)首先对于原始密码的验证一定要查询数据库,而没有任何一个规则查询数据库进行对比,因为,我们需要使用自定义的方法作为规则
public function checkPass(){
$data=$this->find("name=:name and password=:pass",array(":name"=>Yii::app()->user->name,":pass"=>$this->password));
p($data);
}
这是写在user里面的,所以可以用find,
array("passowrd","checkPass"),
执行密码的修改
if($model->validate())
{
$userinfo=$model->find("name=:name",array(":name"=>Yii::app()->user->name));
if($model->updatebypk($userinfo->id,array("password"=>$_POST['User']['newpass'])))
{
//设置临时的请求信息
Yii::app()->user->setFlash('success',"用户密码修改成功");
}
}
在模板中判断是否有提示信息,如果有直接输出
b)用户的列表:
i.首先修改布局文件 blog/protected/modules/admin/views/layous/admin.php
ii.在userz控制器中添加方法
iii 新建模板文件
c)在控制器当中进行数据的查询:
$model=user::model();
$data-$model->findallbysql("select * from user");
$this->render("index",array('user'=>$data));
d) 在模板当中遍历数据
编辑超链接
<?php echo $this->createUrl('mod',array('id'=>$user->id));?>
=====================================
yii框架还可以设置关联
在某个model模型中
public function relations()
{
return arrray(
'cate'=>array(self::BELONS_TO,'Category','cid')//属于category类,通过cid来关联
)
右边的array()实际上是返回一个联合查询的结果,左边的cate是它对应的下标
}
HAS_MANY(有多个)
HAS_ONE(有一个)
MANY_MANY(多对多)
Yii框架分页模块设置
对于Controller.php中设置
在分页的actionIndex方法中,步骤如下
$model=User::model();
$criteria=new CDbCriteria();//AR的另一种写法
$total=$model->count($criteria);//查询记录总数
$pager=new CPagination($total);//实例化分页类
$pager->pageSize=1;//定义页大小
$pager->applyLimit($criteria);//进行limit截取
$data=$model->findALL($criteria);
//$data=$model->findAllbySQL("select id,username from user");
$this->render("index",array('users'=>$data,"pages"=>$pager));
而在被render的前台页面中,我们如此调用被分配的papes
<?php
$this->widget("CLinkPager",array(
'header'=>'会员记录',
'firstPageLabel'=>'首页',
'lastPageLabel'=>'末页',
'prevPageLabel'=>'上一页',
'nextPageLabel'=>'下一页',
'pages'=>$pages,
'maxButtonCount'=>5
)
);
?>
Yii框架上传模块
首先,我们要对展示的mod.php页面做修改,在$this->beginWidget("CActiveForm",array('htmloptions'=>array('enctype'=>'multipart/form-data')));
if(!empty($_FILES['profile']))
{
$upload=CUploadedFile::getInstance($profile,"pic");
$preRand="img_".mt_rand(0,999).time();
$subfix=$upload->extensionName;
$imgName=$preRand.".".$subfix;
$upload
这是自己修改之后的上传,因为之前做的有错误
if(!empty($_FILES['profile']))
{
//开始处理文件上传
//并且将上传后的文件名存入到数据库当中
$upload=CUploadedFile::getInstance($profile,'pic');
$preRand="img_".mt_rand(0,999).time();
$subfix=$upload->extensionName;
$imgName=$preRand.".".$subfix;
$upload->saveAs("./assets/uploads/".$imgName);
$profile->pic=$imgName;
}
$profile->attributes=$_POST['profile'];
if($profile->validate())
{
echo "<hr/>";
p($profile);
echo "<hr/>";
$_POST['profile']['pic']=$imgName;
p($_POST);
if($profile->updateAll($_POST['profile'],'uid=:id',array(":id"=>$_GET['id'])))
{
Yii::app()->user->setFlash('success',"用户修改成功");
}
Yii框架作权限认证
1.先将httpd.conf中的LoadModule rewrite_module modules/mod_rewrite.so前的注释符号删掉
2.再把httpd.conf中的所有AllowOverride 后更改为All
3.在项目根目录下新建.htaccess文件,内容如下
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
4.最后修改main.php,让其中包含如下
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'rules'=>array(
// "<module:\w+>_<controller:\w+>_<action:\w+>"=>array('<module>/<controller>/<action>','urlSuffix'=>".html"),
//"<module:\w+>_<controller:\w+>_<action:\w+>_id_<id:\d+>"=>array('<module>/<controller>/<action>/?id/<id>','urlSuffix'=>'html'),
),
),
View Code