teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

さらにサンプルを追記

2016/09/01 15:56

投稿

KatsumiTanaka
KatsumiTanaka

スコア924

answer CHANGED
@@ -8,28 +8,57 @@
8
8
 
9
9
  CakePHPは、MVCというデザインパターンで構成されたフレームワークですので、一度MVCというデザインパターンを理解してみてはいかがでしょうか?
10
10
 
11
- 追記:
11
+ **追記:(再編集しています)**
12
- Ajaxに対してjson結果を返す場合のサンプルを貼っておき
12
+ CakePHP3だいぶ動きが変わってした。申し訳ありません。
13
- ざっくりですが、処理内容はAjax経由で郵便番号をもらい、郵便番号を検索するシステム共通のAPIを呼んで住所文字列を取得し、それをjsonにエンコードして戻しています。
14
- また、Javascriptはevalで連想配列変換て、返却されデータを処理してします
13
+ 自分の環境動作確認した処理を記述します
15
14
 
16
15
  ```CakePHP
17
- function getAddress(){
18
- $this->autoRender = false;
19
- $rtnData = array('p0rtrn' => 'NG');
20
- try {
21
- $zip1 = GetParams::getParamForm('zip_code1', $this->params);
22
- $zip2 = GetParams::getParamForm('zip_code2', $this->params);
23
- if (!(empty($zip1) || empty($zip2))) {
24
- //---------------------------------------------------------------
25
- // API呼び出し:郵便番号情報(ApiZipMst:ADDRESS)
26
- //---------------------------------------------------------------
27
- $rtnData = $this->ApiZipMst->getZipMstJusho($this->_gmninfTouroku, $zip1, $zip2);
28
16
 
17
+ //routes.php
18
+ Router::extensions(['json', 'xml']); // これを追加
19
+
29
- return json_encode($rtnData);
20
+ // Contoroller
30
- }
21
+ public function initialize() { // initializeメソッドがなければ追加
31
- } catch (Exception $e) {
22
+ parent::initialize();
32
- $this->log("Exception発生 郵便番号照会:".$e->getMessage(), LOG_ERR, $this->_gmninfTouroku['id'], $this->sId, __FILE__, __LINE__);
23
+ $this->loadComponent('RequestHandler'); // これを追加
33
- }
34
24
  }
25
+
26
+ /**
27
+ * Ajaxの処理メソッド
28
+ */
29
+ public function AjaxTest() {
30
+ $returnData = array('test'=>'test');
31
+
32
+ $this->set('data',$returnData);
33
+ $this->set('_serialize', ['data']);
34
+ }
35
+
36
+ // JavaScript
37
+ $(function() {
38
+ $('#TestAjax').on('click',function() {
39
+ jQuery.ajax({
40
+ type: "POST",
41
+ async:false,
42
+ url: '/cakephp3/test/AjaxTest.json',
43
+ dataType: 'text',
44
+ complete: function(XMLHttpRequest){
45
+ set_data(XMLHttpRequest.responseText);
46
+ },
47
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
48
+ alert("Ajax通信エラー発生:"+errorThrown);
49
+ }
50
+ });
51
+ });
52
+ });
53
+
54
+ function set_data(data) {
55
+ var res = eval('(' + data + ')');
56
+
57
+ $('#messageText').text(res.data.test);
58
+
59
+ }
35
- ```
60
+ ```
61
+
62
+ Javascript側で受け取ったデータは、
63
+ {'data':{'test':'test'}}
64
+ という形式になっているので、evalで処理した後はres.data.testという形でデータを取り出します

1

ソースコードを追記

2016/09/01 15:56

投稿

KatsumiTanaka
KatsumiTanaka

スコア924

answer CHANGED
@@ -6,4 +6,30 @@
6
6
  0. Ajax経由でコントローラのメソッドが呼び出されたため、画面の表示は不要
7
7
  0. コントローラ内で処理を分岐し、それぞれ別のテンプレートで画面を表示する
8
8
 
9
- CakePHPは、MVCというデザインパターンで構成されたフレームワークですので、一度MVCというデザインパターンを理解してみてはいかがでしょうか?
9
+ CakePHPは、MVCというデザインパターンで構成されたフレームワークですので、一度MVCというデザインパターンを理解してみてはいかがでしょうか?
10
+
11
+ 追記:
12
+ Ajaxに対してjsonで結果を返す場合のサンプルを貼っておきます
13
+ ざっくりですが、処理内容はAjax経由で郵便番号をもらい、郵便番号を検索するシステム共通のAPIを呼んで住所文字列を取得し、それをjsonにエンコードして戻しています。
14
+ また、Javascriptではevalで連想配列を変換して、返却されたデータを処理してします
15
+
16
+ ```CakePHP
17
+ function getAddress(){
18
+ $this->autoRender = false;
19
+ $rtnData = array('p0rtrn' => 'NG');
20
+ try {
21
+ $zip1 = GetParams::getParamForm('zip_code1', $this->params);
22
+ $zip2 = GetParams::getParamForm('zip_code2', $this->params);
23
+ if (!(empty($zip1) || empty($zip2))) {
24
+ //---------------------------------------------------------------
25
+ // API呼び出し:郵便番号情報(ApiZipMst:ADDRESS)
26
+ //---------------------------------------------------------------
27
+ $rtnData = $this->ApiZipMst->getZipMstJusho($this->_gmninfTouroku, $zip1, $zip2);
28
+
29
+ return json_encode($rtnData);
30
+ }
31
+ } catch (Exception $e) {
32
+ $this->log("Exception発生 郵便番号照会:".$e->getMessage(), LOG_ERR, $this->_gmninfTouroku['id'], $this->sId, __FILE__, __LINE__);
33
+ }
34
+ }
35
+ ```