2012-05-27 8 views
0

Контроллер:CakePHP BeforeSave обратного вызова в поведений не сохранять данные правильно

$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. но когда я использую ту же структуру данных в поведении, не работал без какой-либо ошибки.

ответ

2

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

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

другие методы экономии, такие как saveMany, saveAssociated, ... BeforeSave триггером ими.