1つのPHPファイルで複数ページの役割を果たす方法

更新日:2017年2月4日

管理が煩雑になる為、無駄にPHPファイルを増やしたくないと考える方も少なくないのではないでしょうか?
PHPはPOSTしたりGETしたりといった性質上ファイルが増えがちです。それも致し方ないことではあるのですが、1つのPHPファイルで複数ページの役割を果たす方法も実はあります。

先に種明かししてしまえば1つのPHPファイル内で条件によって表示する箇所を変えています。どういうことかというと、あらかじめ条件Aの時にはこれを表示させ、条件Bの時にはあれを表示させ、条件Cの時にはそれを表示させるといった記述をしているのです。

それでは早速ということで、サンプルソースを下記に記述しています。
コピーしてPHPが使える環境で一度動作をお試して下さい。

<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
	$transition = $_POST['transition'];
	$name = $_POST['name'];
	if($transition == "first") {
		$transition = "second";
		$disabled = " disabled";
	}else if($transition == "second") {
		$transition = "finish";
	}
}else {
	$transition = "first";
}
?>

<?php if($transition == "first") { ?>
<p>【解説】1つのPHPファイル内で推移しています。まずは1表示目。</p>
<p>お名前を入力して下さい。</p>
<?php }else if($transition == "second") { ?>
<p>【解説】1つのPHPファイル内で推移しています。次は2表示目。</p>
<p>下記の内容で送信します。宜しければ「送信」ボタンをクリックして下さい。</p>
<input name="name" type="hidden" value="<?=$name?>">
<?php }elseif($transition == "finish") { ?>
<p>【解説】1つのPHPファイル内で推移しています。最後に3表示目です。</p>
<p>送信が完了しました。ありがとうございました。</p>
<?php } ?>

<?php if($transition != "finish") { ?>
<form method="post" action="">
	<table>
	<tr>
		<td>お名前</td>
		<td><input name="name" type="text" value="<?php echo $name ?>"<?php echo $disabled ?>></td>
	</tr>
	</table>
	<input name="transition" type="hidden" value="<?php echo $transition ?>">
	<input type="submit" />
</form>
<?php } ?>

お問い合わせフォームを想定したコードを記述してみましたが、いかがでしょうか。

当サイトにしてはかなり長い記述なので、もうやる気が失せてしまったというWEB担当者の方もいるかも知れませんが、ちょっと待って下さい。
記述としては単純でシンプルな記述を何度もしているだけなんです。

計3つの表示を用意しており、前述した通り条件によって表示させる箇所を変えています。条件は変数$transitionの値によって分岐処理しております。
この例でいうと、具体的には$transitionの値がfirstの時、$transitionの値がsecondの時、$transitionの値がfinishの時の3つの条件があるということです。

実際に動作を確認した上でソースをよく見ると、なんとなく意味が理解できるかと思います。

<?php if($transition == "first") { ?>
の下には最初に表示させたい箇所を記述しており、お名前を入力するフォームが出現します。

<?php }elseif($transition == "second") { ?>
の下にはフォーム送信後の確認画面が表示される記述が書いてあります。

<?php }elseif($transition == "finish") { ?>
の下には送信完了画面が表示される記述が書いてあります。

<?php if($transition != "finish") { ?>
は$transitionの値がfinishであれば表示させません。

なんとPHPのif文だけで1つのPHPファイルで複数ページの役割を果たすことが出来るんです。
この技法、是非お試しあれ!