質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

339閲覧

cakephp2 upload pluginで投稿した画像をviewで表示

WoL

総合スコア7

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2019/08/26 12:06

初めまして、よろしくお願いします。

upload pluginで投稿した画像をviewで表示させようと思い、
下記のサイトの"既存テーブルにカラムを追加する場合"という項目を参考に作業を進めていました。

しっかり理解する CakePHP Upload プラグインの使い方 (1)

しっかり理解する CakePHP Upload プラグインの使い方 (2)

最初cakephp2の公式チュートリアルにあるbakeを使って作るブログアプリをベースに作業しており、それをベースに上記のサイトを参考にしてupload pluginを導入したら問題なく動作しposts/viewにも画像の表示をさせることが出来たのですが、

bakeで作ってしまったため理解が追いついてなく、またコードが見にくかったため、理解を深めるために公式チュートリアルにある、bakeを使わないで作る方で一から作り直してまたupload pluginを入れようとしました。

画像の投稿自体は問題なくいき、webrootの中にもちゃんと画像が格納されるのですが、posts/viewに画像を表示させることが出来なくて詰まってしまいました。

基本的に最初にやったことと同じようにやったのですが、おそらく何かの記述が足りないような気がしたので、一通り確認してみましたが上手くいかないため質問させて頂きました。

上にあるサイトの既存テーブルにカラムを追加する場合のところではUsersテーブルにカラムを追加していますが、新規ポストを投稿する際にタイトルと本文と一緒に画像を投稿したかったのでpostsテーブルにカラムを追加してやっております。

すいませんが、ご教授よろしくお願いします。

Model/post.php

class Post extends AppModel { public $actsAs = array( 'Search.Searchable',"Upload.Upload" => array( "photo" => array( "fields" => array( "dir" => "photo_dir", ), ), ), ); public $filterArgs = array( 'title' => array('type' => 'like'), ); public $validate = array( 'title' => array( 'rule' => 'notBlank' ), ); public function isOwnedBy($post, $user) { return $this->field('id', array('id' => $post, 'user_id' => $user)) !== false; } } ?>

View/Posts/add.ctp

<h1>記事の追加</h1> <?php echo $this->Form->create('Post', array('type' => 'file')); echo $this->Form->input('title'); echo $this->Form->input('body', array('rows' => '3')); //uploadプラグイン echo $this->Form->input('Post.photo', array('type' => 'file')); echo $this->Form->input('Post.photo_dir', array('type' => 'hidden')); echo $this->Form->end('投稿'); ?>

View/Posts/view.ctp

<h1>-- タイトル --</h1> <p><?php echo h($post['Post']['title']); ?><p> <h1>-- 本文 --</h1> <!-- 更新日時 --> <?php echo $post['Post']['created']; ?> <p><?php echo h($post['Post']['body']); ?></p> <!-- Uploadプラグイン --> <?php $post = 0; $base = $this->Html->url( "/files/image" ); $this->Html->image( $base . $post["photo_dir"] . "/" . $post["photo"] ); ?>

PostsController.php

