修改默认访问控制器

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,让其中包含如下

yii 框架 request 设置参数 yii框架搭建_User

yii 框架 request 设置参数 yii框架搭建_加载_02

'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