パソコンQ&A

PHPの処理とデザインを分ける[Smartyなど]

SmartyはSmartyファイルをサーバにアップしなきゃいけないからとか、文字コードが面倒だからとかの人は次の方法がある。
これならいちいちSmartyの使い方を覚えなくても大丈夫です。

メールのテンプレートなどにはこの方法が使えます。

Smarty以外の方法
元のテンプレートの置き換える部分を%%PHPIN%%として作っておく。
文字コードはPHPファイルと同じなら何でもいいです。

方法1
$fp = fopen('元のテンプレート', "r");
$out_put = "";
while ($x = fgets($fp)) {
  $x = mb_ereg_replace("%%PHPIN%%", $var_in, $x);
  $out_put .= $x;
}
fgetsは規定以上の行があると次の行として読み込むのでfgetsの文字列をチェックし、最後が改行以外の時は改行タグを出力する前にもう一度fgets処理が必要です。

方法2
$data = file("元のテンプレート");
$out_put = "";
for($i=0; $i<count($data); $i++) {
  $data[$i] = mb_ereg_replace("%%PHPIN%%", $var_in, $data[$i]);
  $out_put .= $data[$i];
}
配列に一度ファイルの内容を格納するパターンです。
配列に収めるのでファイルが大きいほどメモリを使うというデメリットがあります。
この場合は方法1を使ったほうがよいでしょう。


でもSmartyも使ってみると便利ですよ。
近所に行くのに車より自転車のほうがいい、遠くに行くのには車のほうがいいって感じの 使い分けだと思います。

Smartyの設定
Smarty公式ページ
Smartyダウンロードページ
Smartyをダウンロードして、ファイルを解凍し、サーバー上の任意の場所にアップロードするだけ。
ファイルはtar.gz形式なので解凍レンジなどを使うとよい。

Smartyの基本的な使い方
//SmartyのクラスファイルSmarty.class.phpを読み込む
define('SMARTY_PATH', '/Smarty');
define('SMARTY_CLASS', SMARTY_PATH.'/libs/Smarty.class.php');

require_once(SMARTY_CLASS);

$smarty = new Smarty;
//テンプレートファイルが置いてあるディレクトリ
$smarty->template_dir = '/templates';
//一時ファイル(キャッシュ)を書き出すディレクトリ
$smarty->compile_dir = '/tmp';

//PHP内の変数[$var_in]をテンプレート内の変数[var_smarty]に渡す
//配列を渡すこともできる
$smarty->assign('var_smarty', $var_in);

//template.tplを元のテンプレートとして
//変数として取り出すならfetch
$out_put=$smarty->fetch('template.tpl');

//そのまま表示するならdisplay
//echo $smarty->fetch('template.tpl');と同じ
$smarty->display('template.tpl');

$var_inを『テスト』として試すと

template.tpl
{$var_smarty} ←こんなふうに書いてみた。

とすると

テスト ←こんなふうに書いてみた。

となります。

JavaScriptは{literal}〜〜〜{/literal}ではさまないとエラーとなります。

SmartyはEUCなのでShift-JISを使うなら変換が必要

Shift-JISのページの場合、Shift-JISからEUCにPHPで変換させちゃえば楽です。
(下の方法で、間違ってShift_JISのままのファイルをSmartyで読み込むと、『本』という文字でエラーが出ます
ちょっとしたチェックに使えるかも)

function sjis2euc($Str){
  return mb_convert_encoding($Str, "EUCJP-win", "SJIS-win");
}
function euc2sjis($Str){
  return mb_convert_encoding($Str, "SJIS-win", "EUCJP-win");
}

function get_smarty_object(){
  $smarty = new Smarty();
  $smarty->template_dir = "./template_smarty/"; // テンプレートファイルが存在先ディレクトリ
  $smarty->compile_dir = "./compile/"; // テンプレートのキャッシュディレクトリ
  return $smarty;
}

function smarty_get($smarty,$template){
  return euc2sjis($smarty->fetch($template));
}
function smarty_put($smarty,$temp_var,$var_in){
  $var_in=sjis2euc($var_in);
  $smarty->assign($temp_var, $var_in);
  return $smarty;
}

function sjis2euc_file ($path_sjis,$path_euc,$file){
  $file_sjis=$path_sjis.$file;
  $file_euc=$path_euc.$file;

  $renew_flag=false;

  if(!file_exists($file_euc)){
    $renew_flag=true;
  }elseif(filemtime($file_euc)<filemtime($file_sjis)){
    $renew_flag=true;
  }
  if($renew_flag==true){
    $data = file($file_sjis);
    $out_put = "";
    for($i=0; $i<count($data); $i++) {
      $out_put .= sjis2euc($data[$i]);
    }

    if(file_exists($file_euc)){
      unlink($file_euc);
    }
    $fp0 = fopen($file_euc, "w");
    fwrite($fp0, $out_put);
    fclose($fp0);
    chmod($file_euc, 0606);
  }
  return true;
}


△上に戻る

このページはリンクフリーです。設定などは自己責任で…
Copy Right kikky

kikky.net