<?php class PostsController extends AppController { public $uses = array('Post','User'); public $helpers = array('Html', 'Form'); public $components = array('Search.Prg'); public $presetVars = true; public function index() { //searchプラグイン $this->Prg->commonProcess(); $this->paginate = array( 'conditions' => $this->Post->parseCriteria($this->passedArgs), ); // $this->set('posts', $this->Post->find('all')); } public function view($id = null) { if (!$id) { throw new NotFoundException(__('Invalid post')); } $post = $this->Post->findById($id); if (!$post) { throw new NotFoundException(__('Invalid post')); } $this->set('post', $post); } public function add() { if ($this->request->is('post')) { $this->Post->create(); if ($this->Post->saveall($this->request->data)) { $this->Flash->success(__('記事を投稿しました')); return $this->redirect(array('action' => 'index')); } $this->Flash->error(__('記事を投稿出来ませんでした')); } } public function edit($id = null) { if (!$id) { throw new NotFoundException(__('Invalid post')); } $post = $this->Post->findById($id); if (!$post) { throw new NotFoundException(__('Invalid post')); } if ($this->request->is(array('post', 'put'))) { $this->Post->id = $id; if ($this->Post->save($this->request->data)) { $this->Flash->success(__('記事の更新をしました')); return $this->redirect(array('action' => 'index')); } $this->Flash->error(__('記事を更新出来ませんでした')); } if (!$this->request->data) { $this->request->data = $post; } } public function delete($id) { if ($this->request->is('get')) { throw new MethodNotAllowedException(); } if ($this->Post->delete($id)) { $this->Flash->success( __('記事を削除しました', h($id)) ); } else { $this->Flash->error( __('記事を削除出来ませんでした', h($id)) ); } return $this->redirect(array('action' => 'index')); } }

画像の格納先はwebroot/files/imageの中に指定しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nojimage

2019/08/27 11:13

View/Posts/view.ctp で `$post['photo_dir']` `$post['photo']` は期待する値が入っている状態でしょうか?
nojimage

2019/08/29 04:27

Model/post.php は打ち間違いで Model/Post.php でファイルは作成されていますか?
guest

回答1

0

ベストアンサー

$this->Html->image() は文字列を戻り値とするので、 echo が必要です。
あと、直前に $post = 0 と、データを初期化してしまっています。

また、画像パス指定は / で始めればwebrootからのパスとしてくれますので、

php

1<!-- Uploadプラグイン --> 2<?php 3echo $this->Html->image('/files/image/' . $post['photo_dir'] . '/' . $post['photo']); 4?>

とすればよいでしょう。

投稿2019/08/27 11:24

nojimage

総合スコア957

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WoL

2019/08/28 03:03

回答ありがとうございます!echoが足りてないのは見落としでした。。 回答の通り変更してみたのですが Notice (8): Undefined index: photo_dir [APP/View/Posts/view.ctp, line 13] Notice (8): Undefined index: photo [APP/View/Posts/view.ctp, line 13] と出ました。解決策を調べてみて、色々やってみたのですが、上手く表示されませんでした。他に何か問題点ありそうでしょうか...?
nojimage

2019/08/29 04:34

データベースのpostsテーブルに photo, photo_dir は存在するのは確認されましたか? 存在するのであれば考えられる可能性として、後からテーブルに photo, photo_dirを追加したのであれば、スキーマキャッシュが残っていて photo, photo_dir にデータが保存されていない、もしくは、Postモデルが正しく読み込まれずAppModelでpostsテーブルの読み込みを行っている。といったところでしょうか。
WoL

2019/08/30 03:55

ご返信ありがとうございます。 Model/post.phpはこちらで打ち間違えておりました。cakephp内ではちゃんとPost.phpと記述しております。 postsテーブルにphoto,photo_dirはあります。二つともデータが格納されているのも確認しております。 キャッシュの削除をしてみましたが変わらずでした。。 もう少し頑張ってみます
nojimage

2019/08/30 05:41

PostsController::view の $this->Post->findById 直後に $post をdumpしてみてその時点で値が入っているか、次にview.ctpの最初で $post を dump して... のように順にチェックしていき、どの時点から値が抜けているのか確認してみるとよいかもしれません。
WoL

2019/08/30 07:05 編集

お世話になっております。 あのあと、少しやり方を変えてみましてpostsテーブルに新しくカラムを追加するやり方ではなく新規でattachmentsテーブルを作ってやるやり方でやり直してview.ctpに $i = 0; echo $this->Html->image("/files/image/" . $post["Image"][$i]["dir"] . "/" . $post["Image"][$i]["attachment"] ); このように記述したところ無事表示されました!ですがなぜpostsテーブルに新しくカラムを追加するやり方でできなかったのかは未解決のままなので、またそっちは別でやり直しながら模索してみます。 色々とありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問