2017-06-17 23:29:44 2620次浏览 3条回答 1 悬赏 20 金钱

model:

public $imageFile;
public function rules()
{
    return [
        [['name','cat','SKU','imageFile'], 'required'],
        [['cat','name', 'photo', 'SKU',], 'string', 'max' => 100],
        ['photo','safe','on'=>'update'],
        ['SKU', 'unique', 'message' => '产品编码已存在.'],
        ['imageFile', 'image', 'extensions' => 'png, jpg',
            'minWidth' => 100, 'maxWidth' => 1500,
            'minHeight' => 100, 'maxHeight' => 1000,
        ],
    ];
}

controller:

public function actionCreate() {
    $model = new Product();
    //unique的ajax验证
    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }
    if ($model->load(Yii::$app->request->post())  ) {
        $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
        $filename = '/uploads/product/' . time() . uniqid() . '.' . $model->imageFile->extension;
        $path = Yii::$app->basePath . $filename;
        $model->photo = $filename;
        //$model->validate();
        if ( $model->save()) {
            $model->imageFile->saveAs($path);
            return $this->redirect(['view', 'id' => $model->id]);
        }else{
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    } else {
        return $this->render('create', [
                    'model' => $model,
        ]);
    }
}

view:

.....
<?php $form = ActiveForm::begin(['id'=>'create-from',
    'layout'=>'horizontal', 
    //据查unique验证必须开这个
    'enableAjaxValidation' => true]);
?>

<?php echo $form->errorSummary($model); ?>
<div class="form-group">
    <?php echo Html::submitButton('新建产品', ['class' =>  'btn btn-lg  btn-success']) ?>
</div>

<?php echo $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<?php echo $form->field($model, 'cat')->dropDownList( yii\helpers\ArrayHelper::map(\common\models\ArticleCategory::findBySql('select title from article_category')->all(), 'title', 'title'), ['prompt' => '---请选择---']) ?>
<?php //echo $form->field($model, 'cat')->textInput(['maxlength' => true]) ?>
<?php echo $form->field($model, 'imageFile')->fileinput(['maxlength' => true]) ?>
......
补充于 2017-06-17 23:35

页面端unique验证正常,但是图片的require验证一直显示,不能为空,明明已经选择了文件
参考了这个
https://stackoverflow.com/questions/33076125/how-to-use-unique-rules-in-active-record-yii2

补充于 2017-06-18 09:12

问题解决

//unique的ajax验证
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
    Yii::$app->response->format = Response::FORMAT_JSON;
    $model->imageFile = 'test';//伪造图片一个数据,这样ajax验证通过
    return ActiveForm::validate($model);
}
  • 回答于 2017-06-23 18:10 举报

    ajax验证的时候,ActiveForm::validate第二个参数可以选择需要验证的字段,只开启验证需要ajax验证的字段即可,其它字段反正前端后端都会再验证的。

    1 条回复
    回复于 2017-07-02 22:27 回复

    这样代码效率就会更高对吧,谢谢

  • 回答于 2017-07-04 14:55 举报

    唯一性验证需要在model的rules规则里为想要唯一的字段添加unique规则,还需要显式的调用model的validate()方法就能达到想要的效果,问题是图片字段也必填的rules规则,在页面中选择一个图片后就会一直提示请选择一个文件,请问你们唯一字段和图片必填字端共存的问题解决了么,如果解决了还请指点指点

  • 回答于 2017-07-05 22:06 举报

    解决了,非常感谢

您需要登录后才可以回答。登录 | 立即注册
搞搞的传奇
见习主管

搞搞的传奇

注册时间:2015-02-24
最后登录:2020-06-04
在线时长:24小时46分
  • 粉丝8
  • 金钱5
  • 威望10
  • 积分345

热门问题