Engineering

HTMLのSELECTタグでできるフォーム部品、つまり
↓これ

の日本語での正式名称って何なのかなー、と思った話です。

昔から、ドロップダウンリストとかプルダウンとかセレクトボックスとか呼んでいて、定まっていなかった。呼ぶたびになんだかモヤッとした気持ちになっていた。
よーし、そろそろここいらで決着をつけようではないかっ!
と、勇んで調べたところ、下記ページに行き当たった。

HTMLタグの正式名称 #HTML - Qiita

わー、すべてのタグの正式名称を調べ上げて下さっている!
すげー、ありがてぇ。と思い、そのまま上から眺めていた。
あ、SELECTタグを調べるんだった!と気づくのに時間がかかったが、まあ良い。これで長年のモヤモヤに決着がつくのだ。このくらいの遠回りは物の数ではないわっ!
さて、SELECTの正式名称は、っと。
 SELECT → 和訳の正式名称なし
ふーん、なるほどー。正式名称は「和訳の正式名称なし」っていうんだねー。あースッキリしたー、、、じゃねーよっ!
無いんかーいっ!!!
ここにモヤモヤさらに深マレリ。。。

いやいや、この記事では全般的に調べて下さったので特定のタグは深掘りしなかったということですよね。不肖このワタクシメがSELECTタグにつきましては深掘りいたしましょう。
件の記事に倣って MDN Web Docs を正義とします。
そして下記のような記述が見つかりました。

選択ボックス
単純な選択ボックスは、1 つ以上の <option> 要素を子要素として持つ <select> 要素で作成され、
それぞれが可能な値のうちの 1 つを指定します。
(その他のフォームコントロール - ウェブ開発を学ぶ | MDN) より

というわけで、SELECTタグで作られるフォーム部品の日本語正式名称は
 選択ボックス
と言って良いのではないでしょうか。


そしてこれはちと盲点だったというか、そこまで考えてなかったというか…その通りだろうと思ったので付け加えさせていただく。正式云々というのとはズレてしまいますが。。
私見では、このモノの名前はセレクトボックス、ポイントまたはクリックしてズラズラと出てくる選択肢の一群をプルダウンまたはドロップダウンメニューと言っていいと思います。

つまり下図のごとし。
スクリーンショット 2024-02-06 144947

「選択ボックスをクリックするとリストがドロップダウンします。」垂れ幕を落とす(※)感じ?
「選択ボックスからリストがプルダウンされます。」トイレットペーパーのように引っ張り出す感じ?

