質問編集履歴

4

やりたいことのサンプルを箇条書きを追加

2017/10/03 09:42

投稿

noranuko
noranuko

スコア12

test CHANGED
@@ -1 +1 @@
1
- プルダウン連動検索機能(FormHelper)
1
+ プルダウン連動検索機能(FormHelper)(hierselect)
test CHANGED
@@ -20,6 +20,26 @@
20
20
 
21
21
 
22
22
 
23
+ --- サンプル -----------------------------------------------------------------------------
24
+
25
+ ◎ソースとは関係ないのですが、やりたいことの例を日本語で記述しておきます。
26
+
27
+ 1.市区町村を1つ選択。新宿区、渋谷区、立川市、国立市 など 例)渋谷区
28
+
29
+ 2.観光スポットを複数選択。 水族館、動物園、遊園地、神社、レストラン など 例)神社、レストラン
30
+
31
+ 3.該当する名所を複数選択。 花園神社、1・2・3・ファクトリー、オセロ など
32
+
33
+ 4.3で選択したキーを元に検索。
34
+
35
+ 5.検索結果の詳細情報以外に、1,2,3で選択した条件を保持したままにしたい。
36
+
37
+ ※画面の左側に検索条件、右側に詳細情報を表示し、別ページには移動しない。
38
+
39
+ -------------------------------------------------------------------------------------------
40
+
41
+
42
+
23
43
  ◎index.ctp
24
44
 
25
45
  ```

3

タグ追加

2017/10/03 09:42

投稿

noranuko
noranuko

スコア12

test CHANGED
File without changes
test CHANGED
File without changes

2

文章を変えました。

2017/10/03 09:14

投稿

noranuko
noranuko

スコア12

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
- ###前提・実現したいこと
1
+ ###実現したいこと
2
-
2
+
3
- PHP(CakePHP)で連動プルダウンを使用した検索システムを作っています。
3
+ PHP(CakePHP)で連動プルダウン+セレクトボックス間テキスト移動を使用したグラフ表示システムを作っています。
4
4
 
5
5
  検索後に値を保持した状態にしたいです。
6
6
 
@@ -8,130 +8,468 @@
8
8
 
9
9
 
10
10
 
11
+ わかりにくい説明文ですが、サンプルソースや参照サイトなどアドバイス等を宜しくお願い致します。
12
+
11
- FormHelperを使用て作成しようとしているのですが、
13
+ 、検索キー保持のやり方が別にあり、そちら実現できればそちらでもOKで
14
+
15
+
16
+
12
-
17
+ ※初心者のため、どのようにソースを抜粋すれば良いかわからなかったため、長くなってしまいました。
18
+
13
- 以下のサンプルのように書くと、
19
+ ※グラフ作成部分は未記入
20
+
21
+
22
+
23
+ ◎index.ctp
14
24
 
15
25
  ```
16
26
 
