Обратный вызов cakephp beforeSave в Behaviors не сохраняет данные правильно

Контроллер:

    $data =
            array(
                'ContentI18n' =>
                array(
                    0 =>
                    array(
                        'title' => 'first',
                        'author' => 'first',
                        'source' => 'sgfsdfrst',
                        'lang' => 'fa',
                    ),
                ),
                'Content' =>
                array(
                    'publish' => 1,
                    'type' => 3,
                    'pages' => 8,
                    'volume' => 7,
                    'modified' => '2012-05-27 14:16:37',
                    'created' => '2012-05-27 14:16:37',
                    'lang' => 'fa',
                ),
    );
$this->Content->create();
$this->Content->saveAll($data);

Модель:

public $hasMany = array(
    'ContentI18n' => array(
        'className' => 'ContentI18n',
    )
);

Функция beforeSave в поведении:

public function beforeSave(Model $model) {
    // Define the new Translate model
    App::uses($model->name . 'I18n', 'Model');
    $varI18n = $model->name . 'I18n';
    $modelI18n = new $varI18n;


    foreach ($model->data[$model->name] as $key => $data) {
        if (!in_array($key, $this->setting))
            $modelData[$model->name][$key] = $data;
        else
            $modelData[$model->name . 'I18n'][0][$key] = $data;
    }
    $modelData[$model->name . 'I18n'][0]['lang'] = $model->locale;
    $modelData[$model->name]['lang'] = $model->locale;
    $model->data = $modelData;

    //pr($model->data);
    return TRUE;
}

каждая вещь кажется причиной, когда она сохраняется напрямую, она сохраняется с помощью saveAll. но когда я использую ту же структуру данных, поведение не работает без ошибок.


person Arash Mousavi    schedule 27.05.2012    source источник


Ответы (1)


Я узнал, что обратный вызов beforeSave не будет запускаться saveAll. для выполнения некоторого кода перед saveAll мы должны переопределить функцию saveAll в нашей модели.

public function saveAll($data, $options = array()) {
            /*
            your code you want execute before saving...
            */
    parent::saveAll($data, $options);
}

для других методов сохранения, таких как saveMany, saveAssociated,... beforeSave запускается ими.

person Arash Mousavi    schedule 20.08.2012