ホーム > PEAR > HTML_QuickFormで3階層プルダウン

HTML_QuickFormで3階層プルダウン

フォームにプルダウンの選択項目をつけたいときに便利なのはhierselect。
商品カテゴリと商品名のように相互に階層関係をもつデータなどの場合に便利です。
例えば商品カテゴリを選択したら対応する商品名だけを出るようにしたりする場合に使えると思います。
今回は3階層のプルダウンまで作ってみました。

2階層のプルダウン

よく使われるのがこの方法。

select.php

コードはこちら

PHP:
  1. <?php
  2. require_once("HTML/QuickForm.php");
  3.  
  4. $form=new HTML_QuickForm("test","POST");
  5. $form->addElement("header",NULL,"hierselectのテスト");
  6.  
  7. //1層目
  8. $category[0] = "空手";
  9. $category[1] = "キック";
  10. $category[2] = "柔術";
  11. $category[3] = "プロレス";
  12.  
  13. //2層目
  14.  
  15. $fighter[0][1] = "東孝";
  16. $fighter[0][2] = "長田賢一";
  17. $fighter[0][3] = "加藤清尚";
  18. $fighter[0][4] = "飯村健一" ;
  19. $fighter[1][5] = "武田幸三";
  20. $fighter[1][6] = "小林聡";
  21. $fighter[1][7] = "深津飛成";
  22. $fighter[1][8] = "菊地剛介";
  23. $fighter[2][9] = "中井祐樹" ;
  24. $fighter[2][10] = "朝日昇";
  25. $fighter[3][11] = "天龍源一郎";
  26. $fighter[3][12] = "金村キンタロー";
  27. $fighter[3][13] = "伊東竜二";
  28.  
  29. $sel =& $form->addElement('hierselect', 'test', 'test:');
  30. $sel->setMainOptions($category);
  31. $sel->setSecOptions($fighter);
  32. $form->addElement('submit', 'btnSubmit', 'Submit');
  33.  
  34. if ($form->validate()) {
  35.     // Form is validated, then processes the data
  36.     $form->freeze();
  37.     $form->process('process_data', false);
  38.  }
  39.  else {
  40.     $form->display();
  41.   }
  42.  
  43. function process_data ($values) {
  44.     echo "<pre>";
  45.     var_dump($values);
  46.     echo "</pre>";
  47.     }
  48. ?>

$sel->setMainOptions($category);
$sel->setSecOptions($fighter);

ここで第1、第2階層のデータをsetMainOptions/setSecOptionsメソッドで引き渡しています。

3階層のプルダウンを作る

では3階層にしたい場合はどうするか?
「'setThirdOptions'とかでいけるかな」と思ったけどムリ。

検索してみたらこちらのサイトに書いてありました。

applesy16g | PEAR::HTML_QuickFormで3階層のプルダウンメニュー

さっそくやってみました。

select2.php

送信結果を見ると第3階層のデータがちょっと分かりにくい。

なのでこんなふうにしました。

コードはこちら

PHP:
  1. <?php
  2. require_once("HTML/QuickForm.php");
  3. $form=new HTML_QuickForm('frmTest', 'get');
  4. $form->addElement("header",NULL,"hierselect3階層のテスト");
  5.  
  6. //一層目
  7. $large_genre[0] = "和食";
  8. $large_genre[1] = "洋食";
  9.  
  10. //二層目
  11. $middle_genre[0][1] = "日本料理";
  12. $middle_genre[0][2] = "寿司";
  13. $middle_genre[1][3] = "洋食" ;
  14. $middle_genre[1][4] = "フランス料理";
  15. $middle_genre[1][5] = "イタリア料理";
  16.  
  17. //三層目
  18. $small_genre[0][1][0] = "会席料理";
  19. $small_genre[0][1][1] = "懐石料理";
  20. $small_genre[0][1][2] = "割烹";
  21. $small_genre[0][1][3] = "料亭";
  22.  
  23. $small_genre[0][2][4] = "江戸前寿司";
  24. $small_genre[0][2][5] = "回転寿司";
  25. $small_genre[0][2][6] = "ちらし寿司";
  26.  
  27. $small_genre[1][3][7] = "ステーキ";
  28. $small_genre[1][3][8] = "洋食一般";
  29.  
  30. $small_genre[1][4][9] = "コース料理";
  31. $small_genre[1][4][10] = "プリフィクス";
  32. $small_genre[1][4][11] = "アラカルト";
  33.  
  34. $small_genre[1][5][12] = "コース料理理";
  35. $small_genre[1][5][13] = "ピザ";
  36. $small_genre[1][5][14] = "パスタ";
  37.  
  38.  
  39. $obj_genre_select = &$form->addElement('hierselect','genre','ジャンル選択','', '');
  40. $obj_genre_select->setOptions(array($large_genre, $middle_genre, $small_genre));
  41.  
  42. $form->addElement('submit','btnSubmit','Submit');
  43.  
  44. if ($form->validate()) {
  45.      // Form is validated, then processes the data
  46.      $form->freeze();
  47.      $form->process('process_data', false);
  48.   }
  49.   else {
  50.   $form->display();
  51.   }
  52.  
  53. function process_data ($values) {
  54.   echo "<pre>";
  55.   var_dump($values);
  56.   echo "</pre>";
  57.   }
  58. ?>

select3.php

[2]=>
で帰ってくる数値を見やすくしました。

まあ3階層のプルダウン送信フォームなんて、
あんまり使う用途はなんですけどね。。。

カテゴリー: PEAR タグ:
  1. コメントはまだありません。
  1. トラックバックはまだありません。
このページの先頭へ