cakephp image uplpoad 2

別テーブルで画像を管理、例えばuserとimagesテーブルで分けたい場合。

まずはimagesテーブルを作る。

CREATE table images (
    `id` int(10) unsigned NOT NULL auto_increment,
    `model` varchar(20) NOT NULL,
    `user_id` int(11) NOT NULL,
    `name` varchar(32) NOT NULL,
    `image` varchar(255) NOT NULL,
    `dir` varchar(255) DEFAULT NULL,
    `type` varchar(255) DEFAULT NULL,
    `size` int(11) DEFAULT 0,
    `active` tinyint(1) DEFAULT 1,
    PRIMARY KEY (`id`)
);

Image でactsAsを宣言。belongsToでユーザとのリレーションを構築。
imagesテーブルのuser_idで紐付けたいので、foreingkeyはuser_idで。
画像格納パスは画像ID毎になる。(webroot/files/thumb/image_id/xxxx.jpgのようなかんじ)
‘pathMethod’をflatにすれば、全ての画像は’path’のディレクトリ配下に一括格納。

    public $actsAs = array(
        'Upload.Upload' => array(
            'image' => array(
                'path'          => '{ROOT}webroot{DS}files{DS}thumb{DS}',
                'thumbnailSizes' => array(
                    'xvga' => '1024x768',
                    'vga' => '640x480',
                    'thumb' => '80x80'
                )
            )
        )
    );

    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
        ),
    );

User モデルではhasManyでimageを。

    public $hasMany = array(
        'Image' => array(
            'className'    => 'Image',
            'foreignKey'   => 'user_id',
			'conditions'   => array(
                	'Image.model' => 'User',
            	),        
			)
    );

同じくUserモデル内で画像登録用の関数を用意。

  public function createWithImages($data) {
    // Sanitize your images before adding them
    $images = array();
    if (!empty($data['Image'][0])) {
      foreach ($data['Image'] as $i => $image) {
        if (is_array($data['Image'][$i])) {
          // Force setting the `model` field to this model
          $image['model'] = 'User';

          // Unset the foreign_key if the user tries to specify it
          if (isset($image['foreign_key'])) {
            unset($image['foreign_key']);
          }

          $images[] = $image;
        }
      }
    }
    $data['Image'] = $images;

    // Try to save the data using Model::saveAll()
    $this->create();
    if ($this->saveAll($data)) {
      return true;
    }

    // Throw an exception for the controller
    throw new Exception(__("This post could not be saved. Please try again"));
  }

そしてuserContollerでaddするときに、上の関数を使う。

.....
if ($this->User->save($this->request->data)) {
	// add for image upload
	$this->User->createWithImag,es($this->request->data);
	$this->Session->setFlash(__('The user has been saved'));
	$this->redirect(array('action' => 'index'));
} else {
	$this->Session->setFlash(__('The user could not be saved. Please, try again.'));
}
....

viewはこのように、モデルをhiddenで持たせておく。

    echo $this->Form->input('Image.0.image', array('type' => 'file', 'label' => 'Image'));
    echo $this->Form->input('Image.0.model', array('type' => 'hidden', 'value' => 'User'));

複数登録させたいときは、Image.0.imageを増やしていけば良さそうだ。