YII学习之Rules验证
继续我的学习之路,依旧不用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]); } }
这里用到了文件上传类,和场景的应用。