2016-07-16 01:42:15 11545次浏览 4条回答 1 悬赏 10 金钱

我是用ajax post表单请求的后台方法入库,_csrf也有,这是我后台接收到的数据

Array
(
    [_csrf] => aGZhOHUtM0EMLyVyNHl1ByUENUkQYWQuKgc7eyQdB3AcITFPWGQLKA==
    [class_name] => 阿发发送
    [class_alias] => 啊打发
    [is_show] => 1
    [f_id] => 0
    [order] => 100
)

我的model rule

    public function rules()
    {
        return [
            [['class_name','class_alias'], 'required','message'=>'{attribute}不能为空'],
            [['created_at','updated_at'], 'default', 'value' => time()],
            [['order'], 'default', 'value' => 100],
            [['f_id', 'order', 'created_at', 'updated_at', 'is_show'], 'integer'],
            [['class_name', 'class_alias'], 'string', 'max' => 50]
        ];
    }

formname也有,
但是我用dump看总是false,不知道什么原因,能不能看到load model 报的错,求大神解决

最佳答案

  • wakasann 发布于 2016-07-16 17:09 举报

    我的Form使用了model,Form中的input的name组成模型名称[字段名称],普通Form POST提交之后,如:

    Array
    (
        [_csrf] => bEVmWUMwYXcFA0s2LmBRFFt9CzgnaUwdXCFQKgYHPkEgcC0dOVgUDw==
        [SignupForm] => Array
            (
                [user_name] => test1
                [user_email] => test@test.com
                [password] => 1111111
                [confirm_password] => 1111111
            )
    )
    

    下面是两个方法,你可以根据自己的情况使用:

    1. 你可以$.ajax中的data中使用{'modelName[class_name]':'阿发发送'}这样的格式

    2. 假如ajax的data是用$('#yourformid').serialize()传递的,你可以给你form中的表单元素的name使用你当前$model->load()的model名称模型名称[字段名称],如:SignupForm['user_name']

    2 条回复
    回复于 2016-07-16 17:34 回复

    看了源码才发现name应该放到模型数组里面

    回复于 2016-07-16 18:48 回复

    是,假如你用到模型的load()方法,或者使用到模型的validate()方法;这都和模型有关联了。

    觉得很赞
  • 回答于 2016-07-16 09:09 举报

    可以看一下源码,什么时候load方法会返回false。

    https://github.com/CraryPrimitiveMan/yii2-2.0.3-annotated/blob/master/framework/base/Model.php#L840-L858

        public function load($data, $formName = null)
        {
            // 如果存在 yii 的 form,就使用该 form,否则就拿到所在类的名称(不含 namespace)
            $scope = $formName === null ? $this->formName() : $formName;
            if ($scope === '' && !empty($data)) {
                // 如果 $scope 为空字符串,且 $data不为空,就设置属性
                // 即 $formName 为空字符串,且 $data不为空
                $this->setAttributes($data);
    
                return true;
            } elseif (isset($data[$scope])) {
                // 否则,必须存在 $data[$scope],使用 $data[$scope] 去设置属性
                $this->setAttributes($data[$scope]);
    
                return true;
            } else {
                return false;
            }
        }
    

    当不满足$scope === '' && !empty($data)isset($data[$scope])这两个条件的时候会返回false。
    这里你没有粘贴调用load时的写法,所以你自己对照一下,应该很快能找到原因

    1 条回复
    回复于 2016-07-16 17:34 回复

    嗯,我的就是这个原因,跟你讲的一模一样

    觉得很赞
  • 回答于 2016-07-18 10:28 举报

    load第二个参数设置为空字符串就可以了

    1 条回复
    回复于 2017-03-30 01:48 回复

    第二个参数是做什么的?

  • 回答于 2018-02-06 19:17 举报

    rules方法, 验证规则

您需要登录后才可以回答。登录 | 立即注册
醉丶春风
副董事长

醉丶春风 上海

注册时间:2015-11-23
最后登录:2021-11-22
在线时长:819小时26分
  • 粉丝8
  • 金钱11885
  • 威望100
  • 积分21075

热门问题