サポート » 使い方全般 » コンタクトフォーム7について

  • 解決済 wpwp5679

    (@wpwp5679)


    コンタクトフォーム7を使用しています。
    そのフォームで電話番号を入力する項目を作成したのですが、数字以外も入力できてしまいます。
    送信時にエラーとして再入力を求めるようにはなっていますが、初めから数字のみしか入力できないようにしたいです。

    また、初めの数字が何の数字かによって問い合わせできるかどうかもしたいです。

    0120の人は送信(問い合わせ)できない
    それ以外の人は送信(問い合わせ)できる
    問い合わせできない人は、別のフォームに移動できるようにしたいです。

    よろしくお願いいたします。

13件の返信を表示中 - 16 - 28件目 (全28件中)
  • PHP の整数については下記ページをご覧ください。
    https://www.php.net/manual/ja/language.types.integer.php

    (int)’412345678901 812345678901’、
    (int)’412345678901 412345678901 812345678901′
    は、ともに412345678901となります。

    それは ishitakaさんがご指摘の通り、 文字列を int 型に変換しているからです。
    実際に

    $str = “412345678901 412345678901 812345678901”;
    echo (int)$str;

    とすると、

    412345678901

    という値になります。
    参考:https://www.php.net/manual/ja/language.types.type-juggling.php

    つまり先頭の数字しか、数値に変換されていません。
    したがってエラーにならないということです。

    スレッド開始 wpwp5679

    (@wpwp5679)

    $coupon = (int) $_POST[$name]; から
    $coupon = $_POST[$name]; に変更したら
    以下の3と4は解決しました。intなどは必ずしも必要というわけではないのですね。

    3.エラーになったて欲しくないがエラーになったもの
    全角スペースが入る

    4.エラーになって欲しいがならなかったもの
    412345678901 812345678901
    412345678901 412345678901 812345678901

    また、新たなことに気が付きました。
    現状、以下の正規表現で検証しているのですが、
    /^([49][0-9]{11}[ | ]?){1,3}$/u
    この正規表現ではスペースを含まない場合も送信できてしまいます。
    1つ目と2つ目の間や2つ目と3つ目の間は必ずスペースが欲しいです。
    1つ目のみ や 2つ目や3つ目の終わりは必要ないです。

    さらに、現状にcouponとは別の項目で条件を追加したいときはどうしたらいいでしょうか。
    電話番号ハイフンなしの条件を追加したいです。

    /^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u

    だったらどうでしょうか。

    1. 412345678901 の最初の判定は個別にする
    2. 2つ目以降が存在するなら、先頭は半角 or 全角スペースからスタートする判定にする

    という手法です。

    さらに、現状にcouponとは別の項目で条件を追加したいときはどうしたらいいでしょうか。

    if ($name == ‘coupon’) {

    これが、[text* coupon] のときの判定です。
    text* を使っている限り、
    [text* coupon2]なら

    その条件を増やしていくことになります。
    このあたりは PHPプログラミングの範疇になってくるので、やりたいことが増えれば増えるほど、それに沿ったプログラミングが必要になります。
    text* 以外であれば、そのために別に準備が必要です。

    つまり下記のようにif の条件文についてそれ以外でもしという else if をつかうことになるでしょう。

    <?php
    	add_filter('wpcf7_validate_text*', 'wpcf7_validate_post', 20, 2);
    	function wpcf7_validate_post($result,$tag){
    		$name = $tag['name'];
    
    	        if ($name == 'coupon') {
     		    $coupon = $_POST[$name];
                        if(  ! preg_match_all('/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u',$coupon )){
                             $result->invalidate( $tag, 'エラーになりました' );
                        }
     	        }else if($name == 'coupon2') {
     		    $coupon = $_POST[$name];
                        // ここに駄目な条件を書いて、そのときにエラーになるようにする
                    }
    	        return $result;		
    	}
    ?>

    2番目の空白も必須ということなので、こんな感じではどうでしょうか。
    if ( ! preg_match( '/^([49][0-9]{11}[ | ]){1,3}$/u', trim( $coupon, '  ' ) . ' ' ) ) {

    スレッド開始 wpwp5679

    (@wpwp5679)

    /^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u
    なるほど。2つに分ければよかったのですね。

    text* を使っている限り ということは
    textやtel*、telなどはadd_filter(‘wpcf7_validate_○○○’ 
    を作成しなければいけないということでしょうか。
    ※○○○はtextやtel*、telなど使用しているものに合わせる。

    教えて頂いたコードに以下のように追加してみたのですが、
    送信ボタンを押した後ずっと送信待ち状態になってしまいます。
    「エラー」も「送信できました。」なども何も出ません。

    ※else if後の駄目な条件は送信できなかったのでコメントアウトしてあります。
    ※else if後の駄目な条件は電話番号なのですが、種類が多いのでとりあえず
    「00000000000」(11桁)「0000000000」(10桁)「0123456789」(10桁)の
    3種類だけエラーになるようにしたいです。
    もしかしたらいつかは正規表現を使用するかもしれないので、
    動作確認として1つ目の条件をそのまま使ってます。

    <?php
    	add_filter('wpcf7_validate_text*', 'wpcf7_validate_post', 20, 2);
    	function wpcf7_validate_post($result,$tag){
    		$name = $tag['name'];
    
    	        if ($name == 'coupon') {
     		    $coupon = $_POST[$name];
                        if(  ! preg_match_all('/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u',$coupon )){
                             $result->invalidate( $tag, 'エラーになります。1' );
                        }
     	        }else if($name == 'coupon2') {
     		    $coupon = $_POST[$name];
                //if($coupon = '0000000000')
               // if(  ! preg_match_all('/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u',$coupon )){
                //$result->invalidate( $tag, 'エラーになります。2' );
                        //ここに駄目な条件を書いて、そのときにエラーになるようにする
                  //  }
    	        return $result;		
                  }
                
    }
    ?>
    スレッド開始 wpwp5679

    (@wpwp5679)

    頂いた表現のtrim( $coupon, ‘  ’ ) . ‘ ‘ ) ) が分からなかったので調べたのですが、trim関数は
    文字列の先頭・末尾にある空白(半角スペース、Tab)を除去する関数のようでした。
    どういう意味になりますでしょうか。

    >textやtel*、telなどはadd_filter(‘wpcf7_validate_○○○’ 
    を作成しなければいけないということでしょうか。

    このやり方をつかっている場合には、そうなるということです。
    発想の転換で、全部 text* にして、条件は全部自前で書くという手もあります。
    結局は何をどうしたいのかによって変わります。したがって最初に必要なのはシステム設計(仕様)です。
    それを決めた上で、どうプログラミングしていくかが決まります。

    またコードを書く時には、インデント(字下げ)を使って、ブロックごとに整理してみてください。
    今回のケースでは、{} (ブロック)で整理すると、 else if($name == ‘coupon2’) { の閉じカッコ(})が、return $result; あとに来てしまっています。

    wpcf7_validate_postの関数自体が return を要求しているので、 それがされない条件があるとそこでエラーになって止まってしまうということになっているようにみえます。

    <?php
    	add_filter('wpcf7_validate_text*', 'wpcf7_validate_post', 20, 2);
    	function wpcf7_validate_post($result,$tag){
    		$name = $tag['name'];
    
    		if ($name == 'coupon') {
    			$coupon = $_POST[$name];
    			if(  ! preg_match_all('/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u',$coupon )){
    				$result->invalidate( $tag, 'エラーになります。1' );
    			}
    		}else if($name == 'coupon2') {
    			$coupon = $_POST[$name];
    			//if($coupon = '0000000000')
    			// if(  ! preg_match_all('/^[49][0-9]{11}([ | ][49][0-9]{11}){0,2}$/u',$coupon )){
    			//$result->invalidate( $tag, 'エラーになります。2' );
    			//ここに駄目な条件を書いて、そのときにエラーになるようにする
    			//}
    		}
    
    		return $result;		            
    	}
    ?>

    つまり、人間の目からみて、たとえば if の範囲がどこまでなのかを視覚的にわかりやすくするのがインデントです。このあたりはプログラミングの書籍などに掲載されていると思いますが、意識されるのがよいかと思います。if とか else if とか漠然としかわかっていないのであれば、初学者向けのPHPプログラミングの書籍等を一通り読んで見るのも良いと思います(何がオススメかまではわかりませんが)。

    文字列の先頭・末尾にある空白(半角スペース、Tab)を除去する関数のようでした。
    どういう意味になりますでしょうか。

    trim() は念のためで、文字列の末尾に空白を一つ挿入するのが目的です。
    末尾に空白を挿入することで、下記の正規表現に合わせています。
    /^([49][0-9]{11}[ | ]){1,3}$/u

    スレッド開始 wpwp5679

    (@wpwp5679)

    なるほど。わかりました。

    インデントは最後でいいかなと思っていたのですが、その甘えがミスにつながってしました。
    ありがとうございます。今後気を付けます。

    スレッド開始 wpwp5679

    (@wpwp5679)

    trim() は念のためで、文字列の末尾に空白を一つ挿入するのが目的です。
    末尾に空白を挿入することで、下記の正規表現に合わせています。
    /^([49][0-9]{11}[ | ]){1,3}$/u


    なるほど。そういうことだったのですね。
    ありがとうございます。

    スレッド開始 wpwp5679

    (@wpwp5679)

    みなさま。ありがとうございます。
    やりたいことがうまくできました。

13件の返信を表示中 - 16 - 28件目 (全28件中)
  • このトピックに返信するにはログインが必要です。