Функция beforeSave() в Cakephp не сохраняет новые данные с помощью $model::save()

Когда я делаю debug($this->data) в методе SalasController reservar(), $данные из json в порядке, но когда я делаю this->Sala->save($this->data) и пытаюсь debug($data) в beforeSave() вернуть это:

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();
        });
}

person Marcelo Aymone    schedule 20.05.2014    source источник
comment
FormataDataBehavior — это поведение, а не модель, поэтому я думаю, вам следует использовать $model->data вместо $this->data.   -  person Holt    schedule 20.05.2014
comment
$model->data (я отредактировал свой комментарий), data является общедоступным атрибутом модели в соответствии с API CakePHP, поэтому вы можете получить к нему доступ из любого места.   -  person Holt    schedule 20.05.2014
comment
Итак, я опубликую ответ ... вы можете проверить, является ли это хорошей практикой? Выкладываю код.   -  person Marcelo Aymone    schedule 20.05.2014
comment
Я не понимаю, почему документы торта ссылаются на $model::$data, просто $this->data внутри обратного вызова beforeSave(). book.cakephp.org/2.0/en/models/callback- method.html#beforesave   -  person Marcelo Aymone    schedule 20.05.2014
comment
Потому что вы смотрите документацию по классу Model, а не по классу ModelBehaviour.   -  person Holt    schedule 20.05.2014
comment
Значит, мой ответ правильный? Думаете о хороших практиках? Я могу передать &$model как ссылочный параметр для редактирования некоторых полей в beforeSave()?   -  person Marcelo Aymone    schedule 20.05.2014


Ответы (1)


Мои советы перед сохранением после @Holt;

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);
        }
    }
}
person Marcelo Aymone    schedule 20.05.2014