17
- echo $this->Form->select('flag',array(1=>'りんご',2=>'みかん'3=>'ゴリラ',4=>'キリン'),,array('empty'=>false));
27
+ <!-- プロダクト -->
28
+
29
+ <li>
30
+
31
+ <?= __('プロダクト') ?><br>
32
+
33
+ <?=$this->Form->select('LoadchartForm.SelectProductNM', $products, ['disabled'=>false, 'multiple' => false, 'id' => 'selectProductID', 'size' => 3, 'empty' => false]); ?>
34
+
35
+ </li>
36
+
37
+
38
+
39
+ <!-- サブシステム -->
40
+
41
+ <li>
42
+
43
+ <?= __('サブシステム') ?><br>
44
+
45
+ <?=$this->Form->select('LoadchartForm.SelectSubsystemNM', $subsystems, ['disabled'=>true, 'multiple'=>true, 'id'=>'selectSubsystemID', 'size'=>10, 'empty'=>false]); ?>
46
+
47
+ </li>
48
+
49
+
50
+
51
+ <!-- 検索結果表示 -->
52
+
53
+ <!-- リストボックス間移動1 -->
54
+
55
+ <li>
56
+
57
+ <?=$this->Form->select('LoadchartForm.SelectHandleSubsystemsAccountNM', $handleSubsystemAccounts, ['disabled'=>true, 'multiple'=>true, 'id'=>'selectHandleSubsystemAccountID', 'size'=>10, 'empty'=>false]); ?>
58
+
59
+ </li>
60
+
61
+ <li>
62
+
63
+ <center>
64
+
65
+ <input type="button" id="move_down" value="↓" />
66
+
67
+ <!-- スペース (位置合わせ)-->
68
+
69
+
70
+
71
+ <input type="button" id="move_up" value="↑" />
72
+
73
+ </center>
74
+
75
+ </li>
76
+
77
+ <li>
78
+
79
+ <?=$this->Form->select('LoadchartForm.SelectAccountNM', null, ['disabled'=>false, 'multiple' => true, 'id' => 'selectAccountID', 'size' => 10, 'empty' => false]); ?>
80
+
81
+ </li>
82
+
83
+
84
+
85
+ <script type="text/javascript">
86
+
87
+ $(document).ready(function(){
88
+
89
+
90
+
91
+ // プルダウンのoption内容をコピー
92
+
93
+ var pd1 = $("#selectProductID option").clone();
94
+
95
+ var pd2 = $("#selectSubsystemID option").clone();
96
+
97
+ var pd3 = $("#selectHandleSubsystemAccountID option").clone();
98
+
99
+
100
+
101
+ var pd4 = null; // 検索結果(検索用)
102
+
103
+ var pd5 = null; // 検索結果(検索用)
104
+
105
+
106
+
107
+ // 1→2連動
108
+
109
+ $("#selectProductID").change(function () {
110
+
111
+ // lv1のvalue取得
112
+
113
+ var lv1Val = $("#selectProductID").val();
114
+
115
+
116
+
117
+ // selectSubsystemIDのdisabled解除
118
+
119
+ $("#selectSubsystemID").removeAttr("disabled");
120
+
121
+
122
+
123
+ // 一旦、selectSubsystemIDのoptionを削除
124
+
125
+ $("#selectSubsystemID option").remove();
126
+
127
+
128
+
129
+ // (コピーしていた)元のselectSubsystemIDを表示
130
+
131
+ $(pd2).appendTo("#selectSubsystemID");
132
+
133
+
134
+
135
+ // 選択値以外のクラスのoptionを削除
136
+
137
+ $("#selectSubsystemID option[class != p"+lv1Val+"]").remove();
138
+
139
+
140
+
141
+ // selectHandleSubsystemAccountID disabled処理
142
+
143
+ $("#selectHandleSubsystemAccountID").attr("disabled", "disabled");
144
+
145
+ });
146
+
147
+
148
+
149
+ // 2→3連動
150
+
151
+ $("#selectSubsystemID").change(function () {
152
+
153
+
154
+
155
+ // selectHandleSubsystemAccountIDのdisabled解除
156
+
157
+ $("#selectHandleSubsystemAccountID").removeAttr("disabled");
158
+
159
+
160
+
161
+ // 一旦、selectHandleSubsystemAccountIDのoptionを削除
162
+
163
+ $("#selectHandleSubsystemAccountID option").remove();
164
+
165
+ $("#selectAccountID option").remove();
166
+
167
+
168
+
169
+ // マルチ選択
170
+
171
+ var e = document.getElementById('selectSubsystemID');
172
+
173
+ var any = new Array();
174
+
175
+ var num = 0;
176
+
177
+
178
+
179
+ // optionを順番に見て、selected となっているものの添え字を配列に入れる
180
+
181
+ for (var i=0; i<e.childElementCount; i++) {
182
+
183
+ if (e.getElementsByTagName('option')[i].selected) {
184
+
185
+ any[num] = i;
186
+
187
+ num++;
188
+
189
+ }
190
+
191
+ }
192
+
193
+
194
+
195
+ // for..in文でまわして、配列にいれた添え字と、添え字をもとに文字列を出力させる
196
+
197
+ var flg = false;
198
+
199
+ for(var txt in any) {
200
+
201
+
202
+
203
+ // ID取得
204
+
205
+ var strId = e.children[any[txt]].value;
206
+
207
+
208
+
209
+ // (コピーしていた)元のselectHandleSubsystemAccountIDを表示
210
+
211
+ $(pd3).appendTo("#selectHandleSubsystemAccountID");
212
+
213
+
214
+
215
+ // 選択値以外のクラスのoptionを削除
216
+
217
+ $("#selectHandleSubsystemAccountID option[class != p" + strId + "]").remove();
218
+
219
+ if (flg == false) {
220
+
221
+ var totalPd3 = $("#selectHandleSubsystemAccountID option").clone();
222
+
223
+ flg = true;
224
+
225
+ }else{
226
+
227
+ var copyPd3 = $("#selectHandleSubsystemAccountID option").clone();
228
+
229
+ totalPd3 = $(totalPd3).add(copyPd3);
230
+
231
+ }
232
+
233
+ }
234
+
235
+ $("#selectHandleSubsystemAccountID option").remove();
236
+
237
+ $(totalPd3).appendTo("#selectHandleSubsystemAccountID");
238
+
239
+
240
+
241
+ $(pd5).appendTo("#selectAccountID");
242
+
243
+ });
244
+
245
+
246
+
247
+ // ↓ボタン押下処理
248
+
249
+ $("#move_down").click(function () {
250
+
251
+ $('#selectAccountID').append($('#selectHandleSubsystemAccountID option:selected'));
252
+
253
+ $('#selectHandleSubsystemAccountID').prop("selected", false);
254
+
255
+ pd4 = $("#selectHandleSubsystemAccountID option").clone();
256
+
257
+ pd5 = $("#selectAccountID option").clone();
258
+
259
+ });
260
+
261
+
262
+
263
+ // ↑ボタン押下処理
264
+
265
+ $("#move_up").click(function () {
266
+
267
+ $('#selectHandleSubsystemAccountID').append($('#selectAccountID option:selected'));
268
+
269
+ $('#selectAccountID').prop("selected", false);
270
+
271
+ pd4 = $("#selectHandleSubsystemAccountID option").clone();
272
+
273
+ pd5 = $("#selectAccountID option").clone();
274
+
275
+ });
276
+
277
+
278
+
279
+ // 検索ボタン押下処理
280
+
281
+ $("#workTermID").click(function () {
282
+
283
+ // 全選択
284
+
285
+ $("#selectAccountID option").prop("selected", true);
286
+
287
+ });
288
+
289
+
290
+
291
+ });
292
+
293
+ </script>
18
294
 
