プログラム初心者のcakephp2.x・wordpress情報

プログラム初心者のcakephp2.xの技術情報・wordpressやAPI関連も覚書(PHP・mySQL)

cakePHP2.xでこの機能あるのかな?ちょっとざっと調べてみた。(ファイルアップロード)

cakePHP2.xでファイルアップロードの機能追加について。やっぱり画像投稿してほしいから・・・。この機能は必要だな。

 

この記事参考にしました。cakePHP 2.x 画像アップロードプラグイン”upload”の使い方

 

本当はこのブログにあるように画像を一つのテーブルで管理したかったが、うまくうごかなかった(スキルが足りなくて分からなかった)ので、josegonzalez / uploadの解説にある。オーソドックスな方法で、必要なテーブルに画像名・ディレクトリ名だけ追加するパターンでやってみた。

 

テーブル構成はこちら。画像はとりあえず3枚まで。

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(20)  utf8_unicode_ci NOT NULL,
  `photo` varchar(255)  utf8_unicode_ci DEFAULT NULL,
  `photo_dir` varchar(255)  utf8_unicode_ci DEFAULT NULL,
  `photo1` varchar(255)  utf8_unicode_ci DEFAULT NULL,
  `photo2` varchar(255) utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

 例によって、josegonzalez / uploadからプラグインをダウンロードして、

プラグインフォルダに「Upload」というフォルダ名で設置。app/Config/bootstrap.phpプラグインを読み込む CakePlugin::load('Upload');を記述。

 model内でプラグインを呼び出す。画像の条件設定もいろいろ設定できるが、いずれ設定しよう。

modelはこんな感じで。

class User extends AppModel {
    public $actsAs = array(
        'Upload.Upload' => array(
            'photo' => array(
                'fields' => array(
                    'dir' => 'photo_dir'
                )
            ),
            'photo1' => array(
                'fields' => array(
                    'dir' => 'photo_dir'
                )
            ),
            'photo2' => array(
                'fields' => array(
                    'dir' => 'photo_dir'
                )
            )
        )
    );
}

 コントローラーは特に変わった記述なし。

 

class UsersController extends AppController {
    public function add() {
        if ($this->request->is('post')) {
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('登録しました。'));
            } else {
                $this->Session->setFlash(__('新規登録できませんでした'));
            }
        }
    }

	public function index() {
        $this->User->recursive = 0;
        $this->set('users', $this->paginate());
    }
} 

 

 viewの記述 add.ctp typeをfileに指定しなければならい。

<?php echo $this->Form->create('User', array('type' => 'file')); ?>
<?php echo $this->Form->input('User.username'); ?> 
<?php echo $this->Form->input('User.photo', array('type' => 'file')); ?> 
<?php echo $this->Form->input('User.photo1', array('type' => 'file')); ?> 
<?php echo $this->Form->input('User.photo2', array('type' => 'file')); ?> 
<?php echo $this->Form->input('User.photo_dir', array('type' => 'hidden')); ?> 
<?php echo $this->Form->end('登録'); ?> 

 viewの記述 index.ctp

<p><?php echo $this->Html->link('新規投稿', array('action' => 'add')); ?></p>
<table>
    <tr>
        <th>Id</th>
        <th>username</th>
        <th>Img</th>
    </tr>
    <?php $i = 0; foreach ($users as $post): ?>
    <tr>
        <td><?php echo $post['User']['id']; ?></td>
        <td>
            <?php echo $this->Html->link($post['User']['username'], array('action' => 'view', $post['User']['id']));?>
        </td>
        <td>
    	<?php if($post['User']['photo']): ?>
            <img src="/files/user/<?php echo $post['User']['id'].'/'.$post['User']['photo']; ?>" width="100">
		<?php endif; ?>
		<?php if($post['User']['photo1']): ?>
			<img src="/files/user/<?php echo $post['User']['id'].'/'.$post['User']['photo1']; ?>" width="100">
		<?php endif; ?>
		<?php if($post['User']['photo2']): ?>
			<img src="/files/user/<?php echo $post['User']['id'].'/'.$post['User']['photo2']; ?>" width="100">
		<?php endif; ?>
        </td>
    </tr>
   <?php endforeach; ?>
</table>

 

※一部プラグインのディレクトリ指定部分を修正。app\Plugin\Upload\Model\Behavior\UploadBehavior.php 

 public $defaults = array()の中の「'path' => '{ROOT}webroot{DS}files{DS}{model}{DS}{field}{DS}',」→「'path' => '{ROOT}webroot{DS}files{DS}{model}{DS}',」にした。

field名を削除したのは、画像のディレクトリ構成があまりにも複雑になってしまうため。やっぱり同一ディレクトリ内に同一投稿画像をまとめたかったから・・・。

 

まぁー理想とは違うけど、とりあえず簡単に実現可能だ!

投稿画像のファイル名のリネイムとかも出来るともっといいのかなとか思ったりしているが・・。また今度やってみよう。