※:怪盗なヒトが気球から「〇〇はいただいた」みたいなメッセージを書いた縦長の垂れ幕をダラッと落とすイメージだったり、何かの結果発表のときビルの屋上から垂れ幕をシュルシュルっと落とすイメージだったんだけど、そういうイメージがググっても出てこなかった。世間一般的ではないのかな…?そもそも「垂れ幕を落とす」という言葉が無いようだ。あーそうそう、「くす玉」を割ったときに出てくるメッセージのイメージです。
あくまでもテスト用にPHP内であるURLからファイルをダウンロードしてそのまま出力する、その際SSLの確認を行わない
っというプログラムを作った。あくまでもテスト用に。大事なことなので二度言いましたよ。
そのやり方は書きません。怒られそうだから(^_^;

その中で、どうせならファイル内容から mime type を自動判別してContent-Type ヘッダを出力しよう。となった。
mime type 取得なら素直に mime_content_type 関数を使うところだが…
パラメータ
filename 調べるファイルへのパス。

てな具合で、ファイルパスを指定しかできない。
さあ困った。とググっていると、
しかし、2022年現在ではこのファンクションは使いにくいファンクションです。一時期は「非推奨」という扱いになり、廃止が検討されていたり、また現在でも標準では利用できずに「php.ini」という設定ファイルを編集しなければ使えない環境などもあります。

なんと!mime_content_type 関数って使えないのーっ!?(※フツーに使えるみたいです;文末参照)
そうかそれじゃ仕方ない。finfo を使いましょう。
で、見つけちゃったの。
finfo::buffer — 文字列バッファの情報を返す

おーこれこれ。引数にファイルを格納した変数を渡せる。
しっかし、この公式マニュアル、関数の説明が
この関数は、バイナリデータの情報を文字列形式で返すために使用します。
の一文だけ。ナンノコッチャわからんやん。。まあ例を見ればわかるけど。

ちゅーわけで、↓こんな感じになりましたとさ。
$cont = file_get_contents($url, false, stream_context_create(ゴニョゴニョ));
$f = new finfo();
$type = $f->buffer($cont);
if ($type) header("Content-Type: {$type}");
echo $cont;


※mime_content_type 関数の非推奨について
うーん、どうやら mime_content_type 関数は非推奨では無いようです。ってか、ハッキリと現時点では非推奨ではありません。実際に一時期非推奨になったことがあったけどやめた。非推奨になった根拠も不明。別にちゃんと使えるやん。躊躇なく使っていいよ。っということのようだ。
↓参考文献
「mime_content_typeは非推奨ではない」ということで良いでしょうか?
PHP :: Doc Bug #71367 :: claim mime_content_type is deprecated
AWSでロードバランサー(ELB)を使っている環境で「.htaccess」を使って一時的に「メンテナンス中」表示をするが、特定IPアドレスを除外したい(特定IPアドレスからは普通に見えるようにしたい)、というお話。
...
RewriteCond %{REMOTE_ADDR} !=192.168.0.123
...

としても効かない。
なぜ?と思って環境変数を調べると…うん。$_SERVER['REMOTE_ADDR']に自分のIPアドレスは入らない。
探してみると$_SERVER['HTTP_X_FORWARDED_FOR']の中に入っている。
じゃあ、と思って先の.htaccessを書き換えたがやっぱり効かない。
教えてグーグル先生!
…見つかった。
php:$_SERVER[“REMOTE_ADDR”]

.htaccess:RewriteCond %{REMOTE_ADDR} !^××.××.××.××

ELBの場合

PHP:$_SERVER[“HTTP_X_FORWARDED_FOR”]

.htaccess:RewriteCond %{HTTP:X-Forwarded-For} !^××.××.××.××

ありがとうryoさん。コメント機能がなかったのでここでお礼を言わせていただきます。
環境変数名が違ったんだね…。
サーバでは「HTTP:X-Forwarded-For」だったのが、PHPでは「HTTP_X_FORWARDED_FOR」に変換されちゃってたんだー、そういうものなのか知らなかったなー。
summernote でも画像挿入時とかに modal を使っている。
つまり modal 内で summernote を使うと画像挿入時とかに modal の入れ子が発生することになる。

bootstrap modal って、意外と入れ子のことは考えられていないようで、皆さん苦労されているようです。そもそも入れ子にすべきじゃないってことなの?

というわけで、公式な対応ではなく無理矢理ここだけ対応、ということになる。
ニッチ対応とでも言うのか…こんなことに命名するのも馬鹿げているが。
まあなんとなくカッコいいほうが良いよねー、的な。
ニッチやなくてリッチになりたいでほんま。

さて、愚痴を吐いて少しスッキリしたところで本題。

summernote で画像挿入した場合、挿入した時に画像選択用モーダルが閉じる。
その閉じた際にbodyタグが操作されて親モーダルも閉じた状態になってしまう。
具体的には'modal-open'クラスが無くなって、style属性も変更される。
そこでそれを元に戻そう、というのが下記コード。
    var body_style;
$('#parent-modal').on('show.bs.modal', function (e) {
if (e.target.id !== 'parent-modal') {
body_style = $('body').attr('style');
return;
}
// 親モーダル用処理
}).on('hidden.bs.modal', function (e) {
if (e.target.id !== 'parent-modal') {
if (body_style) $('body').attr('style', body_style).addClass('modal-open');
body_style = null;
return;
}
// 親モーダル用処理
});

子モーダルが開く時に親モーダルの「show」イベントも発火する。
まあそれはそれで不具合の元なのだが…今回はそれを利用して、、
子モーダルが開いた(と思わしき)時にbodyタグのstyle属性値を保存しておいて、子モーダルが閉じた(と思わしき)時に保存しておいたモノを戻す。そして'modal-open'クラスも付与。
ということをしてまーす。

そうそう。画像選択用モーダルのバツボタンを押して閉じた時、親モーダルまで閉じてしまうことにはワタクシメは気づいておりませんので。
もし気づいた方がいらっしゃったらご対応くださいませ\(^o^)/
echo date('Y/m/d', strtotime('2000/0/0')); // 1999/11/30

「ゼロ月」は1月の前の月だから、前年の12月。
「ゼロ日」は1日の前の日だから、前月の末日。
つまり「ゼロ月ゼロ日」は前年の12月の前月の末日。つまり前年の11月の末日。
よって2000年0月0日は1999年11月30日となる。

ちなみに、下記のように0年0月0日としても同じ1999年11月30日が出力される。
echo date('Y/m/d', strtotime('0/0/0')); // 1999/11/30

これは、「0年」は年の短い表現と解釈されて2000年となるため。
…と思ったけど違うかも。

echo date('Y/m/d', strtotime('1/0/0')); // 1999/12/31

echo date('Y/m/d', strtotime('2/0/0')); // 2000/01/31

あー、mm/dd/yy形式と判定されるのねー。
「1/0/0」 → 「01/00/2000」 → 2000年1月0日 → 1999年12月31日
「2/0/0」 → 「02/00/2000」 → 2000年2月0日 → 2000年1月31日