0

コントローラ:

    $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ます。しかし、動作で同じデータ構造を使用すると、エラーなしで機能しませんでした。

4

1 に答える 1

2

beforeSave コールバックが saveAll によってトリガーされないことがわかりました。saveAll の前にいくつかのコードを実行するには、モデルで saveAll 関数をオーバーライドする必要があります。

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

saveMany、saveAssociated、... beforeSave などの他の保存方法については、それらによってトリガーされます。

于 2012-08-20T10:00:30.963 に答える