2017-06-17 23:29:44 179次浏览 3条回答 0 悬赏 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
最后登录:2017-08-08
在线时长:20小时54分

热门问题

在线
182