「Smarty」を含む日記 RSS

はてなキーワード: Smartyとは

2007-10-30

60行で作るPHPテンプレートエンジン

唐突に、PHP用のテンプレートエンジンを作ってみる。

方針:

  • ふつうのPHPファイルテンプレートとして使う。
  • <?php echo $var; ?> は面倒なので #{$var} と書けるようにする。
  • <?php echo htmlspecialchars($var); ?> はもっと面倒なので %{$var} と書けるようにする。
  • ついでにXML宣言も <<?php ?>?xml ... に自動置換する。

【追記】レイアウト機能を追加してみた

コード

<?php
/*
 *  SixtyLinesTemplate.php - 60行しかないけどSmartyより速いテンプレートエンジン
 *
 *  使い方:
 *     require_once('SixtyLinesTemplate.php');
 *     $TEMPLATE_DIR = 'templates'; // 省略可、パーミッションに注意
 *     $context = array('title'=>'Example',
 *                      'list'=>array(10,'<A&amp;B>',NULL));
 *     include_template('template.php', $context);
 *
 *  ライセンス: public domain (自由に改造してね)
 */

/*
 *  テンプレートを探すディレクトリ。
 */
$TEMPLATE_DIR = NULL;

/*
 *  テンプレートを読み込んで実行する。
 *  $_context は変数名をキー、値を要素とする連想配列。
 */
function include_template($_filename, $_context) {
    $_cachename = convert_template($_filename);
    extract($_context);
    include($_cachename);
}

/*
 *  filename を読み込み、convert_string() で置換してから
 *  filename.cache に書き込む。読み書きのロックは省略。
 *  (file_{get,put}_contents() はファイルロックできるようにすべきだ。)
 */
function convert_template($filename) {
    global $TEMPLATE_DIR;
    if (! file_exists($filename) &amp;&amp; $TEMPLATE_DIR)
        $filename = "$TEMPLATE_DIR/$filename";
    $cachename = $filename . '.cache';
    if (! file_exists($cachename) || filemtime($cachename) < filemtime($filename)) {
        $s = file_get_contents($filename);
        $s = convert_string($s);
        file_put_contents($cachename, $s);
    }
    return $cachename;
}

/*
 *  テンプレートの中身を置換する。
 *  - '#{...}' を 'echo ...;' に置換
 *  - '%{...}' を 'echo htmlspecialchars(...);' に置換
 *  - ついでにXML宣言も置換
 */
function convert_string($s) {
    $s = preg_replace('/^<\?xml/', '<<?php ?>?xml', $s);
    $s = preg_replace('/#\{(.*?)\}/', '<?php echo $1; ?>', $s);
    $s = preg_replace('/%\{(.*?)\}/', '<?php echo htmlspecialchars($1); ?>', $s);
    return $s;
}
?>

サンプルPHPコード

<?php
require_once('SixtyLinesTemplate.php');
$TEMPLATE_DIR = 'templates'; // optional
$context = array('title'=>'Example', 'list'=>array(10,'<A&amp;B>',NULL));
include_template('template.php', $context);
?>

サンプルテンプレート

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>%{$title}</title>
  </head>
  <body>
    <h1>%{$title}</h1>
    <table>
<?php foreach ($list as $i=>$item): ?>
      <tr bgcolor="#{$i % 2 ? '#FFCCCC' : '#CCCCFF'}">
        <td>#{$i}</td>
        <td>%{$item}</td>
      </tr>
<?php endforeach ?>
    </table>
  </body>
</html>

出力例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
    <table>
      <tr bgcolor="#CCCCFF">
        <td>0</td>
        <td>10</td>
      </tr>
      <tr bgcolor="#FFCCCC">
        <td>1</td>
        <td>&lt;A&amp;B&gt;</td>
      </tr>
      <tr bgcolor="#CCCCFF">
        <td>2</td>
        <td></td>
      </tr>
    </table>
  </body>
</html>

2006-12-24

SiteDev2の備忘録

SiteDev2とは?
PukiWiki 1.4.6をベースにしたCMS(コンテンツマネジメントシステム)。
開発元:phpspot - PHPスクリプト/MySQL/掲示板/入門/サンプル/正規表現/レンタルサーバー
公式:フリーのCMS ( コンテンツマネジメントシステム ) - SiteDev ※公式サイトはsiteDev1.1.0(PukiWiki1.4.4ベース)で構築
デモトップページ - siteDev2サンプルサイト
稼動中:feedAPPLI | Webマーケティング Dragon.jp | javascriptist など
PukiWikiとの違い…Basic認証小人数運営・ペ-ジデザインが容易・Smartyテンプレ-ト・PukiWiki1.4.6用プラグインが使用可(一部1.4.7用も可)・便利なプラグインデフォルト
デメリット…処理が重い・セキュリティが弱い!?
※(個人的には)メリット微妙rNoteの方がお勧め
ただし、rNoteはバ-ジョンアップが滞っており各自スパム対策などを講じる必要がある。(開発者ブログは続いているのでバ-ジョンアップの可能性は0ではない)
問題点修正
カスタマイズ
その他

pcommentがおかしい 【問題点修正】

pcomment.inc.php内、61行目 rawurlencode を rurlencode に修正。

ページ一覧に文字化けした謎のタイトルが!! 【問題点修正】

害は無いと思いますが…デリケ-トな方はwiki/内の0バイトtxtファイル削除してみると吉かも

パスの書式問題 【問題点修正】

環境によって生じる!?私はデフォルトのままで平気でしたが…

一応解決方法→siteDev2の日本語URL問題を解決

SiteDev2の認証問題 【問題点修正】

PHPのバ-ジョンによって生じる!?

解決方法→phpspot.org - トピックを表示 - SiteDev2の認証 | 私的ファイル deltazulu 記録再開 - ひとり Wiki で SiteDev2 | PukiWiki/CMS/SiteDev2 - taru

コメントスパム対策 【カスタマイズ】

スパム対策済コメントプラグインがPukiWiki1.4.7用ですが修正無しで使用可能。

もうひとつ(古いみたい!?なので)参考までに…commentプラグイン

PukiWiki.orgの仕様を参考に 【カスタマイズ】

カスタマイズPukiWiki.orgの仕様を参考にしてみても吉かも。ただし、情報が古いので要注意!!

PukiWiki.orgの仕様(2004/08/20以前)

負荷対策 【カスタマイズ】

参考までに…BugTrack/763

パス 【カスタマイズ】

PukiWikiのUPLをindex.php?hogeの形式ではなく、index.php/hogeの形式に変更する方法。

SiteDev2ではデフォルトindex.php/hoge仕様になっている。中身を詳しく知りたい方は→PukiWiki with PATH_INFO

全角英数文字を半角に変換表示 【カスタマイズ】

見栄えが気になる方は→全角英数文字を半角に変換表示

キャッシュ 【カスタマイズ】

Pukiwiki Plus 1.4.7-i18nプラグイン。SiteDev2で動作するか不明(一応メモ)Wiki文法の出力HTMLをキャッシュする

HTML直接記述の危険性?? 【その他】

危険らしいですよ

ログイン ユーザー登録
ようこそ ゲスト さん