初期画面へ戻す方法

  画面分割実装後のソースコード



グループ(1)



グループ(2)



  
<?
# **********************************************************
# 関数定義
# **********************************************************
require_once( "function.php" );

$Sel[$_POST['kubun']] = "selected";

if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
	$CurrentGROUP = 1;
}
else {
	$CurrentGROUP = 2;

	if ( $_POST['Group'] == 1 ) {
		$_POST['MainKey'] = trim( $_POST['MainKey'] );
		if ( $_POST['MainKey'] == '' ) {
			SetErrMessage( '空白文字が入力されました' );
			$CurrentGROUP = 1;
		}
	}

	if ( $_POST['Group'] == 2 ) {
		$CurrentGROUP = 1;
	}

	if ( $CurrentGROUP == 2 ) {
		$HideElement = '<INPUT name=kubun type=hidden value="';
		$HideElement .= $_POST['kubun'];
		$HideElement .= '">';
	}
}

if ( $CurrentGROUP == 1 ) {
	$GROUP1 = '';
	$GROUP1text = '';
	$GROUP2 = 'disabled';
	$GROUP2text = 'readonly';
}
if ( $CurrentGROUP == 2 ) {
	$GROUP1 = 'disabled';
	$GROUP1text = 'readonly';
	$GROUP2 = '';
	$GROUP2text = '';
}


require_once( "pagestart.php" );
?>

<FORM
	name=frmMain
	method=post
	action=<?= $_SERVER['SCRIPT_NAME'] ?>
	onSubmit='return CheckData();'
>
	<INPUT name=Group type=hidden value="<?= $CurrentGROUP ?>">
	<?= $HideElement ?>

	グループ(1)<BR>
	<SELECT name=kubun <?= $GROUP1 ?>>
	<OPTION value=1 <?= $Sel[1] ?>>登録
	<OPTION value=2 <?= $Sel[2] ?>>修正
	<OPTION value=3 <?= $Sel[3] ?>>削除
	</SELECT>

	<BR>
	<INPUT
		name=MainKey
		type=text
		value="<?= $_POST['MainKey'] ?>"
		<?= $GROUP1text ?>
	>
	<INPUT
		name=SendButton
		type=submit
		value="送信"
		onClick='ClickedButton=1;'
		<?= $GROUP1 ?>
	>
	<BR>
	<?= $ErrMessage ?>

	<HR size=1 color=black>

	グループ(2)<BR>
	<INPUT
		name=Data1
		type=text
		value="<?= $_POST['Data1'] ?>"
		<?= $GROUP2text ?>
	><BR>
	<INPUT
		name=Data2
		type=text
		value="<?= $_POST['Data2'] ?>"
		<?= $GROUP2text ?>
	><BR>
	<INPUT
		name=SendButton
		type=submit
		value="送信"
		onClick='ClickedButton=2;'
		<?= $GROUP2 ?>
	>

</FORM>

<?
require_once( "pageend.php" );
# **********************************************************
# デバッグ用表示
# **********************************************************
DispPost();
?>

  



  画面遷移



画面に対しての操作で、画面の状態が変化して行きます。これを画面遷移と言います。


  1. 初期画面

  2. グループ(1)の送信ボタンを押す ---> 第2画面

  3. 第2画面

  4. グループ(2)の送信ボタンを押す ---> 初期画面



単純に書いてしまうと、上記のようになりますが、これをもっと詳しくするとこのようになります。


  1. 他のページのアンカー

  2. アンカーをクリックする
  3. GET コマンドにより、スクリプトを呼び出す
  4. ---> 初期画面

  5. 初期画面

  6. この時点で、再表示(ページのリロード)を行なっても画面の変化は無い
  7. グループ(1)の送信ボタンを押す
  8. POST コマンドにより、スクリプトを呼び出す
  9. ---> 第2画面

  10. 第2画面

  11. この時点で、再表示(ページのリロード)を行なうと、再送信の確認のダイアログが表示される
  12. グループ(2)の送信ボタンを押す
  13. POST コマンドにより、スクリプトを呼び出す
  14. ---> 初期画面



3 の場合、POSTコマンドにより、初期画面が表示される為、処理の初めに戻るように画面上は見受けられますが、再表示(ページのリロード)を行なうと、再送信の確認のダイアログが表示されてしまいます。これだと、第2画面で行なった処理を再実行してしまう可能性があります。

そこで、第2画面での処理を以下のように変更します。


  • 第2画面

  • この時点で、再表示(ページのリロード)を行なうと、再送信の確認のダイアログが表示される
  • グループ(2)の送信ボタンを押す
  • POST コマンドにより、スクリプトを呼び出す
  • スクリプトは、再度このページをGETで呼び出すという指示のみHTTPヘッダに与えて送り返す
  • ブラウザは画面には何も表示せずに即、GETコマンドをスクリプトに送る
  • ---> 初期画面



  •   
    if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
    	$CurrentGROUP = 1;
    }
    else {
    	$CurrentGROUP = 2;
    
    	if ( $_POST['Group'] == 1 ) {
    		$_POST['MainKey'] = trim( $_POST['MainKey'] );
    		if ( $_POST['MainKey'] == '' ) {
    			SetErrMessage( '空白文字が入力されました' );
    			$CurrentGROUP = 1;
    		}
    	}
    
    	if ( $_POST['Group'] == 2 ) {
    		#
    		# ここでエラー処理。
    		#
    		if ( $ErrMessage == '' ) {
    			header( "Location: {$_SERVER['HTTP_REFERER']}" );
    			exit();
    		}
    	}
    
    	if ( $CurrentGROUP == 2 ) {
    		$HideElement = '<INPUT name=kubun type=hidden value="';
    		$HideElement .= $_POST['kubun'];
    		$HideElement .= '">';
    	}
    }
    
    
      



      リダイレクト

      
    header( "Location: {$_ENV['HTTP_REFERER']}" );
    
      

    この処理は、リダイレクトと呼ばれてPOSTの連鎖から抜け出る時に使用します。これは、HTTP ヘッダに上記フォーマットで書き出す事によって実現します。この処理の注意事項としては、「HTTPヘッダを出力する前にデータを出力してはいけない」という所ですが、後は自由です。でも、リダイレクトするだけなので画面を出力するのは無駄なので exit(); でスクリプトの処理を終わらせています。

    void exit ( [string status])

    ※ この関数は実際には関数ではなく言語構造

    exit() 関数は、スクリプトの実行を終了します。 終了直前にstatusを出力します。



    ASP では以下のように書きます

      
    Response.Redirect( Request.ServerVariables("HTTP_REFERER")  )
    
      




      キャンセルボタンを追加して、JavaScript での初期画面への移動

    第2画面に移動した後、処理を行ないたく無い場合があります。その場合はリダイレクトせずに、JavaScript によって現ページを再表示させます。リダイレクトは、クライアントサーバー間のやりとりが2往復してしまう為、必要でない場合は使用しません。

      
    <INPUT
    	name=CancelButton
    	type=button
    	value="キャンセル"
    	<?= $GROUP2 ?>
    	onClick='location="<?= $_SERVER['SCRIPT_NAME'] ?>";'
    >
    
      










      infoboard   管理者用   
    このエントリーをはてなブックマークに追加





    フリーフォントWEBサービス
    SQLの窓WEBサービス

    SQLの窓フリーソフト

    素材

    一般WEBツールリンク

    SQLの窓

    フリーソフト

    JSライブラリ