3.2.3版本,配置字段映射后自动验证不通过依然暴露真实字段

浏览:849 发布日期:2016/03/01 分类:求助交流 关键字: 字段映射 自动验证 暴露 真实字段
比如我在一个Model类里定义了字段映射
并且开启了批量验证.protected $_map = array(
    'ShopName'        => 'o_a_ShopName',
    'SellerId'        => 'o_a_SellerId',
);
如果这两个字段验证都不通过就返回一个错误数组array(
    o_a_SellerId => "请填写SellerId",
    o_a_ShopName => "请填写店铺名称"
)
使用ajax提交表单,返回的错误数组能被浏览器捕获到.so...还是暴露了真实的数据表字段名?
还是说我学艺不精,少了什么配置?

========2016-03-10====分割线=============

经过研究Think基础Model类,位于ThinkPHP/Library/Think/Model.class.php的代码发现一个成员方法public function parseFieldsMap($data, $type=1)拜读注释后发现,此成员方法的第一个参数$data是一个数组,如果这个数组中键值对的键名带有表字段名的将会被替换成字段映射前(后)的字段名,具体由第二个参数$type控制
$type为1的时候替换成映射前的(虚假)字段;
$type为2的时候替换成映射后的(真实)字段;
当我们使用自动验证出现验证不通过的情况时,错误信息被放置到$this->error数组中.并且键名是对应的表真实字段,由此一来,以上问题便可以很容易解决.
首先给Model.class.php类添加一个保护类型成员属性protected $validateErrorFieldType = 0;
//自动批量验证错误信息字段类型 0:虚拟字段; 1:真实字段
再找到成员方法public function getError()返回错误信息之前,添加一段代码如下:if($this->patchValidate && !empty($this->_map) && $this->validateErrorFieldType == 0) {
        $this->error = $this->parseFieldsMap($this->error);
}
如此一来,当开启批量自动验证且设置了字段映射后,我们可以通过在自定义的Model类中通过修改$this->validateErrorFieldType;成员属性的值来控制返回的错误信息数组中采用(映射前/映射后)的字段名称.

如果有其他更好的方式,请指正.
最佳答案
评论( 相关
后面还有条评论,点击查看>>