YII学习之Rules验证

DATE: 2015-09-03 / VIEWS: 889

继续我的学习之路,依旧不用YII的视图创建代码,选择手写。

视图 [view.php]


<?php
use yii\helpers\Url;
$id = Yii::$app->request->get('id',0);
?>
<link href="/assets/dc872647/css/bootstrap.css" rel="stylesheet">
<link href="/css/site.css" rel="stylesheet"></head>
<form method="post" enctype="multipart/form-data" id="view" value="<?= Url::toRoute(['index/view','id'=>$id]) ?>">
<?php if(Yii::$app->getRequest()->enableCsrfValidation)
    echo '<input type="hidden" name="_csrf" value="'.Yii::$app->getRequest()->getCsrfToken().'" />';?>
<div class="form-group">
    <label for="exampleInputUsername">用户名</label>
    <input type="text" class="form-control" id="exampleInputUsername" name="username" placeholder="用户名" value="<?php echo $user['username']; ?>">
    <span id="usernameTips"></span>
  </div>
  <div class="form-group">
    <label for="exampleInputEmail1">邮箱</label>
    <input type="text" class="form-control" id="exampleInputEmail1" name="email" placeholder="邮箱" value="<?php echo $user['email']; ?>">
    <span id="emailTips"></span>
  </div>
  <div class="form-group">
    <label for="exampleInputPassword">密码</label>
    <input type="password" class="form-control" id="exampleInputPassword" name="password" placeholder="Password">
    <span id="passwordTips"></span>
  </div>
  <div class="form-group">
    <label for="exampleInputPassword1">确认密码</label>
    <input type="password" class="form-control" id="exampleInputPassword1" name="password1" placeholder="Password">
    <span id="password1Tips"></span>
  </div>
  <div class="form-group">
    <label for="exampleInputPassword1">性别</label>
    <div class="form-control">
    <label class="radio-inline">
  <input type="radio" name="sex" id="inlineRadio1" value="男" <?php if($user['sex'] == '男') echo 'checked=""'; ?>> 男
</label>
<label class="radio-inline">
  <input type="radio" name="sex" id="inlineRadio2" value="女" <?php if($user['sex'] == '女') echo 'checked=""'; ?>> 女
</label>
<label class="radio-inline">
  <input type="radio" name="sex" id="inlineRadio3" value="保密" <?php if($user['sex'] == '保密') echo 'checked=""'; ?>> 保密
</label>
</div>
<span id="sexTips"></span>
  </div>
  <div class="form-group">
    <label for="exampleInputCity">籍贯</label>
    <select id="exampleInputCity" class="form-control" name="city">
        <option value="">请选择</option>
        <option value="北京" <?php if($user['city'] == '北京') echo 'selected=""'; ?>>北京</option>
        <option value="上海" <?php if($user['city'] == '上海') echo 'selected=""'; ?>>上海</option>
        <option value="安徽" <?php if($user['city'] == '安徽') echo 'selected=""'; ?>>安徽</option>
        <option value="浙江" <?php if($user['city'] == '浙江') echo 'selected=""'; ?>>浙江</option>
    </select>
    <span id="cityTips"></span>
  </div>
  <div class="form-group">
    <label for="exampleInputOld">出生日期</label>
    <input type="text" class="form-control" id="exampleInputOld" name="old" placeholder="填写出生日期" value="<?php echo $user['old']; ?>">
    <span id="oldTips"></span>
  </div>
  <div class="form-group">
    <label for="exampleInputFile">个人相片</label>
    <input type="file" name="photo" id="exampleInputFile">
    <span id="photoTips" class="help-block">jpg、png</span>
  </div>
  <?php if(empty($id)){ ?>
  <div class="checkbox">
    <label>
      <input type="checkbox" name="agreement"> 同意协议
    </label>
    <span id="agreementTips"></span>
  </div>
  <?php } ?>
  <button type="submit" class="btn btn-default">Submit</button>