19
295
  ```
20
296
 
297
+
298
+
21
- オプション部分が
299
+ ◎Controller.php
22
300
 
23
301
  ```
24
302
 
25
- <option Value='1'>りんご</option>
26
-
27
- <option Value='2'>みかん</option>
28
-
29
- <option Value='3'>ゴリラ</option>
30
-
31
- <option Value='4'>キリン</option>
32
-
33
-
303
+ public function index()
304
+
305
+ {
306
+
307
+ // プロダクト(Products)
308
+
309
+ $this->loadModel('Products');
310
+
311
+ $products = $this->Products->find('list');
312
+
313
+ $this->set('products', $products);
314
+
315
+
316
+
317
+ // サブシステム(Subsystems)
318
+
319
+ // DB接続例:mysqli_xxx関数を使う
320
+
321
+ $conSubsystems = mysqli_connect('localhost', 'root', '', 'sdsm');
322
+
323
+
324
+
325
+ // mysqli使用
326
+
327
+ $querySubsystems = "SELECT subsystems.id AS subsystems_id, "
328
+
329
+ . "subsystems.product_id AS subsystems_productId, "
330
+
331
+ . "subsystems.name AS subsystems_name "
332
+
333
+ . "FROM subsystems "
334
+
335
+ . "ORDER BY subsystems_id ASC ";
336
+
337
+
338
+
339
+ $execSubsystems = mysqli_query($conSubsystems, $querySubsystems);
340
+
341
+
342
+
343
+ // オプション部分作成
344
+
345
+ $listRawSubsystems = array();
346
+
347
+
348
+
349
+ while($listSubsystems2 = mysqli_fetch_array($execSubsystems)) {
350
+
351
+ array_push($listRawSubsystems, ['value' => $listSubsystems2['subsystems_id'], 'class' => 'p' . $listSubsystems2['subsystems_productId'], 'text' => $listSubsystems2['subsystems_name']]);
352
+
353
+ }
354
+
355
+
356
+
357
+ $this->set("subsystems", $listRawSubsystems);
358
+
359
+
360
+
361
+ // 検索結果(HandleSubsystems)
362
+
363
+ // DB接続例:mysqli_xxx関数を使う
364
+
365
+ $conHandleSubsystems = mysqli_connect('localhost', 'root', '', 'sdsm');
366
+
367
+
368
+
369
+ $queryHandleSubsystems = "SELECT handle_subsystems.id AS handle_subsystems_id, "
370
+
371
+ . "handle_subsystems.subsystem_id AS handle_subsystems_subsystemId, "
372
+
373
+ . "handle_subsystems.account_id AS handle_subsystems_accountId, "
374
+
375
+ . "accounts.name AS accounts_name "
376
+
377
+ . "FROM handle_subsystems "
378
+
379
+ . "LEFT JOIN accounts "
380
+
381
+ . "ON handle_subsystems.account_id = accounts.id "
382
+
383
+ . "ORDER BY handle_subsystems_id ASC ";
384
+
385
+
386
+
387
+ $execHandleSubsystems = mysqli_query($conHandleSubsystems, $queryHandleSubsystems);
388
+
389
+
390
+
391
+ // オプション部分作成
392
+
393
+ $listRawHandleSubsystems = array();
394
+
395
+
396
+
397
+ while($listHandleSubsystems2 = mysqli_fetch_array($execHandleSubsystems)) {
398
+
399
+ array_push($listRawHandleSubsystems, ['value' => $listHandleSubsystems2['handle_subsystems_accountId'], 'class' => 'p' . $listHandleSubsystems2['handle_subsystems_subsystemId'], 'text' => $listHandleSubsystems2['accounts_name']]);
400
+
401
+ }
402
+
403
+
404
+
405
+ $this->set("handleSubsystemAccounts", $listRawHandleSubsystems);
406
+
407
+
408
+
409
+
410
+
411
+ // 検索ボタン押下処理
412
+
413
+ if ($this->request->isPost()) {
414
+
415
+
416
+
417
+ // セレクトボックス(マルチ)から値取得
418
+
419
+ // 人
420
+
421
+ $selectAccountNM = array();
422
+
423
+ $selectAccountID = array();
424
+
425
+ $hogehoge ="";
426
+
427
+
428
+
429
+ foreach($this->request->data('LoadchartForm.SelectAccountNM') as $keyAcc => $valAcc) {
430
+
431
+ $v_strAcc = '';
432
+
433
+ foreach((array)$valAcc as $vAcc) {
434
+
435
+ $v_strAcc .= $vAcc . ' ';
436
+
437
+ }
438
+
439
+ $hogehoge .= $keyAcc . ' => ' . $v_strAcc;
440
+
441
+ $hogehoge = "";
442
+
443
+ array_push($selectAccountNM, "working_details.account_id = " . $v_strAcc);
444
+
445
+ array_push($selectAccountID, "accounts.id = " . $v_strAcc);
446
+
447
+ }
448
+
449
+
450
+
451
+ $dataAccountLists = "";
452
+
453
+ $dataAccountIdLists = "";
454
+
455
+ $cntDataAccounts = count($selectAccountNM);
456
+
457
+
458
+
459
+ for ($i=1; $i<$cntDataAccounts; $i++) {
460
+
461
+ $dataAccountLists .= $selectAccountNM[$i-1] . " OR ";
462
+
463
+ $dataAccountIdLists .= $selectAccountID[$i-1] . " OR ";
464
+
465
+ }
466
+
467
+
468
+
469
+ $dataAccountLists .= $selectAccountNM[$cntDataAccounts-1];
470
+
471
+ $dataAccountIdLists .= $selectAccountID[$cntDataAccounts-1];
472
+
473
+ }
34
474
 
35
475
  ```
36
-
37
- になると思います。
38
-
39
-
40
-
41
- これをプルダウン連動システムと関連付けるため、
42
-
43
- ```
44
-
45
- <option Value='1' class='p1'>りんご</option>
46
-
47
- <option Value='2' class='p1'>みかん</option>
48
-
49
- <option Value='3' class='p2'>ゴリラ</option>
50
-
51
- <option Value='4' class='p2'>キリン</option>
52
-
53
-
54
-
55
- ```
56
-
57
- のように,
58
-
59
- ```
60
-
61
- class='p*'
62
-
63
- ```
64
-
65
- を文中に組み込みたいです。
66
-
67
-
68
-
69
- 色々と調べたのですが、同じようなサンプルを探すことができず、行き詰ってしまいました。
70
-
71
-
72
-
73
- Controller側でSQLを組み、
74
-
75
- ```
76
-
77
- $listDatas = (
78
-
79
- "<option Value='1' class='p1'>りんご</option>"
80
-
81
- "<option Value='2' class='p1'>みかん</option>"
82
-
83
- "<option Value='3' class='p2'>ゴリラ</option>"
84
-
85
- "<option Value='4' class='p2'>キリン</option>"
86
-
87
- );
88
-
89
-
90
-
91
- $this->set("listDatas", $listDatas);
92
-
93
- ```
94
-
95
- を作成し、index側に渡しています。
96
-
97
-
98
-
99
- index側では
100
-
101
- ```
102
-
103
- <select name="selectNM" id="selectID" size="10" disabled="disabled" multiple="multiple">
104
-
105
- <?= $listDatas ?>
106
-
107
- </select>
108
-
109
- ```
110
-
111
- と作成しています。
112
-
113
-
114
-
115
- これを上記に書いたとおり、
116
-
117
- ```
118
-
119
- <?=$this->Form->select('selectNM',・・・・・・・・); ?>
120
-
121
- ```
122
-
123
- のFormHelper形式で書きたいです。
124
-
125
-
126
-
127
- 現状の方式でも表示はされているのですが、上記をキーとして検索をかけると初期化されてしまいます。
128
-
129
- サイトを読むと、FormHelper形式で書くと、検索後もデータが保持されるみたいなので。
130
-
131
-
132
-
133
-
134
-
135
- わかりにくい説明文ですが、サンプルソースや参照サイトなどアドバイス等を宜しくお願い致します。
136
-
137
- もし、検索キーの保持のやり方が別にあり、そちらで実現できればそちらでもOKです。

1

コードをわかりやすい表示形式に変えました。

2017/09/01 06:05

投稿

noranuko
noranuko

スコア12

test CHANGED
File without changes
test CHANGED
@@ -1,14 +1,26 @@
1
1
  ###前提・実現したいこと
2
2
 
3
3
  PHP(CakePHP)で連動プルダウンを使用した検索システムを作っています。
4
+
5
+ 検索後に値を保持した状態にしたいです。
6
+
7
+ ※現在は検索後、検索キーが初期化される。
8
+
9
+
4
10
 
5
11
  FormHelperを使用して作成しようとしているのですが、
6
12
 
7
13
  以下のサンプルのように書くと、
8
14
 
15
+ ```
16
+
9
17
  echo $this->Form->select('flag',array(1=>'りんご',2=>'みかん'3=>'ゴリラ',4=>'キリン'),,array('empty'=>false));
10
18
 
19
+ ```
20
+
11
21
  オプション部分が
22
+
23
+ ```
12
24
 
13
25
  <option Value='1'>りんご</option>
14
26
 
@@ -18,11 +30,17 @@
18
30
 
19
31
  <option Value='4'>キリン</option>
20
32
 
33
+
34
+
35
+ ```
36
+
21
37
  になると思います。
22
38
 
23
39
 
24
40
 
25
41
  これをプルダウン連動システムと関連付けるため、
42
+
43
+ ```
26
44
 
27
45
  <option Value='1' class='p1'>りんご</option>
28
46
 
@@ -32,14 +50,88 @@
32
50
 
33
51
  <option Value='4' class='p2'>キリン</option>
34
52
 
53
+
54
+
55
+ ```
56
+
57
+ のように,
58
+
59
+ ```
60
+
35
- のように、「class='p*'」を文中に組み込みたいです。
61
+ class='p*'
62
+
63
+ ```
64
+
65
+ を文中に組み込みたいです。
36
66
 
37
67
 
38
68
 
39
- 色々と調べたのですが、行き詰ってしまいました。
69
+ 色々と調べたのですが、同じようなサンプルを探すことができず、行き詰ってしまいました。
70
+
71
+
72
+
73
+ Controller側でSQLを組み、
74
+
75
+ ```
76
+
77
+ $listDatas = (
78
+
79
+ "<option Value='1' class='p1'>りんご</option>"
80
+
81
+ "<option Value='2' class='p1'>みかん</option>"
82
+
83
+ "<option Value='3' class='p2'>ゴリラ</option>"
84
+
85
+ "<option Value='4' class='p2'>キリン</option>"
86
+
87
+ );
88
+
89
+
90
+
91
+ $this->set("listDatas", $listDatas);
92
+
93
+ ```
94
+
95
+ を作成し、index側に渡しています。
96
+
97
+
98
+
99
+ index側では
100
+
101
+ ```
102
+
103
+ <select name="selectNM" id="selectID" size="10" disabled="disabled" multiple="multiple">
104
+
105
+ <?= $listDatas ?>
106
+
107
+ </select>
108
+
109
+ ```
110
+
111
+ と作成しています。
112
+
113
+
114
+
115
+ これを上記に書いたとおり、
116
+
117
+ ```
118
+
119
+ <?=$this->Form->select('selectNM',・・・・・・・・); ?>
120
+
121
+ ```
122
+
123
+ のFormHelper形式で書きたいです。
124
+
125
+
126
+
127
+ 現状の方式でも表示はされているのですが、上記をキーとして検索をかけると初期化されてしまいます。
128
+
129
+ サイトを読むと、FormHelper形式で書くと、検索後もデータが保持されるみたいなので。
40
130
 
41
131
 
42
132
 
43
133
 
44
134
 
45
135
  わかりにくい説明文ですが、サンプルソースや参照サイトなどアドバイス等を宜しくお願い致します。
136
+
137
+ もし、検索キーの保持のやり方が別にあり、そちらで実現できればそちらでもOKです。