【難問解決】 PHPでテンプレートをincludeした

【注】
現在は、PHPでのテンプレートの読み込みをやめ、SSIでテンプレートファイルを読み込んでいます。
(詳しくは 【難問解決】 SSIのインクルードで圧縮できるか実験してみた をご覧ください)

このようにして、何年にも渡る長い道のりの末、ついに私はPHPを使ったテンプレートを作成し始めたのでした。

しかし、大変なのはここからでした。
今まで作っていたサイトは 『 PHPのサイト 』 ではなく、『 HTMLサイト 』 だったからです。

私はどうしたものかと思案しました。
すると、とある解決策が見つかりました。

スポンサーリンク

PHPの仕組み

PHPサイトとは、『 PHPファイル 』 で作られたサイトです。
HTMLサイトとは、『 HTMLファイル 』 で作られたサイトです。

両者の違いは、『 使える機能 』 にあります。

HTMLは、初心者でも安全で簡単に扱える仕組みになっています。
PHPは、比較的難しいコードを使います。

include 程度であればそんなでもないですが、もっともっと難しいPHPコードは山のようにあります。
そして、HTMLタグよりも遥かに色んなことができます。

データベースから数多くのデータを引っ張ってきて表にまとめて出すとか、そんな難しいこともできてしまうのがPHPです。

今回、私がやろうとしていたのは、PHPの持つ 『 include 』 と言う機能を使って、『 テンプレートの部品を読み込む 』 と言うことでした。

ところが普通、HTMLファイルはPHPファイルにはなりません。
拡張子を変えてコードを変えるとPHPファイルにはなりますが、そうなると今度は 『 URL 』 が変わってしまいます。


HTMLファイル

http://hogehoge.net/hoge.html


PHPファイル

http://hogehoge.net/hoge.php


せっかくたくさんの被リンクを付けて頂いたサイトなのです。
URL(ファイル名)を 『 *.htm 』 から 『 *.php 』 には変えたくないのです。

じゃあどうすれば良いのか?
『 HTMLファイルのままPHPファイル化 』 してしまえば良いのです。


HTMLファイルのまま、PHPファイル化する方法

HTMLファイルのままPHPファイル化するには、.htaccess と言うファイルに、以下のように記入し、ドメインのルートフォルダ(ドメインの一番上の階層のフォルダ)に放り込むだけでした。

# ヘテムルの場合
AddHandler php5.4-script .php

# さくらのレンタルサーバーの場合
AddHandler myphp-script .php .htm .html
Action myphp-script /php.cgi

この他、さくらのレンタルサーバーの場合は、php.cgi と言うファイルを作らないといけません。
(他のレンタルサーバーの多くは、ヘテムルタイプの書き方でOKなのです)

php.cgi には、

#!/bin/sh
exec /usr/local/bin/php-cgi

と書きます。
詳しくは、【実験結果】さくらでphpのincludeするための方法を詳しく解説をご覧ください。



これで、HTMLファイルをPHPとして読み込むことができるようになりました。


テンプレートの読み込み方

では、実際にテンプレートを作ってみます。
まずは、読み込みたいヘッダー用のテキストファイルフッター用のテキストファイルを作ります。

<!-- ヘッダー用のテキストファイル -->

<div id="header">
サイトタイトル
<ul>
<li>カテゴリー1
<li>カテゴリー2
<li>カテゴリー3
</ul>
<div>

<!-- フッター用のテキストファイル -->

<div id="footer">
Copyright(c) 2016 ●●●. All Rights Reserved.
<div>

次に、ページファイルの中のヘッダーとフッターを読み込みたい場所
<?php include("ヘッダー用のテキストファイルのURL"); ?>

<?php include("フッター用のテキストファイルのURL"); ?>
を入れます。

ファイルURLは、ファイルのURLを書きます。
こんな感じで。
http://hogehoge.net/head.txt

これに先ほどのコードを合体させると、

<?php include("http://hogehoge.net/head.txt"); ?>

こんな感じになります。


※ ご注意
さくらのレンタルサーバーの場合、<?php include(""); ?> が利用できませんので、擬似的に openfile のコードを使います。
詳しくは、【開けてビックリ】 PHPのinclude ができなくなったをご覧ください。

<?php $openfile = file_get_contents("●●●"); echo $openfile; ?>

さくらのレンタルサーバーで include と同様の動作をさせるためには、上記のコードを使用します。


【ついに完成】 さくらでもincludeをする方法


念のため、PHPで相対パスは使わない方が良いかもしれません。
(悪意のあるハッカーが悪さするかもしれないので)

<!DOCTYPE html><html lang="ja"><head>
<title>タイトル</title>
</head>
<body>

<!-- ヘッダー -->
<?php include("ヘッダー用のテキストファイルのURL"); ?>


<h1>ページタイトル</h1>
文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書

<!-- フッター -->
<?php include("フッター用のテキストファイルのURL"); ?>


</body>
</html>

こうやって、ページ内にinclude用のコードを仕込むと、サーバー上で読み込んだテキストファイルが自動挿入され、一つのファイルとして吐き出されます。



コメント用のコード <!-- コメント -->二重に吐き出されるのは、読み込み元のファイルと読み込むファイルの両方にコメント用のコードが付いているからです。

コメント用のコードが二重に吐き出されるのが嫌な場合は、どちらかのコメント用のコードを消してあげると良いです。

先ほどの読み込んだファイルがサーバーによって一体化され、一枚のページとして吐き出されると、このようになります。

<!DOCTYPE html><html lang="ja"><head>
<title>タイトル</title>
</head>
<body>

<!-- ヘッダー -->
<!-- ヘッダー用のテキストファイル -->

<div id="header">
サイトタイトル
<ul>
<li>カテゴリー1
<li>カテゴリー2
<li>カテゴリー3
</ul>
<div>

<h1>ページタイトル</h1>
文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書文書

<!-- フッター -->
<!-- フッター用のテキストファイル -->

<div id="footer">
Copyright(c) 2016 ●●●. All Rights Reserved.
<div>

</body>
</html>

ヘッダーとフッターのテンプレート変更する際は、読み込む部品ファイルを変更し、サーバーにアップロードすればOKです。



次ページ

サイトをPHPでテンプレート化するメリットとデメリット

前ページ

【紆余曲折】 サイトをテンプレート化することを決意した


スポンサーリンク