October/WinterCMS表单数据请求与返回消息处理
先看一段ajax实现的图片文件上传表单form的前端代码,注意如果是使用ajax
请求实现文件上传一定要把“data-request-files
”参数加上,其中data-request-flash
表示该表单实现的是一个ajax请求;最后data-request-validate
参数会根据当前form中data-validate-for
参数来定位错误字段并提示,如果不用这个参数那么winterCMS会弹出一个错误提示。
另外需要注意这三个参数在form中的位置,经过测试如果顺序有错把data-request-validate
放在前面它是不工作的。
<form data-request="onSave" data-request-files data-request-flash data-request-validate> {{ form_token() }} {{ form_sessionKey() }} <label>Award Title</label> <input type="text" name="award_title"> <span data-validate-for="award_title"></span> <label>Award image</label> <input type="file" name="awardimage"> <button type="submit" data-attach-loading>Save Award</button> </form>
再看php部分,我们定义了rules
验证规则,award_title
这个字段必填;至少5个字符;并且在数据字段中唯一。
public function onSave(){ $validator = Validator::make( //Data [ 'award_title' => Input::get('award_title') ], //Rules [ 'award_title' => 'required|min:5|unique:julian_library_awards,award_title' ] ); if($validator->fails()){ //return Redirect::back()->withErrors($validator); //Normal Request //Flash::error($validator); //AJAX request custom error message throw new ValidationException($validator); //AJAX request system error message }else{ $award = new Award(); $award->award_title = Input::get('award_title'); $award->slug = str_slug(Input::get('award_title')); $award->awardimage = Input::file('awardimage'); $award->save(); Flash::success('Award added!'); } } }
常规请求的消息捕捉
错误信息
那么常规的非ajax请求验证错误后通常是这样返回
return Redirect::back()->withErrors($validator);
精确捕捉错误(在相应的form表单位置中填写)
{{ errors.first('award_title') }}
全部错误
{% for error in errors.all() %} <p>{{ error }}</p> {% endfor %}
需要说明的是经过我的测试如果Rules[]
在component内部和Model中都进行了配置,Model
中的消息是不能被捕捉到的,所以这里建议把rules
尽量在component中配置好或覆盖model中的rule。
成功信息
如果验证成功并执行完成后我们可以使用
Flash::success('Award added!');
在前端可以使用 {% flash success %}
来捕获信息
{% flash success %} <p>{{ message }}</p> {% endflash %}
或者也可以直接返回,忽略消息
Redirect::back()
Ajax请求消息捕捉
错误消息
使用自定义的错误信息
if($validator->fails()){ Flash::error("Custom error message!"); //AJAX request custom error message }
使用系统捕捉的错误信息
throw new ValidationException($validator);
如果form中设置了data-request-validate
,则错误不再使用october cms的ajax框架弹出提示,而是根据具体data-validate-for
来定位错误。
如果不用data-validate-for
则所有错误信息都会使用内置的ajax框架弹出信息,这其实对用户来说不是很友好,个人还是觉得需要表单定位具体错误的更友好。
成功消息
通过Flash弹出消息
Flash::success('Award added!');
如果非ajax请求(form中没有data-request-flash
参数)则需要使用{% flash success %}
来获得,上文已经说明。