やりたかったことは以下の通り。
- あるプルダウンメニューで選択を変えると、
他のプルダウンメニューの選択状態などが変わる - その変更内容は、DBから取得したい
<制約条件>
・Ajax(発音はエイジャックス)とかSmartyとか流行りのことは知らない
ということなのだが、
「よくわからないけどなんとかできるだろー」
とか適当に始めてみたところ、
かなりの罠があって、ひっかかりまくった。
解決するに当たり、先人の方々の解決メモに
大変お世話になったので、
私も罠の内容と解決策をメモしておく。
当初の方針は以下のようなものだった。
A. 「プルダウンメニューの選択を変えると処理が始まる」は
Javascriptを使う(selectタグのonChange())
B. Aの内容を元に、サーバサイド言語(ここではPHP)でDBとやりとりする
C. DBから取得した内容を元に、Javascriptで
他のプルダウンメニューの選択状態を変更する
しかし、問題が続発した。
問題1 AとBの連携:Javascript→PHPの処理呼び出し?
Aは、selectタグに仕込む。
<select id="id1" onChange="function()">
みたいな感じ。
このfunction()はJavascriptの外部ファイルとかで定義しておく。
Bは、PHPでDBと会話すれば良く、
これは調べればいくらでも出てくるので問題ない。
ところが、AとBの流れを考えると、
Aで呼び出されるJavascriptの関数から、
BのPHPでやる一連の処理を呼び出さなければならない。
でもJavascriptからPHPを呼び出すのってどうやるの?
調べても、なんかできなさそうな感じだった。
<解決策>
form(HTML)→Javascript→PHP
はなんか無理そうだったので、
form(HTML)→PHP⇄Javascript
とした。
ベースの処理はPHPにする。
でないとDBとの会話ができない。
で、PHPにJavascriptのコードを吐かせて
Javascriptの処理を実行する、
みたいな感じ。
やり方はこちらを参照のこと。
・PHPとJavaScriptの連携 - PHPプログラミング解説
・PHP TIPS - 12. JavaScriptをPHPで記述しよう:ITpro
要は、下のようにしてPHPにJavascriptをお話ししてもらう。
print<<<EOF
<script type="text/javascript">
〜Javascriptでやりたいこと〜
</script>
EOF;
引数は、手抜きしてoptionのhiddenで渡す。
<トリガー>
onChangeだとJavascriptしか呼び出せないので、
<form method="POST" action="hogehoge.php">
みたいにしてphpファイルを呼び出すことにした。
ただこれだと、ボタンを押すと発動するのだが、
プルダウンメニューの変更では発動しない。
かつ、hogehoge.phpにページ遷移してしまうので、
元ページの他のプルダウンメニューを変更できなくなってしまう。
要は、プルダウンメニュー変更でhogehoge.phpを呼び出しつつも、
ページ遷移したくない。
調べたら、なんかできた。
→値だけ送信してページは遷移させないためには? - CGI - 教えて!goo
<form target="fr1" action="hogehoge.php">
<select id="id1" onChange("this.form.submit()")>
として、その前あたりに
<iframe name="f1" width=0 height=0 style="visibility:hidden"></iframe>
みたいなフレームを仕込む、というやり方。
ページ遷移もなく、あたかもonChangeでPHPを呼び出している
ような感じになった。
これで第一ハードルクリア。
問題2 BとCの連携:PHP→Javascriptの処理呼び出し?
なんとかonChangeっぽくプルダウンメニュー変更でPHPの処理を発動し、
DBからデータを取り出すところまではできた。
しかし、その内容で他のプルダウンメニューの変更をする場合、
「PHPでDBから取得した内容をJavascriptに渡す」
ということが必要になる。
元のページ(HTML)で
<script type="text/javascript" src="hogehoge.js">
みたいな感じで呼び出しておいたのだけど、PHPの処理中に
「そんな関数知らね」
とかエラーが。もう意味わかんない。
<解決策>
PHPのファイル(hogehoge.php)の最初にも
print<<<EOF
<script type="text/javascript" src="hogehoge.js"></script>
EOF;
みたいにしてJavascriptの外部ファイルを読み込ませておく。
(むしろ呼び出し元のHTMLの方には不要)
これは、
「formで呼び出されたhogehoge.phpの世界」
で起きていることなので、
「元のHTMLの世界」
で呼び出しておいても関係ないのですな。
あらうっかり!
ページ遷移しない細工をしていたので、
気づくのに手間取ってしまった。
ともあれ、これでOK。
PHPの処理内で、自作のJavascriptの関数を呼び出せる。
呼び出し方は以下のような感じ。引数も渡せる。
print<<<EOF
<script type="text/javascript">
kansuu($var1);
</script>
EOF;
受けるJavascript側はこんな感じ。
function kansuu(var1){
〜やりたい処理〜
}
書くまでもないか?
問題3 他のプルダウンメニューの選択状態が変えられない
これで、だいたいやりたいところはできた。- onChangeっぽくプルダウンメニュー変更でPHPを呼び出し
- PHPでDBからデータ取得
- その内容をJavascriptの処理に渡す
最後の詰めで、Javascriptで他のプルダウンメニューの
選択状態を変えようと思ったのだけど、
なんかピクリともしない。なんで?
いつも通り
document.getElementById()
みたいに指定していると
「そんなの見つかりません」
とおっしゃる。
???
<解決策>
hogehoge.phpは、
ページ遷移を避けるために作ったフレーム内で動いている。
なので、同じフレーム内を指している
document.getElementById('id')
ではなく、
parent.document.getElementById('id')
としてやらないといけない。
うへ〜。罠だらけ。
ちなみに、プルダウンメニューの選択状態を変更をするには、
parent.document.getElementById('id').selectedIndex = the_index;
みたいにする。
私は、これ以外のやり方ではできませんでした。
the_indexは、がんばって取得する。
まとめ
- PHPとJavascriptの連携はかなり強力
- JavascriptからPHPを呼び出すのではなく、
PHPを走らせその中でJavascriptのコードを吐かせる - onChange()っぽく.phpファイルを呼び出すこともできる
- PHP内でJavascriptの外部ファイルも読み込める
なんか結構なんでもできるな、というのが印象。
ただ、処理速度とかそういうのは考えていないので、
その辺りはえらい人になんとかしていただけるとうれしい。
ちなみに、この一連の制約はDBと会話するから発生していて、
例えばCSVから読み込むのでよければ、
こんなめんどくさいことは不要で、Javascriptだけでできた。
てか、Ajax(発音は以下略)使えばできるんでしょ?知らないけど。
お世話になったサイト
・PHPとJavaScriptの連携 - PHPプログラミング解説
・PHP TIPS - 12. JavaScriptをPHPで記述しよう:ITpro
・PHP入門
・フォームからの入力 | PHP Labo