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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

Q&A

3回答

3506閲覧

cakephpで投稿とその投稿結果を同じviewで記述することは可能?

DaikiYamada

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

1グッド

0クリップ

投稿2016/01/12 13:06

編集2016/01/18 12:58

twitterのクローンサイトをcakeで作ってます。

自分の投稿に対する返信機能を実装してますが、
表題の通り、自分の投稿画面に返信用のフォームとその返信結果を同じ画面に
表示したいのですが、どうすれば良いのでしょうか?

現状は下記のようなエラーが出てしまいます。
キャプチャ

※【Reply.ctp】が自分の投稿・その投稿への返信・返信結果画面を想定してます。

今現在のコードは下記に記載いたします。

【Reply.php】

php

1<?php 2 3class Reply extends AppModel { 4 public $belongsTo = array( 5 'User' => array( 6 'className' => 'User', 7 'foreignKey' => 'user_id' 8 ), 9 'Tweet' => array( 10 'className' => 'Tweet', 11 'foreignKey' => 'tweet_id' 12 ) 13 ); 14 15 public function getData($tweetId, $userId) { 16 $options = array( 17 'conditions' => array( 18 'tweet_id' => $tweetId, 19 'user_id' => $userId 20 ) 21 ); 22 return $this->find('first', $options); 23 } 24} 25?>

【ReplyController.php】

php

