CakePHPのファイルアップロードで非常に便利なプラグインがFilebinder。

Filebinder

このFilebinderでファイルが保存されるディレクトを動的に変更したい場合、Model::transferTo()を上書きすることで変更することが出来る。

Filebinderの使い方はよく検索で出てくるが、ディレクトリ変更は出て来ないのでここに記録を残しておく。

タイムスタンプで区切る

<?php
    public function transferTo(Model $model, $data) {
        $time = preg_replace('/[\s:-]/','', $data['modified']);
        return $this->alias . DS . $time . DS . $data['model_id'] . DS . $data['field_name'] . DS . $data['file_name'];
    }
?>

モデルIDを10000区切りでディレクトリ変更

<?php
    public function transferTo(Model $model, $data) {
        $model = ClassRegistry::init($model->alias);
        $result = $model->find('first', array('fields'=>array($model->alias.'.id'),'conditions'=>array($model->alias.'.id' => $data['model_id'])));
        $dirNumber = intval($result[$model->alias]['id']/10000)+1;
        $path = $model->alias . DS. $dirNumber . DS . $data['model_id']. DS . $data['field_name'] . DS . $data['file_name'];
    }
?>

Filebinderとても便利だけど、画像に特化しているわけではないので、画像アップロードの際は違うプラグインを探した方がいいのか。
tmpに保存する前にフックするしたいんだけどな。

CakePHP2 実践入門 (WEB+DB PRESS plus)
CakePHP2 実践入門 (WEB+DB PRESS plus)

詳解CakePHP辞典―2.0/2.1/2.2/2.3対応
詳解CakePHP辞典―2.0/2.1/2.2/2.3対応