Cakephp 的 beforeSave() 不使用 $model::save() 保留新数据

Posted

技术标签:

【中文标题】Cakephp 的 beforeSave() 不使用 $model::save() 保留新数据【英文标题】:Cakephp's beforeSave() not retaining new data using $model::save() 【发布时间】:2014-05-20 12:30:08 【问题描述】:

当我在 SalasController reservar() 方法上执行 debug($this->data) 时,来自 json 的 $data 是可以的,但是当我执行 this->Sala->save($this->data) 并在 beforeSave() 上尝试 debug($data) 时,返回:

Notice (8): Undefined property: FormataDataBehavior::$data [APP\Model\Behavior\FormataDataBehavior.php, line 52]
\app\Model\Behavior\FormataDataBehavior.php (line 52)
null

SalasController.php

App::uses('AppController', 'Controller');

class SalasController extends AppController 

public $components = array('RequestHandler');

public function beforeFilter() 
    parent::beforeFilter();
    $this->Auth->allow('listar', 'reservar');
    $this->RequestHandler->addInputType('json', array('json_decode', true));

    public function reservar() 
    $this->Sala->save($this->data); //no conditions just for debugging.

模型 Sala.php

class Sala extends AppModel 

public $useTable = 'agenda';
public $actsAs = array(
    'FormataData' => array('dia')
);

行为

class FormataDataBehavior extends ModelBehavior 

// Armazena os campos do model a serem formatados.
public $campos;

//Inicializa o behavior
public function setup(Model $model, $settings = array()) 
    if (!empty($settings)) 
        $this->campos[$model->name] = $settings;
     else 
        throw new MethodNotAllowedException('Campos data não informados na declaração do behavior');
    


public function beforeSave(Model $model, $options = array()) 
    parent::beforeSave($model, $options);
    debug($this->data); //trying show data, but is !isset... =/
    die();

MyJs

function adicionarReserva() 
var dadosForm = Sala: ;
$.each($("#form-reservas").serializeArray(), function(index, value) 
    dadosForm.Sala[value.name] = value.value;
);
$.post("/intracake/Salas/reservar.json", dadosForm)
        .done(function(data) 
            sysMsg(data.html);
            atualizaTabelas();
        );

【问题讨论】:

FormataDataBehavior 是一种行为,而不是模型,所以我认为你应该使用$model->data 而不是$this->data $data = $model->read(); ? $model->data(我编辑了我的评论),data 是根据 CakePHP api 的 Model 的公共属性,因此您可以从任何地方访问它。 所以,我会发布一个答案......你可以检查是否是一个好习惯?我发布代码。 因为您查看的是 Model 类的文档,而不是 ModelBehaviour 类的文档。 【参考方案1】:

@Holt 提示后我的 beforeSave;

public function beforeSave(Model $model, $options = array()) 
    parent::beforeSave($model, $options);
    $this->formataBeforeSave($model);
    return true;


public function formataBeforeSave(Model &$model, $padrao = 'Y-m-d') 
    foreach ($this->campos[$model->name] as $campo) 
        if (isset($model->data[$model->name][$campo]) && !empty($model->data[$model->name][$campo])) 
            $model->data[$model->name][$campo] = $this->converte($model, $model->data[$model->name][$campo], $padrao);
        
    

【讨论】:

以上是关于Cakephp 的 beforeSave() 不使用 $model::save() 保留新数据的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3 - beforeSave 回调在编辑时不起作用

有没有办法在 cakePHP 中将数据从 beforeSave() 传递到 afterSave()?

BeforeSave CakePHP 数学

Cakephp 的 beforeSave() 不使用 $model::save() 保留新数据

CakePHP 数据在验证期间发生更改,并且 beforeSave 未随更改一起保存

CakePHP 验证错误未出现