ロゴ
HOME > Smarty > Smartyでホームページを作る – 実践編

Smartyでホームページを作る – 実践編

2014年03月07日

index.phpのみでホームページを制御する

Smartyについて連々と書いてきましたが、デザイナー側はこのカテゴリーの記事を読んで使えるようになれば、十分だと思います。テンプレートはあくまでページデザインを担うものとして扱い、処理はPHP側で行うのが理想です。

さて、今度はプログラマー側のお話しです。テンプレートが変わる度にPHPを書いていてはたまったもんじゃ有りません。それならHTMLで作ってしまった方が早いです。ですので、index.phpのみでページ切り替え(テンプレート変更)を行うよう考えてみます。

サンプル

サンプルは、ヘッダー、フッターの他に、以下の3枚のテンプレートを作りました。

Index01.tpl
Index02.tpl
Index03.tpl
URLによって、テンプレートを切り替えます。

mod_rewriteとフレンドリーURL

PHP側の解説を始める前に、サンプルの各ページのURLが以下のようになっているのが判ると思います。

./Sample/Smarty/Index02.html

これ実は以下のURLでもアクセス出来ます。

./Sample/Smarty/?mode=Index02

ただ、これじゃURLとして味気ないですし、SEO的にも宜しくないです。真偽は置いておき、Googleなんかはページの拡張子が.htmlの方が良いとかどうとか。

この、?mode=Index02Index02.htmlにするには、mod_rewriteというものを使います。.htaccessに以下のように書きます。

DirectoryIndex index.php
RewriteEngine on
#RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ index.php?mode=$1 [L]

 

mod_rewriteは色々な書き方が有りますし、サーバーによっても書き方が変わりますので、あくまで一例です。詳しい説明は省きますが、URLの末尾に付いた文字を $_GET[‘mode ‘]という変数に格納してindex.phpに渡すように書かれています。

サンプル

これでも表示出来ます。

index.phpの処理

<?php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
require_once('Smarty/Smarty.class.php');

/*
 * テンプレート表示クラス
 */
 class SmartyControll{
     var $Smarty;
     var $Template;

     function setTemplates(){
         $smarty = $this -> Smarty;
         $smarty->display('smarty_Header.tpl'); //ヘッダーのテンプレート
         if($this -> Template) $smarty->display($this -> Template); //コンテンツのテンプレート
         $smarty->display('smarty_Footer.tpl');  //フッターのテンプレート
     }
 }

/*
 * コントローラー
 */
 class controller{
    var $post;
    var $get;

    function mode(){
        $templates  = null;

        if($_GET['mode']):
           $mode = htmlspecialchars($_GET['mode'] , ENT_QUOTES , "UTF-8"); //URLの意図しない文字を変換
           $mode = explode(".",$mode); // Index**.html を . で区切って配列化
           $templates = $mode[0].'.tpl'; //テンプレート名を定義
        endif;

     //Smartyを定義
        $smarty = new Smarty;
        $smarty-> template_dir = 'tpl/';   //テンプレートフォルダー
        $smarty-> compile_dir  = 'cache/'; //キャッシュフォルダー

        if($templates):
           if( file_exists("tpl/".$templates) == false): //****.tplが存在してるか確認
              $templates = 'Index01.tpl'; //無ければIndex01.tplを表示
           endif;
        else:
           $templates = 'Index01.tpl';
        endif;

        $obj = new SmartyControll;
        $obj -> Smarty   = $smarty;
        $obj -> Template = $templates;
        $obj -> setTemplates();
        exit;
    }
 }

$obj =  new controller;
$obj -> mode();

?>

 

やっていることは単純で、$_GET[‘mode’]をドットで配列化し、Index02などの文字を得ます。それと同じ名前のテンプレート(Index02.tpl)があれば、そのテンプレートを表示、無ければIndex01.tplを表示といった処理です。プログラマーはこれをたたき台にし、例えば class Index01 というクラスを作り、ページ内の処理を書いていくなど。こんな感じで、プログラマはデザインが上がってくる前に、URLに応じた処理を書く事が出来ますので、工数削減になります。