Mineaki Gotoh
gij****@peak*****
2002年 12月 11日 (水) 09:22:02 JST
西村さん、こんにちは。後藤です。今の仕事にようやく目鼻がついて、ちょっ とは余裕が出てきました。 閑話休題。 ちょっと内容が異なってきているので、Subjectをつけなおしました。 >質問は非常に初歩的なことなのですが、 いえいえ。西村さんのご質問は的確にツボをついていると思いますよ。 >》> 数字以外の入力があった場合を嫌うからかもしれません。 >》a) "(半角数字のみ)" のような注意書きがある。 >インターネットで買い物をしたことのない初心者に、テストで買い物をしてもらっ >たのですが、アカウントの登録画面の郵便番号の欄の前に「半角で入力してくだ >さい」という注意書きがあっても、住所の入力でIMEがonになっているので、や >はり全角で入力してしまうようです。 確かにその通りです。初心者には、全角・半角という概念がないみたいです ね。だから、注意書きとかしても、あまり意味がないと思っています。 だからこそ、入力の時点で、IMEを切ってしまえば良い、と主張しているので す。"ime-mode:disabled" というCSSが、どれだけ汎用性のあるものなのかは 判りませんが、少なくともMS-IE5以上では有効です。 となれば、WinとMacを併せて、90%以上は対応することになるでしょう。それ こそ、全角半角の区別の付かない初心者が、あえて、NetscapeやOperaを使う 可能性は0に近いと思いますのである意味100%近いとも言えます。(もちろん、 これらのブラウザが、ime-mode というCSSに対応している可能性もあります) ちなみに、IMEという概念のない言語では、このスタイルシートは単に無視さ れますので、osCommerceの売りであるマルチランゲージ性も損なわないはず です。(実験はしてないので保証はできませんが) 理屈だけこねても仕方ないので、コード修正を例示しましょう。 アカウント関係に限れば、修正するのも1ファイルだけです。 catalog/includes/modules/account_details.php において、IMEを切りたい入力項目に該当する tep_draw_input_field( ... , ... ) という関数の、3番目の引数に、'style="ime-mode:disabled"' を与えます。 注意しなければならないのは、このファイルにある tep_draw_input_field() 関数には、引数が1つのものと2つのものが混在して いるので、それぞれの場合に応じて、書き換え方を違えることです。 具体的に例を挙げると、 「生年月日」を修正する場合、 91行目付近 if ($is_read_only) { echo tep_date_short($account['customers_dob']); } elseif ($error) { if ($entry_date_of_birth_error) { echo tep_draw_input_field('dob') . ' ' . ENTRY_DATE_OF_BIRTH_ERROR; } else { echo $HTTP_POST_VARS['dob'] . tep_draw_hidden_field('dob'); } } else { echo tep_draw_input_field('dob', tep_date_short($account['customers_dob'])) . ' ' . ENTRY_DATE_OF_BIRTH_TEXT; } を、下のようにします。 if ($is_read_only) { echo tep_date_short($account['customers_dob']); } elseif ($error) { if ($entry_date_of_birth_error) { echo tep_draw_input_field('dob','','style="ime-mode:disabled"') . ' ' . ENTRY_DATE_OF_BIRTH_ERROR; } else { echo $HTTP_POST_VARS['dob'] . tep_draw_hidden_field('dob'); } } else { echo tep_draw_input_field('dob', tep_date_short($account['customers_dob']),'style="ime-mode:disabled"') . ' ' . ENTRY_DATE_OF_BIRTH_TEXT; } tep_draw_input_field('dob') のように、引数が1つしかない場合は、 tep_draw_input_field('dob','','style="ime-mode:disabled"') と、2番目の引数に''と、空文字列を渡します。 tep_draw_input_field('dob', tep_date_short($account['customers_dob'])) のように、引数が2つある場合は、そのまま3番目の引数を追加します。 tep_draw_input_field('dob', tep_date_short($account['customers_dob']),'style="ime-mode:disabled"') このファイルで修正候補となるのは、 ・生年月日 (dob) 2箇所 (引数1つのが1、2つのが1) ・E-mail (email_address) 4箇所 (引数1つのが3、2つのが1) ・郵便番号 (postcode) 2箇所 (引数1つのが1、2つのが1) ・電話番号 (telephone) 2箇所 (引数1つのが1、2つのが1) ・FAX (fax) 1箇所 (引数2つのが1) あたりでしょうか。 なお、お客様が入力するフィールドは、osCommerceには他にもいくつかあり、 それらをすべて修正するのは結構大変です。 とりあえず、簡単なところでは、 catalog/address_book_process.php 535行目付近を、 if (@$postcode_error == '1') { echo '<input type="text" name="postcode" maxlength="8" value="' . $HTTP_POST_VARS['postcode'] . '" style="ime-mode:disabled"> ' . ENTRY_POST_CODE_ERROR; } else { echo $HTTP_POST_VARS['postcode'] . '<input type="hidden" name="postcode" value="' . $HTTP_POST_VARS['postcode'] . '">'; } } else { echo '<input type="text" name="postcode" value="' . @$postcode . '" maxlength="8" style="ime-mode:disabled"> ' . ENTRY_POST_CODE_TEXT; } ?></td> こんな感じにします。このファイルではなぜかtep_*関数を使ってないので、 直にHTMLで記述する必要があります。 他にも、クレジットカード番号やカートの数量あたりが修正候補です。前者 はともかく、後者は結構面倒かもしれません。(試してないので判りません) また、上記の変更によっても、ブラウザが対応してなかったり、対応ブラウ ザでもコピー&ペーストなどされれば、該当フィールドに全角文字が入ること はありますので、POSTデータの受け取り側でも、処理する必要は残ります。 >》b) 入力欄の 'maxlength' の指定は、2バイト文字の入力が許される幅がある。 >海外サーバーの場合は、mb_convert_kana( ... , "a" )は、jcodeで書き換え可 >能なのでしょうか? 最新版のjcodeもいろいろ機能追加されているかもしれませんが、とりあえず 私の知っているバージョンではこれに類する機能はありませんでした。 ただ、mb_convert_kana()でも、"a"のようなアクションに限って言うなら、 新たにそういう関数を実装するのは、そんなに難しくないはずですよ。 時間があったら、osCommerceに必要なmb_*関数を自前で実装しようと思って いたんですが、自分自身には必要がないので、モチベーションが上がらず、 なかなか難しいですね。 >もし、できない場合、デフォルトで2バイトの入力がエラーにならないようにす >るには、SQL側の、どの値を、どのように変えたらいいのでしょうか? 1バイト文字を想定したフィールド(カラム)に、2バイト文字がSETされて も、MySQL的にはエラーになりません。 もちろん、バイト数の制限はあるので、最初から、各カラムのサイズを大き くしておけば、データを落とすことはなくなると思います。(郵便番号が全 角で入力されていても、7桁すべてが読めれば、それを管理者が半角に修正 することは簡単ですので) -- 株式会社PEAK ネットワーク技術担当 後藤 <gij****@peak*****>