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]);
}
}
这里用到了文件上传类,和场景的应用。