1<?php 2 3class ReplysController extends AppController { 4 5 public function reply ($tweetId = null) { 6 $this->Reply->id = $tweetId; 7 $this->set('post', $this->Reply->findById($tweetId); 8 9 if ($this->request->is('post')) { 10 $request = $this->request->data['Reply']; 11 12 $data = array( 13 'user_id' => $this->user['id'], 14 'tweet_id' => $request['tweet_id'], 15 'acountname' => $request['acountname'], 16 'username' => $request['username'], 17 'content' => $request['content'] 18 ); 19 20 $this->Reply->save($data); 21 debug($data); 22 $this->redirect( array('controller' => 'tweets', 'action' => 'reply', $request['tweet_id'])); 23 } 24 25 $reply = $this->Reply->getData($tweetId, $this->user['id']); 26 $id = !empty($reply['Reply']['id']) ? $reply['Reply']['id'] : 0; 27 $content = !empty($reply['Reply']['content']) ? $reply['Reply']['content'] : ''; 28 29 $this->set('id', $id); 30 $this->set('content', $content); 31 $this->set('tweetId', $tweetId); 32 } 33} 34?>

【Reply.ctp】

php

1<h2><?php echo $post['Tweet']['username'].'@'.$post['Tweet']['acountname'] ?>さんのツイートへ返信</h2> 2<p><?php echo $post['Tweet']['content'] ?></p> 3<p><?php echo $post['Tweet']['created'] ?></p> 4<div> 5 <?=$this->Form->create('Tweet', array('action' => 'reply')); ?> 6 <?=$this->Form->input('content', array('label' => '返信')); ?> 7 <?=$this->Form->end('返信する'); ?> 8</div> 9 10<div> 11<p><?php echo $post['Reply']['username'].'@'.$post['Reply']['acountname'] ?></p> 12<p><?php echo $post['Reply']['content'] ?></p> 13<p><?php echo $post['Reply']['created'] ?></p> 14</div>

【TweetsController.php】

php

1public function reply($id = null) { 2 $user = $this->Auth->user(); 3 $this->Tweet->id = $id; 4 $this->set('post', $this->Tweet->findById($id)); 5 }
ikuwow👍を押しています

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

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

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

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

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

guest

回答3

0

次に、処理の流れをまとめます。

上の回答に載せたコードに、id(テーブルのidや、tweet_id、user_id等)の受け渡しと、ページ遷移を加えると、多分ご希望の最低限の機能を実現できると思います。
その処理を足した流れを、以下に書きます。

【処理の流れ】
0. [ツイート一覧ページ] tweetsテーブルから、user_idを指定して、ツイートの一覧を取得。そして、ツイートから1つ選び、tweetsテーブルのidとuser_idをリプライ投稿ページに送り、ページを移動する。

  1. [リプライ投稿ページ] [RepliesController.php]の[RepliesController], [addアクション]にて、1.から送られてきたtweetsテーブルのidとuser_idを使い、repliesテーブルの新規レコードを作成する。入力したデータは、同じ[RepliesController.php]の[RepliesController], [addアクション]に送る。

  2. [RepliesControllerのaddアクション] 2.のデータを受け取り、repliesテーブルに新規レコードを保存。保存が正しくできたら、repliesテーブルのtweet_idを[TweetsController.php]、[TweetsController]、[viewアクション]に送信し、ページを移動する。

  3. [ツイートと関連するリプライ一覧] 3.から送られてきたrepliesテーブルのtweet_idで、tweetsテーブルのレコードを1つ特定し、表示する。

投稿2016/01/14 08:48

編集2016/01/14 09:18
coba-coba

総合スコア1409

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

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

coba-coba

2016/01/14 09:04

アソシエーションを適切に設定していれば、関連する情報もまとめて取得することができます。 それにしても、長くなりました…。 やはり分かりづらいですね。 もし分からなければ、私でも他の方でもいいので、再度ご質問ください。
guest

0

ぱっと見た感じですが、エラーが出ているページでは投稿idが指定されていませんね。
URLがtweets/replyとなっています。
投稿idを渡してあげましょう。(例:tweets/reply/35)

そうすると、TweetsController.phpのreplyメソッドにidが渡され、投稿を取得してくれるのではないでしょうか。

追記:(画像追加)

イメージ説明


↓ 上記画像のSubmitボタンを押したら、下記画像が表示される。
↓ (上記画像では、ユーザーとツイートを特定するIDを渡していませんが、
↓ IDを渡せば特定できます。)
↓ (このアプリケーションでは、Submit後のページ遷移は実装していませんが、
↓ リダイレクトしてツイートのIDを渡すだけです。


イメージ説明

追記:(コード追加)(コントローラー)

[RepliesController.php]の[RepliesController], [addアクション]

PHP

1public function add() { 2 if ($this->request->is('post')) { 3 $this->Reply->create(); 4 if ($this->Reply->save($this->request->data)) { 5 $this->Flash->success(__('The reply has been saved.')); 6 return $this->redirect(array('action' => 'index')); 7 } else { 8 $this->Flash->error(__('The reply could not be saved. Please, try again.')); 9 } 10 } 11 $tweets = $this->Reply->Tweet->find('list'); 12 $users = $this->Reply->User->find('list'); 13 $this->set(compact('tweets', 'users')); 14} 15

[TweetsController.php]、[TweetsController]、[viewアクション]

PHP

1public function view($id = null) { 2 if (!$this->Tweet->exists($id)) { 3 throw new NotFoundException(__('Invalid tweet')); 4 } 5 $options = array('conditions' => array('Tweet.' . $this->Tweet->primaryKey => $id)); 6 $this->set('tweet', $this->Tweet->find('first', $options)); 7} 8

追記:(コード追加)(ビュー)

[Replies/add.ctp]

PHP

1<div class="replies form"> 2<?php echo $this->Form->create('Reply'); ?> 3 <fieldset> 4 <legend><?php echo __('Add Reply'); ?></legend> 5 <?php 6 echo $this->Form->input('tweet_id'); 7 echo $this->Form->input('user_id'); 8 echo $this->Form->input('reply'); 9 ?> 10 </fieldset> 11<?php echo $this->Form->end(__('Submit')); ?> 12</div> 13<div class="actions"> 14 <h3><?php echo __('Actions'); ?></h3> 15 <ul> 16 17 <li><?php echo $this->Html->link(__('List Replies'), array('action' => 'index')); ?></li> 18 <li><?php echo $this->Html->link(__('List Tweets'), array('controller' => 'tweets', 'action' => 'index')); ?> </li> 19 <li><?php echo $this->Html->link(__('New Tweet'), array('controller' => 'tweets', 'action' => 'add')); ?> </li> 20 <li><?php echo $this->Html->link(__('List Users'), array('controller' => 'users', 'action' => 'index')); ?> </li> 21 <li><?php echo $this->Html->link(__('New User'), array('controller' => 'users', 'action' => 'add')); ?> </li> 22 </ul> 23</div>

[Tweets/view.ctp]

PHP

1<div class="tweets view"> 2<h2><?php echo __('Tweet'); ?></h2> 3 <dl> 4 <dt><?php echo __('Id'); ?></dt> 5 <dd> 6 <?php echo h($tweet['Tweet']['id']); ?> 7 &nbsp; 8 </dd> 9 <dt><?php echo __('User'); ?></dt> 10 <dd> 11 <?php echo $this->Html->link($tweet['User']['username'], array('controller' => 'users', 'action' => 'view', $tweet['User']['id'])); ?> 12 &nbsp; 13 </dd> 14 <dt><?php echo __('Tweet'); ?></dt> 15 <dd> 16 <?php echo h($tweet['Tweet']['tweet']); ?> 17 &nbsp; 18 </dd> 19 </dl> 20</div> 21<div class="actions"> 22 <h3><?php echo __('Actions'); ?></h3> 23 <ul> 24 <li><?php echo $this->Html->link(__('Edit Tweet'), array('action' => 'edit', $tweet['Tweet']['id'])); ?> </li> 25 <li><?php echo $this->Form->postLink(__('Delete Tweet'), array('action' => 'delete', $tweet['Tweet']['id']), array('confirm' => __('Are you sure you want to delete # %s?', $tweet['Tweet']['id']))); ?> </li> 26 <li><?php echo $this->Html->link(__('List Tweets'), array('action' => 'index')); ?> </li> 27 <li><?php echo $this->Html->link(__('New Tweet'), array('action' => 'add')); ?> </li> 28 <li><?php echo $this->Html->link(__('List Users'), array('controller' => 'users', 'action' => 'index')); ?> </li> 29 <li><?php echo $this->Html->link(__('New User'), array('controller' => 'users', 'action' => 'add')); ?> </li> 30 <li><?php echo $this->Html->link(__('List Replies'), array('controller' => 'replies', 'action' => 'index')); ?> </li> 31 <li><?php echo $this->Html->link(__('New Reply'), array('controller' => 'replies', 'action' => 'add')); ?> </li> 32 </ul> 33</div> 34<div class="related"> 35 <h3><?php echo __('Related Replies'); ?></h3> 36 <?php if (!empty($tweet['Reply'])): ?> 37 <table cellpadding = "0" cellspacing = "0"> 38 <tr> 39 <th><?php echo __('Id'); ?></th> 40 <th><?php echo __('Tweet Id'); ?></th> 41 <th><?php echo __('User Id'); ?></th> 42 <th><?php echo __('Reply'); ?></th> 43 <th class="actions"><?php echo __('Actions'); ?></th> 44 </tr> 45 <?php foreach ($tweet['Reply'] as $reply): ?> 46 <tr> 47 <td><?php echo $reply['id']; ?></td> 48 <td><?php echo $reply['tweet_id']; ?></td> 49 <td><?php echo $reply['user_id']; ?></td> 50 <td><?php echo $reply['reply']; ?></td> 51 <td class="actions"> 52 <?php echo $this->Html->link(__('View'), array('controller' => 'replies', 'action' => 'view', $reply['id'])); ?> 53 <?php echo $this->Html->link(__('Edit'), array('controller' => 'replies', 'action' => 'edit', $reply['id'])); ?> 54 <?php echo $this->Form->postLink(__('Delete'), array('controller' => 'replies', 'action' => 'delete', $reply['id']), array('confirm' => __('Are you sure you want to delete # %s?', $reply['id']))); ?> 55 </td> 56 </tr> 57 <?php endforeach; ?> 58 </table> 59<?php endif; ?> 60 61 <div class="actions"> 62 <ul> 63 <li><?php echo $this->Html->link(__('New Reply'), array('controller' => 'replies', 'action' => 'add')); ?> </li> 64 </ul> 65 </div> 66</div> 67

投稿2016/01/12 13:52

編集2016/01/14 08:58
coba-coba

総合スコア1409

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

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

DaikiYamada

2016/01/12 15:49

ReplyController.phpのreplyメソッドを編集しidを渡したつもりですが、 うまくいきません。間違ってますでしょうか?
coba-coba

2016/01/12 17:45

$this->redirectしてたんですね。 では、そこからidを渡せてないのではないでしょうか。 ReplyController.phpのreplyメソッドでは、最初に$tweetIdでidを受け取っているみたいですが、その後は$tweetIdではなく$idで処理をすすめていますね。 $idを$tweetIdにしたらどうでしょう。 public function reply ($tweetId = null) { // ここでは$tweetIdなのに $this->Tweet->id = $id; // ここでは$idになっている
DaikiYamada

2016/01/13 11:15

ありがとうございます。 ご指摘頂いている箇所を修正したのですが、まだidが渡せていません。。。 そもそもですが、現在replyアクションが「ReplyController」と「TweetsController」の 2箇所に記載がございますが、これはこれは問題ないのでしょうか?
coba-coba

2016/01/14 08:15 編集

すみません、ざっとしか見ていなかったため、追い切れていませんでした。 「ReplyController」と「TweetsController」のreplyアクションでの考え方は正しいと思います。 返信のスピードは遅いですが、私も簡単なアプリケーションをBakeで作ってみましたので、お互いの理解を合わせながら、少し整理させてください。 まずは、アプリケーションの実行結果の画像とコードを、上の回答欄に補足として掲載します。
coba-coba

2016/01/14 07:58

ご提示頂いたアソシエーションとツイッターの仕組みから、次のようなテーブルを作りました。 【usersテーブル】 id username password 【tweetsテーブル】 id user_id tweet 【repliesテーブル】 tweet_id user_id reply
coba-coba

2016/01/14 08:03

モデルのアソシエーションは次の通りです。 Reply.phpはDaikiYamadaさんと同じ内容です。 【Reply.php】 public $belongsTo = array( 'Tweet' => array( 'className' => 'Tweet', 'foreignKey' => 'tweet_id' ), 'User' => array( 'className' => 'User', 'foreignKey' => 'user_id' ) ); 【Tweet.php】 public $belongsTo = array( 'User' => array( 'className' => 'User', 'foreignKey' => 'user_id' ) ); public $hasMany = array( 'Reply' => array( 'className' => 'Reply', 'foreignKey' => 'tweet_id', 'dependent' => false ) );
coba-coba

2016/01/14 08:13

ファイル、コントローラー、アクションの対応関係です。 DaikiYamadaさんの[ReplyController.php]、[ReplysController]、[replyアクション] ↓ 私の[RepliesController.php]、[RepliesController]、[addアクション] DaikiYamadaさんの[TweetsController.php]、[(未記載)Controller]、[replyアクション] ↓ 私の[TweetsController.php]、[TweetsController]、[viewアクション]
coba-coba

2016/01/14 08:14

なんだか分かりづらいですね…。 とりあえず進めて行きます。
DaikiYamada

2016/01/18 13:01

ご丁寧にありがとうございました。 coba-cobaさんの書かれているコードのおおまかな流れはわかりました。 が、改めて自分のソースを見返しても間違いが発見できません。。。 上記ソースは更新しておりますので、もし間違い等がお分かりになれば ご教授願います。 repliesデータベースに返信ツイートが入っていないのでその前に原因が あるかと思います。
guest

0

一つずつ見ていった方がよさそうですね。
まず、repliesテーブルに自分でレコードを入れてみてください。
それから下記のコードで実行したら、repliesテーブルの内容は表示されますか?

PHP

1[Reply.php] 2// 一部修正(カラム名指定にReply.を付ける) 3public function getData($tweetId, $userId) { 4 $options = array( 5 'conditions' => array( 6 'Reply.tweet_id' => $tweetId, 7 'Reply.user_id' => $userId 8 ) 9 ); 10 return $this->find('first', $options); 11} 12 13[RepliesController] 14// そもそもreplyの複数形はrepliesです。replysではありません。 15// これはrepliesテーブルの内容を取得・表示するためだけのコードです。 16// ここができていなければ、他の処理もうまくいかないのかと思います。 17public function reply ($tweetId = null, $userId = null) { 18 $tweetId = 実在するID; // 表示確認のため直打ち 19 $userId = 実在するID; // 表示確認のため直打ち 20 $reply = $this->Reply->getData($tweetId, $userId); 21 $this->set(compact('reply')); 22} 23 24[View/Replies/reply.ctp] 25<div> 26 <p><?= $reply['Reply']['username'].'@'.$reply['Reply']['acountname'] ?></p> 27 <p><?= $reply['Reply']['content'] ?></p> 28 <p><?= $reply['Reply']['created'] ?></p> 29</div>

投稿2016/01/20 01:26

編集2016/01/20 01:28
coba-coba

総合スコア1409

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

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

DaikiYamada

2016/01/24 12:41

コメントありがとうございます。 結論、正常に表示されません。 そもそも、ツイートの詳細ページにアクセスした時点で Notice (8): Undefined variable: reply [APP/View/Tweets/reply.ctp, line 11]などの エラーが表示さます。。。
coba-coba

2016/01/27 10:02

ずばりな回答ができなくてすみません。 もしよければ、まずはTweetsControllerでCRUDを先に作って、ツイートの一覧を表示するところから始めませんか。 正直、範囲が広すぎて、どうしていいか分からないです。 それか、データベースの構造やコントローラー、モデル、ビュー、その他関連するファイルを全て記入してもらえれば、私もそれを基に検証してみますが、どうでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問