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

回答編集履歴

2

コメント追加

2017/08/31 09:39

投稿

Tomak
Tomak

スコア1652

answer CHANGED
@@ -42,10 +42,12 @@
42
42
  var $txtArea = $('<textarea name="body['+ res.img_id +']" size="30" maxlength="140" data-imgid="'+ res.img_id +'">'+"\n"+'</textarea>');
43
43
  var $delBtn = $('<input type="button" name="'+ res.img_id +'" value="削除" class="deleteBtn" data-imgid="'+ res.img_id +'"');
44
44
 
45
+ // 画像・プルダウン追加
45
46
  $('#image-files ul')
46
47
  .append($img)
47
- .append(res.category).end()
48
+ .append(res.category);
48
49
 
50
+ // テキストエリア・削除ボタン追加
49
51
  $('#image-files div')
50
52
  .append($txtArea)
51
53
  .append($delBtn);

1

コード追加分による修正

2017/08/31 09:39

投稿

Tomak
Tomak

スコア1652

answer CHANGED
@@ -8,82 +8,53 @@
8
8
  1. Ajax通信完了後にプルダウンを表示
9
9
  1. Ajax通信完了時のPHP側からの戻り値はJSON形式、画像パス、画像ID
10
10
 
11
- **■こんな感じの仕様にする**
12
-
13
- Ajax通信完了時のPHP側からの戻り値のJSONに、すべての情報を入れて返すようにする。
14
-
15
- - 画像パス
16
- - 画像ID
17
- - プルダウンオプション情報
18
-
19
- ```json
20
- {
21
- 'img' : 画像パス,
22
- 'img_id' : 画像ID,
23
- 'category' : プルダウンHTML
24
- }
25
- ```
26
-
27
- プルダウンをJavaScriptで生成したい場合は下記のようにします。
28
- どちらを採用するかの判断は、**メンテナンス性、拡張性**を考えて決めます。
29
-
30
- ```json
31
- {
32
- 'img' : 画像パス,
33
- 'img_id' : 画像ID,
34
- 'category' : [{'値':'ラベル'],,,]
35
- }
36
- ```
37
-
38
11
  Ajax通信の戻り値を返すPHPのアクションコントローラーは下記のようにします。
39
12
 
40
13
  ```php
41
- class Controller_XXX
14
+ // 画像を出力
42
- {
43
- public function get_ajax ()
44
- {
45
- $resp = array(
15
+ $json = array();
46
- 'img' => '画像パス',
16
+ $json['img'] = "data:" . $mimeTypeStr . ";base64," . $imageFile;
47
- 'img_id' => '画像ID',
17
+ $json['img_id'] = $piy_post->img_id;
48
- 'category' => \Form::select("category","",$channel_list),
49
- );
50
18
 
19
+ // ↓ここ追加
20
+ // プルダウンオプションタグ連想配列取得
21
+ $channel_list = なんかクラス::getChannelList();
22
+ $json['category'] = \Form::select("category","",$channel_list);
23
+
24
+ // 画像を出力
51
- return json_encode($resp);
25
+ echo json_encode($json,JSON_UNESCAPED_UNICODE);
52
- }
53
- }
54
26
  ```
55
27
 
56
- 続いて、JavaScriptは下記のように設定してデータタイプを`json`に設定しておきます。HTML構造がよくわかなかったので、`append()`の結果が違うかもしれません。違っていたら適宜変更してください。
28
+ 続いて、JavaScriptは下記のように設定して`dataType`を`json`に設定しておきます。HTML構造がよくわかなかったので、`append()`の結果が違うかもしれません。違っていたら適宜変更してください。
57
29
 
58
30
  ```js
59
31
  $.ajax({
60
- url : '/XXX/ajax',
32
+ url: "/hogehoge/add",
61
- type : 'post',
33
+ type: 'POST',
62
- dataType : 'json',
34
+ dataType: 'json', //text → jsonに変更
35
+ data: formData,
36
+ cache: false,
63
- timeout : 60000
37
+ contentType: false,
38
+ processData: false,
64
- })
39
+ ...
65
- .done(function (res) {
40
+ success: function(res) {
66
- var $imgFiles = $('#image-files');
41
+ var $img = $('<img class="imgView" src="'+ res.img +'" data-imgid="'+ res.img_id +'" />');
42
+ var $txtArea = $('<textarea name="body['+ res.img_id +']" size="30" maxlength="140" data-imgid="'+ res.img_id +'">'+"\n"+'</textarea>');
43
+ var $delBtn = $('<input type="button" name="'+ res.img_id +'" value="削除" class="deleteBtn" data-imgid="'+ res.img_id +'"');
67
44
 
68
- var $img = $('<img class="imgView" src="'+ res.img +'" data-imgid="'+ res.img_id +'" />');
45
+ $('#image-files ul')
69
- var $txtArea = $('<textarea name="body['+ res.img_id +']" size="30" maxlength="140" data-imgid="'+ res.img_id +'">'+"\n"+'</textarea>');
46
+ .append($img)
70
- var $delBtn = $('<input type="button" name="'+ res.img_id +'" value="削除" class="deleteBtn" data-imgid="'+ res.img_id +'"');
47
+ .append(res.category).end()
71
48
 
72
- $('#image-files ul')
49
+ $('#image-files div')
73
- .append($img)
50
+ .append($txtArea)
74
- .append(res.category);
51
+ .append($delBtn);
75
52
 
76
- $('#image-files div')
53
+ $('#submitBtn').removeAttr('disabled');
77
- .append($txtArea)
78
- .append($delBtn);
79
54
 
80
- $('#submitBtn').removeAttr('disabled');
81
-
82
- if ($("#image-files ul img").length > 10){
55
+ if ($("#image-files ul img").length > 10){
83
- $('#submitBtn').prop('disabled', true);
56
+ $('#submitBtn').prop('disabled', true);
84
- }
57
+ }
85
- })
58
+ },
86
- .fail(function (xhr, status) {
87
- console.log(xhr, status);
88
- });
59
+ ...
89
60
  ```