[Tep-j-develop] 半角英数字が必要な入力フィールドの処理

アーカイブの一覧に戻る

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">&nbsp;' . 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">&nbsp;' . 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*****>




Tep-j-develop メーリングリストの案内
アーカイブの一覧に戻る