</form>
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<script type="text/javascript" src="/Js/jquery.form.js"></script>
<script type="text/javascript">
function callResponse(responseText, statusText){
  if(responseText.status == 201){
    $('.has-error').find('span').html("");
    $('.has-error').removeClass('has-error');

    $.each(responseText.message,function(index, el) {
      $("#"+index+"Tips").html(el[0]);
      $("#"+index+"Tips").parent("div.form-group").addClass('has-error');
    });
  }else if(responseText.status == 202){
    alert('注册失败!');
  }else{
    alert('注册成功!');
  }
}
$(function(){
  var options = { 
    success: callResponse,
    dataType:'json',
    timeout: 3000
  }
  $("#view").ajaxForm(options);
})
</script>
模型 [Member.php]



<?php
namespace app\models;

use Yii;
use yii\db\ActiveRecord;

class Member extends ActiveRecord{

    public $password1;
    public $agreement;

    public function rules()
    {
        return [
            ['username','required','message'=>'请填写用户名!'],
            ['username', 'string', 'min'=>2,'tooShort'=>'用户名长度必须大于2','max' => 50,'tooLong'=>'用户 名长度必需在100以内'],
            ['username','unique','message'=>'用户名已经存在','on'=>'register'],
            ['username','unique','filter'=>'id <> '.$this->id,'message'=>'用户名已经存在','on'=>'update'],
            ['email','required','message'=>'请填写邮箱!'],
            ['email','email','message'=>'邮箱格式不正确!'],
            ['password','required','message'=>'请填写密码!','on'=>'register'],
            ['password', 'string', 'min'=>6,'tooShort'=>'密码必须大于6位','max' => 20,'tooLong'=>'密码必须小于20位'],
            ['password1','compare','compareAttribute'=>'password','message'=>'请再次填写密码!'],
            ['sex','required','message'=>'请选择性别!'],
            ['sex','in','range'=>['男','女','保密'],'message'=>'选择不对'],
            ['city','required','message'=>'请选择籍贯!'],
            ['old','required','message'=>'请填写出生日期!'],
            ['old','date','format'=>'yyyy-MM-dd','message'=>'日期不正确!'],
            [['photo'],'file','extensions'=>'jpg,png','wrongExtension'=>'文件格式不正确!','maxSize'=>1000000,'tooBig'=>'文件太大了'],
            ['agreement','required','requiredValue'=>true,'message'=>'请同意注册协议!','on'=>'register']
        ];
    }

    /**
     * $insert 插入时为true,编辑时为false
     */
    public function beforeSave($insert)
    {
        if(parent::beforeSave($insert)){
            if($insert){
                $this->create_time = time();
            }
            if(isset($this->password))
                $this->password = md5($this->password);
            $this->update_time = time();

            return true;
        }else{
            return false;
        }
    }

}
控制器 [IndexController.php]



<?php
namespace app\controllers;

use Yii;
use yii\web\controller;
use app\models\Member;
use yii\web\UploadedFile;

class IndexController extends controller
{

    public function actionView($id=0)
    {

        $this->layout = false;

        if($id){
            $member = Member::findOne($id);
            if($member !== null){
                //编辑场景
                $member->setScenario('update');
            }else{
                return '未找到数据~';
            }
        }else{
            $member = new Member;
            //注册场景
            $member->setScenario('register');
        }
        //Post提交
        if(Yii::$app->request->getIsPost()){

            $member->setAttributes(Yii::$app->request->post());

            $member->photo = UploadedFile::getInstanceByName('photo');

            if($member->validate()){ //通过验证

                /**
                 * 判断是否选择了文件上传
                 * 如果未通过注销当前attributes,这里主要是兼容update场景
                 */
                if($member->photo){

                    if(!file_exists('uploads/')){  
                        mkdir('uploads/','777');  
                    }

                    $filename = time().'.'.$member->photo->extension;
                    $member->photo->saveAs('uploads/' . $filename);
                    $member->photo = 'uploads/' . $filename;

                }else{
                    unset($member->photo);
                }

                $result = $member->save();

                if($result){
                    header('Content-type:application/json');
                    echo json_encode(['status'=>200,'message'=>'保存成功']);
                }else{
                    header('Content-type:application/json');
                    echo json_encode(['status'=>202,'message'=>'保存失败']);
                }

            }else{ //验证未通过

                header('Content-type:application/json');
                echo json_encode(['status'=>201,'message'=>$member->getErrors()]);

            }

            exit();
        }

        //创建视图
        return $this->render('view',['user'=>$member]);

    }
}


这里用到了文件上传类,和场景的应用。