Help us understand the problem. What is going on with this article?

Smartyを使ってみる

1 インストール

1 download
 以下のサイトよりダウンロードします。
 http://www.smarty.net/

2 インストール
 ダウンロードしたzipを解凍します。使うのはlibsフォルダのみです。
 DocumentRootにsampleフォルダを作成しサンプルアプリを置くものとして

 htdocs + sample
      └ libs      <- ダウンロードしたsmartyのlibs

 ※libsを複数プロジェクト共通で利用する場合は、
  c:\smarty3\libs 等適当な場所へ配置しましょう。

3 設定
 smartyのlibsを共通で使う場合は、php.iniのinclude_pathの設定を行います。
";"を削除し、";c:\smarty3\libs"等と追記します。

php.ini
; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
 ↓
include_path = ".:/php/includes:/usr/local/lib/smarty3/libs"
;
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes"
 ↓
include_path = ".;c:\php\includes;c:\smarty3\libs"

 その他フォルダを作成します。
 htdocs + sample
      ├ libs ← ダウンロードしたsmartyのlibs
      ├ templates ← 空のフォルダを作成
      ├ templates_c ← 空のフォルダを作成
      ├ cache ← 空のフォルダを作成
      └ configs ← 空のフォルダを作成

2 sampleアプリケーション作成

 sampleフォルダにテンプレートとプログラムを作成します。

sample.tpl
<html>
<head>
<title>Smarty Test</title>
</head>
<body>

<h1>{$msg}</h2>

</body>
</html>
sample.php
<?php
require_once('Smarty.class.php');

$smarty = new Smarty();

$smarty->template_dir = dirname(__FILE__).'/templates';
$smarty->compile_dir  = dirname(__FILE__).'/templates_c';
$smarty->config_dir   = dirname(__FILE__).'/configs';
$smarty->cache_dir    = dirname(__FILE__).'/cache';

$smarty->assign('msg','Hello World!');
$smarty->display('sample.tpl');

?>

3 設定ファイルを使う(Smarty3)

 プログラムから設定ファイルを読み込んでみます。
 まずは、configs/sample.confを作り定義します。

sample.conf
# global
url = "www.hoge.com"
title = "Smarty"

[mysql]
DSN = "mysql:dbname=sample_db; host=localhost; charset=utf8"
USER = "user1"
PASS = "user1pass"

 そして、呼出側しは

sample.php
 :
//設定ファイル読込み
$smarty->configLoad('sample.conf');
//取得
$url = $smarty->getConfigVars('url');
//テスト表示
echo "url = ".$url."<br />";

//設定ファイル読込み(セクション)
$smarty->configLoad('sample.conf', 'mysql');
//取得
$dsn = $smarty->getConfigVars('DSN');
//テスト表示
echo "dsn = ".$dsn."<br />";

$smarty->display('sample.tpl');

4 DBからの一覧表示(PDO)

 DBのm_syainテーブルを全件取得し一覧表示してましょう。
 まずは、DBまわり用のクラス

CDbAccess.php
<?php

class DbAccess {
    private $pdo;

    /**
    * コンストラクタ

    * @param $smarty smartyオブジェクト
    */
    public function __construct($smarty){
        try {
            //configs/sample.confより設定取得
            $smarty->configLoad('sample.conf', 'mysql');
            $dsn = $smarty->getConfigVars('DSN');
            $user = $smarty->getConfigVars('USER');
            $pass = $smarty->getConfigVars('PASS');

            //PDOインスタンス生成
            $this->pdo = new PDO($dsn, $user, $pass);
            //接続語にオプション指定
            //(エラー発生時に例外をスローする指定)
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }

        catch(PDOException $Exception) {
            self::abort('エラー:' . $Exception->getMessage());
        }
    }

    /**
    * クローズ処理
    */
    public function close(){
        try {
            $this->pdo = null;
        }

        catch(PDOException $Exception) {
            //エラーは無視
        }
    }

    /**
    * テーブルデータ取得
    * 
    * @return テーブルデータ一覧
    */
    public function get_list(){
        try {
            //m_syainテーブルより全件取得
            $sql = "select * from m_syain where del_flg <> :delflg";
            $stt = $this->pdo->prepare($sql);
            $stt->execute(array(':delflg'=>'1'));
            //$sql = "select * from m_syain where del_flg <> ?";
            //$stt = $this->pdo->prepare($sql);
            //$stt->execute(array('1'));

            if ($list = $stt->fetchAll(PDO::FETCH_ASSOC) ){
                return $list;
            }
        }

        catch(PDOException $Exception) {
            self::abort('エラー:' . $Exception->getMessage());
        }
    }

    /**
    * フィールド名一覧取得
    * 
    * @return フィールド名一覧
    */
    public function get_keys(){
        try {
            $sql = 'show columns from m_syain';
            $stt = $this->pdo->prepare($sql);
            $stt->execute();

            while ($column = $stt->fetch(PDO::FETCH_ASSOC) ){
                $keys[] = $column['Field'];
            }
        }

        catch(PDOException $Exception) {
            self::abort('エラー:' . $Exception->getMessage());
        }
        finally {
            return $keys;
        }
    }

    /**
    * die()文字化け対策
    */
    private function abort($status=0) {
        if (is_string($status) && !headers_sent()) {
            //ヘッダにcharset追加
            header('Content-Type: text/plain; charset=UTF-8');
        }
        die($status);
    }
}

 呼出し側は

CDbAccess.php
<?php
 :
require_once ("CDbAccess.php");
 :
$smarty = new Smarty();
 :
$testdb = new DbAccess($smarty);
$keys = $testdb->get_keys();
$list = $testdb->get_list();
$values = [
       'title' => 'test',
       'head' => 'テスト',
       'keys' => $keys,
       'list' => $list
];

$smarty->assign ('values', $values);

//データベース接続終了
$testdb->close();
 :
$smarty->display('sample.tpl');
?>

 あとテンプレートは

template/sample.tpl
 :
    <h4>{$values.head}</h4>
    <table border=1 >
        {foreach $values.keys as $key}<th>{$key}</th>{/foreach}
        {foreach $values.list as $row}
            <tr>{foreach $row as $val}<td>{$val}</td>{/foreach}</tr>
        {/foreach}
    </table>
 :

5 エラー情報出力

 とりあえずphpファイルの先頭に以下の2行を入れる。

sample.php
<?php
ini_set('display_errors',1);        //1:エラー表示、0:非表示
error_reporting(E_ALL);         //エラー表示レベル(E_ALL & ~E_NOTICE等々指定)
 :

6 デバッグ

<?php
:
//デバッグコンソールを出す
$smarty->debugging = true;
:
//var_dumpで出力
var_dump($変数);
:
suz___
広く浅く
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした