如何在 beforeSave() 回调 (CakePHP 2.10) 中更改模型的 $fieldList?

问题描述

使用 CakePHP 2.10:我正在保存 User 模型,但想检查是否随同提交了(新)密码。如果是,则需要对其进行哈希处理,并将 password_changed 字段更新为当前时间戳。

从 Model::beforeSave() 检查和更改数据很容易,因为数据可以通过 $this->data 访问,但 $fieldList 也需要更改。它通过函数$options 参数传递,但更改它当然没有任何效果

public function beforeSave($options = array()) {
    App::uses('Utitlity','Security');
    if(!empty($this->data['User']['password'])) {
        $this->data['User']['password'] = Security::hash($this->data[$this->name]['password'],'sha1',true); // Hash password
        $this->data['User']['password_changed'] = date('Y-m-d H:i:s'); // Set password_changed to current timestamp
        array_push($options['fieldList'],'password_changed'); // Make sure `password_changed` get's persisted <-- DOESN'T WORK (obvIoUsly)
    }
    return true;
}

我试图找出这是否也可以通过模型的属性访问。 Model->whitelist 似乎保留了一个 "fields allowed to be saved" 列表,但它被 Model::_doSave() 临时覆盖:

$_whitelist = $this->whitelist;
$fields = array();

if (!empty($options['fieldList'])) {
    if (!empty($options['fieldList'][$this->alias]) && is_array($options['fieldList'][$this->alias])) {
        $this->whitelist = $options['fieldList'][$this->alias];
    } elseif (Hash::dimensions($options['fieldList']) < 2) {
        $this->whitelist = $options['fieldList'];
    }
} elseif ($options['fieldList'] === null) {
    $this->whitelist = array();
}

如果我保存用户,我如何确保 password_changed 属性被保存,而不必在我的应用程序中的每个 $fieldList 中都包含它的键?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...