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

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

解決済

1回答

252閲覧

画面遷移がうまくいかない

Tatsuo_Iriyama

総合スコア50

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2018/10/02 11:29

編集2018/10/02 11:30

現在お問い合わせの履歴が見れるページを作成してまして、そこでの画面遷移がうまくいっていません。

###構想
お問い合わせページから履歴を見るのリンクを押す履歴ページに遷移戻るボタンを押すお問い合わせページ再度履歴へのリンクを押すお問い合わせページに遷移する

このような形をイメージしています。

###現状

お問い合わせページから履歴へのリンクを押す(履歴へのパスはアクション名のみです。)→対象のControllerが無いというエラーになる
なので、
履歴へのリンクのパスをController名/アクション名に変更すると
お問い合わせページから履歴へのリンクを押す履歴ページに遷移する戻るを押すお問い合わせページに遷移する再度履歴へのリンクを押すエラーになる

というようになります。

###現状のコード

routes

1$routes->connect('/inquires', ['controller' => 'Inquires', 'action' => 'index']);

Controller

1<?php 2 3namespace App\Controller; 4 5use App\Controller\AppController; 6use Cake\Network\Exception\BadRequestException; 7use Cake\ORM\TableRegistry; 8use Cake\Core\Configure; 9use Cake\Event\Event; 10 11 12/** 13* Inquires Controller 14*/ 15class InquiresController extends AppController 16{ 17 public function initialize() 18 { 19 parent::initialize(); 20 $this->loadModel('Inquires'); 21 } 22 23 public function index() 24 { 25 $inquires = $this->Inquires->newEntity(); 26 $this->set(compact('inquires')); 27 28 if ($this->request->is('post')) { 29 // POSTされた場合 30 $userInquires = $this->Inquires->newEntity($this->request->data, [ 31 'validate' => 'default' 32 ]); 33 34 if ($userInquires->errors()) { 35 /* 36 * バリデーションに引っかかった場合、エラーメッセージを表示し 37 * 入力内容をセット後、入力画面に遷移する。 38 */ 39 $this->Flash->error('入力内容に不備があります'); 40 $this->set('inquires', $userInquires); 41 return $this->render($this->request->action, 'default'); 42 } 43 44 // 入力内容をセッションに格納し、確認画面へリダイレクトする 45 $this->request->session()->write('inquires', $userInquires); 46 return $this->redirect('/Inquires/confirm'); 47 } 48 49 return $this->render($this->request->action, 'default'); 50 } 51 52 public function confirm() 53 { 54 // セッションから入力内容取得 55 $userInquires = $this->request->session()->read('inquires'); 56 57 if (empty($userInquires)) { 58 // セッションの情報を取得できなかった場合は、例外を投げる 59 throw new BadRequestException('セッションの情報を取得できませんでした'); 60 return; 61 } 62 63 $this->set('inquires', $userInquires); 64 $this->render($this->request->action, 'default'); 65 } 66 67 public function complete() 68 { 69 // セッションから入力内容取得 70 $userInquires = $this->request->session()->consume('inquires'); 71 72 if (empty($userInquires)) { 73 // セッションの情報を取得できなかった場合は、例外を投げる 74 throw new BadRequestException('セッション情報を取得できませんでした'); 75 return; 76 } 77 78 $userInquires->user_id = $this->Auth->user()['id']; 79 80 if (!$this->Inquires->save($userInquires)) { 81 return $this->Flash->error('入力内容を保存できませんでした'); 82 } 83 84 // 入力内容を保存する 85 $this->Inquires->save($userInquires); 86 $this->render($this->request->action, 'default'); 87 } 88 89 public function history() 90 { 91 $userId = $this->Auth->user()['id']; 92 93 $inquires = $this->Inquires 94 ->find() 95 ->where(['user_id' => $userId]) 96 ->order(['created_at' => 'desc']) 97 ->all(); 98 99 foreach ($inquires as $inquire) { 100 if (!empty($inquire)) { 101 $inquireHistories[] = $inquire; 102 } 103 } 104 $this->set(compact('inquireHistories')); 105 106 $this->render($this->request->action, 'default'); 107 } 108} 109

お問い合わせページのView

View

1<div> 2 <?= $this->Form->create($inquires, [ 3 'type' => 'post', 4 'url' => [ 5 'controller' => 'Inquires', 6 'action' => 'index' 7 ], 8 'context' => [ 9 'validate' => 'default' 10 ] 11 ]) ?> 12 13 <h2>お問い合わせフォーム</h2> 14 15 <a href="history">履歴を見る</a> 16 17 <?= $this->Flash->render() ?> 18 19 <div> 20 <p>タイトル</p> 21 <?= $this->Form->input('title', [ 22 'type' => 'text', 23 'label' => false 24 ]) ?> 25 </div> 26 27 <div> 28 <p>お問い合わせ内容</p> 29 <?= $this->Form->input('text', [ 30 'type' => 'textarea', 31 'label' => false 32 ]) ?> 33 </div> 34 35 <div> 36 <?= $this->Form->submit() ?> 37 </div> 38 39 <?= $this->Form->end() ?> 40</div>

履歴ページのView

<div> <h2>お問い合わせ履歴</h2> <div> <?php foreach($inquireHistories as $inquireHistory): ?> <div style="border-bottom: 1px solid black"> <p>タイトル:<?= $inquireHistory->title ?></p> <p>お問い合わせ内容:<?= $inquireHistory->text ?></p> <p>お問い合わせ日時:<?= date('Y-m-d', strtotime($inquireHistory->created_at)) . "&nbsp;" . str_replace('-', ':', date('H-i', strtotime($inquireHistory->created_at))) ?></p> </div> <?php endforeach; ?> </div> <div> <a href="index">戻る</a> </div> </div>

###質問

  • 構想から現状になってしまう原因はなんなのでしょうか?
  • 対応策はどのようにすれば良いでしょうか?

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

1つめののエラーですが、

お問い合わせページから履歴へのリンクを押す(履歴へのパスはアクション名のみです。)→対象のControllerが無いというエラーになる

以下のような現象が起きていると考えられます。


(1) /inquires のページで [href="history"] のリンクをクリックする
---> /history へ遷移する

** HistoryController が存在せず、 routes の設定もないためエラー**

(2) /inquires/history のページで [href="index"] のリンクをクリックする
---> /inquires/index へ遷移する

(3) /inquires/index のページで [href="history"] のリンクをクリックする
---> /inquires/history へ遷移する


解決策としては、

  • <a> タグの遷移先を /inquires/history に設定する
  • routes$routes->connect('/history', ['controller' => 'Inquires', 'action' => 'history']); を追記する
  • HtmlHelperを使用して <a> タグを生成する

といった方法があります。

(3) 以降はパスが /inquires/* になるため、 MissingControllerException は発生しないように思えますが、

再度履歴へのリンクを押すエラーになる

この部分でどのようなエラーメッセージが表示されているか追記いただけますか?

また、構想の以下の部分に違和感がありますが、正しい内容でしょうか?

再度履歴へのリンクを押すお問い合わせページに遷移する

投稿2018/10/02 15:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Tatsuo_Iriyama

2018/10/02 15:57

hrefを`history`にした場合、お問い合わせ画面から履歴画面に遷移しようとすると`Missing Method in HistoryController`となり遷移できない状態になります。 次にhrefを`inquires/history`にした場合、お問い合わせ画面から履歴画面に遷移でき、履歴画面から`戻る`というリンクを使用してお問い合わせ画面に戻り、再度履歴画面に遷移しようとすると、URLが`inquires/inquires/history`という構成になり、かつ、`Missing Method in InquiresController`というエラーになります。(エラー内容からinquiresアクションが無いからだと思われます) 解決策の一つとして提示して頂いた、routesに記載する方法を取りましたら、上手くいきました。(historyがきたらInquiresControllerのhistoryアクションを見るように設定するので当たり前ですが。。。) とにかく提示頂いた解決策で解決に至りましたので、ベストアンサーとさせて頂きました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問