開発メモ

開発用のメモです。

EC CUBE 電話番号の市外局番等のチェックを強化する

<?php

    /**
    * 電話番号の判定
    *
    * 数字チェックと文字数チェックを実施する。
    * @param array $value 各要素は以下の通り。<br>
    *   [0]: 項目名<br>
    *   [1]: 電番1項目目<br>
    *   [2]: 電番2項目目<br>
    *   [3]: 電番3項目目<br>
    *   [4]: 電話番号各項目制限 (指定なしの場合、TEL_ITEM_LEN)<br>
    *   [5]: 電話番号総数 (指定なしの場合、TEL_LEN)
    * @return void
    */
    public function TEL_CHECK( $value ) {
        $disp_name = $value[ 0 ];
        $keyname1 = $value[ 1 ];
        $keyname2 = $value[ 2 ];
        $keyname3 = $value[ 3 ];

        $telItemLen = isset( $value[ 4 ] ) ? $value[ 4 ] : TEL_ITEM_LEN;
        $telLen = isset( $value[ 5 ] ) ? $value[ 5 ] : TEL_LEN;

        if( isset( $this->arrErr[ $keyname1 ] ) || isset( $this->arrErr[ $keyname2 ] ) || isset( $this->arrErr[ $keyname3 ] ) ) {
            return;
        }

        $this->createParam( $value );

        $cnt = 0;
        for( $i = 1; $i <= 3; $i ++ ) {
            $keyname = $value[ $i ];
            if( strlen( $this->arrParam[ $keyname ] ) > 0 ) {
                $cnt ++ ;
            }
        }
        // 全ての項目が満たされていない場合を判定(一部だけ入力されている状態)
        if( $cnt > 0 && $cnt < 3 ) {
            $this->arrErr[ $keyname1 ] .= "{$disp_name}は全ての項目を入力してください。<br />";
        }

        $total_count = 0;
        for( $i = 1; $i <= 3; $i ++ ) {
            $keyname = $value[ $i ];
            $input_var = $this->arrParam[ $keyname ];

            $is_ap_number = true;

            if( $i == 1 && strpos( "0", $input_var ) != 0 ) {
                // 市外局番は 0 開始
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strlen( $input_var ) == 1 ) {
                // 市外局番は2桁以上
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "00", $input_var ) == 0 ) {
                // 各種サービス番号
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "010", $input_var ) == 0 ) {
                // 国際通話
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "0120", $input_var ) == 0 && $is_ap_number == false ) {
                // フリーダイヤル
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "0130", $input_var ) == 0 ) {
                // マスコリングサービス
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "0140", $input_var ) == 0 ) {
                // 災害時応急復旧用無線電話
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "0160", $input_var ) == 0 ) {
                // 衛星通信災害用
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "0170", $input_var ) == 0 ) {
                // 伝言ダイヤル
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "0180", $input_var ) == 0 ) {
                // テレゴング・テレドーム
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "0190", $input_var ) == 0 ) {
                // エンジェルライン・あんないジョーズ
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "020", $input_var ) == 0 ) {
                // 発信者課金無線呼出
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "0570", $input_var ) == 0 && $is_ap_number == false ) {
                // ナビダイヤル
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "060", $input_var ) == 0 ) {
                //  eコール
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "0800", $input_var ) == 0 ) {
                // フリーダイヤルおよび類似サービス
                // $this->arrErr[$keyname] .="※ {$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 1 && strpos( "0990", $input_var ) == 0 && $is_ap_number == false ) {
                // フリーダイヤルおよび類似サービス
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市外局番)が不正です。<br />";
            } else if( $i == 2 && strlen( $input_var ) > 4 ) {
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(市内局番)が不正です。<br />";
            } else if( $i == 3 && strlen( $input_var ) != 4 ) {
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}(加入者番号)が不正です。<br />";
            } else if( strlen( $input_var ) > 0 && strlen( $input_var ) > $telItemLen ) {
                $this->arrErr[ $keyname ] .= sprintf( '※ %sは%d字以内で入力してください。<br />', $disp_name . $i, $telItemLen );
            } elseif( $this->numelicCheck( $input_var ) ) {
                $this->arrErr[ $keyname ] .= "{$disp_name}{$i}は数字で入力してください。<br />";
            }

            $total_count += strlen( $input_var );
        }

        // 合計値チェック
        if( $total_count > $telLen ) {
            $this->arrErr[ $keyname3 ] .= "{$disp_name}{$telLen}文字以内で入力してください。<br />";
        }
    }

まあこれを改造する必要はないかもしれない。

Twitter: @asahina_alice