テンプレートエンジンの必要性 昔 (2000 年ごろ?) の典型的な PHP のコード : <?php // 処理?> <html> <body> <?php print("hello World!");?> </body> </html> 以下のような問題で衝突していた 1 一旦プログラムコードを

Similar documents
1.MVC モデル MVC モデルとは Model View Controller ( モデル ビュー コントローラ ) を意味します これは 中 ~ 大規模システムを開発する場合に 処理の中核を担う Model 表示 出力を司る View 入力を受け取ってその内容に応じて View と Model

情報システム設計論II ユーザインタフェース(1)

JavaScript 演習 2 1

◎phpapi.indd

Microsoft Word - wpphpmysql.doc

フローチャート自動生成ツール yflowgen の使い方 目次 1 はじめに 本ツールの機能 yflowgen.exe の使い方 yflowgen.exe の実行方法 制限事項 生成したファイル (gml ファイル形式 ) の開

PowerPoint プレゼンテーション

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

CodeIgniter とは? アメリカ EllisLab 社が開発配布しているオープンソースの PHP フレームワーク 2006 年 2 月リリース

Web データ管理 JavaScript (1) (4 章 ) 2011/12/7( 水 ) 湘南工科大学講義資料 Web データ管理 (2011) 阿倍 1/21

スライド 1

Si 知識情報処理

デジタル表現論・第6回

WEBシステムのセキュリティ技術

NetworkApplication-09

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

Microsoft PowerPoint - ruby_instruction.ppt

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

PowerPoint プレゼンテーション

レコードとオブジェクト

プログラミング実習I

Microsoft Word 基_シラバス.doc

CodeGear Developer Camp

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

JavaScript演習

PowerPoint プレゼンテーション

2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを

Microsoft Word - no06.doc

Webデザイン論

【アフィリコードプラス】ショッピングカート連携マニュアル

Java講座

10th Developer Camp - B5

テキストファイルの入出力1

memo

storage-sdk-Java

PowerPoint プレゼンテーション

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Sinatra と MongoDB 今回は Sinatra で MongoDB の操作を体験してみます 進捗に合わせて ドライバから Ruby で使える便利な ORM の紹介をします

Microsoft PowerPoint - widget.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt

CodeIgniter Con 2011, Tokyo Japan, February

Rational Roseモデルの移行 マニュアル

ゲームプログラミング講習 第0章 導入

演算増幅器

24th Embarcadero Developer Camp

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

ポインタ変数

intra-mart Accel Platform

print/echo を使います print "Hello World!"; echo "Hello World!"; デバッグには var_dump() をよく使います var_dump() では変数の内容が出力されます $array = array(1,2,3)

Prog1_10th

第21章 表計算

wireshark dissector with lua

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

V8.1新規機能紹介記事

Microsoft Word - VBA基礎(6).docx

PowerPoint プレゼンテーション

ポインタ変数

slide5.pptx

Microsoft Word - Mac版 Eclipseの導入と設定.docx

GEC-Java

PowerPoint プレゼンテーション

1 目次 1 目次 はじめに Tips セットアップ 事前準備 事前準備 セットアップ セットアップ ( その他 ) Tips 概要 概要 処理フ

TALON Tips < 親子関係のある構成データを TALON で表示する > 株式会社 HOIPOI 第 1.1 版 p. 1

XAMPP で CMS のお手軽 テスト環境を手に入れよう 2011/5/21 上村崇 1

Microsoft PowerPoint - prog03.ppt

サーバサイドスクリプトPHPを実感しよう

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

Microsoft PowerPoint - 10Com2.ppt

本チュートリアルについて 14 部構成 比較的簡単なトピックから 各回 プログラミング言語 任意 チュートリアルで 新しい内容 宿題 プログラミング演習 次の週 結果について発表 もしくは話し合いをする スライドは Python で Python, C++, Java, Perl についての質問い答

APIリファレンス | IP Geolocation API どこどこJP

目次 更新履歴... 1 ファイル構成... 3 main.js( エクステンションのパネル側 ) の処理... 4 hostscript.jsx の関数の呼び出し... 4 evalscript() のコールバック関数... 5 hostscript.jsx(illustrator 側 ) の処理

Microsoft PowerPoint pptx

目次 1. 研究の背景と目的 1.1. 背景 1.2. 目的 2. 研究計画 3. 現状報告 3.1. 制作中の Web アプリケーション 使用する技術 概要 機能 課題 参考にしたサイト 書籍 3.2. その他の取り組み 4.

実行形式の作成と構成管理 2012 年 7 月 8 日 海谷治彦 1

SmallTown 日付オブジェクト 日付オブジェクトを使ってページ内にいろいろな仕掛けをつくってみよう 1. 日付オブジェクトとは JavaScriptではいろいろなオブジェクトを扱えますが 日付オブジェクトもその一つです 手順としては 1 日付オブジェクトを作成する2そのオブジェクトから日にちや

S2Pradoの紹介

<td width=99%><input type="file" size="80" name="file"></td> <td width=1% nowrap align=right valign=top> 削除キー : </td> <td width=99%><input type="passw

1

プログラミング基礎I(再)

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

8 / 0 1 i++ i 1 i-- i C !!! C 2

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

Microsoft PowerPoint ppt

第5回 マインクラフト・プログラミング入門

ウェブデザイン技能検定 1 級実技 平成 28 年度 第 4 回 ウェブデザイン技能検定 1 級 実技試験概要 試験にあたっての注意事項 試験者は本試験の留意事項 注意事項に留意して作業を行うこと ペーパー実技試験は 課題 1 から 5 までの 5 課題を 60 分間で行うこと 作業実技試験は 課題

XMLとXSLT

Boost.Preprocessor でプログラミングしましょう DigitalGhost

サイボウズ Office 7 デザインギャラリーマニュアル

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

Microsoft Word - Training10_プリプロセッサ.docx

SmartBrowser_document_build30_update.pptx

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

PowerPoint プレゼンテーション

4-4- 基スクリプト言語に関する知識 コードの作成や修正が容易とされるスクリプト言語を学習し アプリケーション開発の手法を習得する 本カリキュラムでは まずスクリプト言語に位置づけされる Perl PHP Python JavaScript Ruby といった Ⅰ. 概要プログラミング言語の特徴に

Microsoft PowerPoint - adi05.ppt [互換モード]

Transcription:

デザイナーとプログラマーの共通言語 Smarty の導入と活用 <masahiro@asial.co.jp>

テンプレートエンジンの必要性 昔 (2000 年ごろ?) の典型的な PHP のコード : <?php // 処理?> <html> <body> <?php print("hello World!");?> </body> </html> 以下のような問題で衝突していた 1 一旦プログラムコードを埋め込んでしまうと デザイナーが HTML を修正できなくなる 2 プログラマーとデザイナーが同時に 1 つのファイルを修正して 衝突してします 3 デザインの見栄えを修正したくても プログラマーにお願いしないといけない

PHP をテンプレートエンジンにする 古典的ですが 今でもよく用いられます デザインとプログラムの分離は出来ていますし 速度も速いというメリットがあります ただし テンプレートエンジンと呼べるかは微妙です hoge.php <?php // プログラムコード require("hoge_template.php");?> hoge_template.php <?php // テンプレートコード?> <html> <body> <?=$var?> </body> </html>

PHP をテンプレートとして使うために PHP をテンプレートとして使うためには 以下の構文が便利です 変数を表示する <?=$var?> if 構文の別の書き方 <? if($aaa)?> true 時の処理 <? else;?> その他の処理 <? endif;?> for 構文の別の書き方 <? for ($i = 0; $i < 10; $i++):?> これは <?=$i?> 番目の処理です <? endfor;?> foreach 構文の別の書き方 <? foreach ($array as $key => $value):?> キー :<?=$key?> 値 :<?=$value?> <? endforeach;?>

テンプレートエンジンが生まれた背景 それでも デザイナーにとって コードが読みづらい ショートタグを使うのは 望ましくない 文書をフォーマットする という意味では使いづらい もう少し テンプレートを読み込んで処理する ことに主眼をおいたライブラリがあると良いのでは?

テンプレートエンジン登場 そこで テンプレートエンジンを使うと 以下のようなコードに変わります (Smarty の例 ) スクリプト側 (hoge.php) <?php require("common.php"); require("/path/to/libs/smarty.class.php"); $smarty = new Smarty(); $smarty->assign("var1", "Hello World"); $smarty->display("hoge.html");?> テンプレート側 (hoge.html) <html> <body> {$var1} </body> </html>

テンプレートを使った場合の作業フロー 開発時 共同作業 デザイナー デザイン作成 タグ打ち 完成 プログラマー ロジック作成 テンプレート埋め込み 修正時 デザイナー 修正依頼 テンプレート修正 完了 プログラマー ロジック修正

なぜ Smarty? 同じような動作をするテンプレートエンジンは数多くありますが 今回は Smarty に焦点を当てます 1 Smarty を使った事例が多い ( 一番メジャー 開発歴も長い ) 2 そこそこ良くできている ( ただしハマる所は知っておく必要あり ) 3 日本語のドキュメントが多い ( 日本語マニュアル 書籍も出ている )

テンプレートエンジンを使うメリット ビューを分離できる HTML コードとも見やすくなる( はず ) 便利機能がある

使わないメリット やっぱり遅くなる 最初のセットアップが大変 コンパイルキャッシュ周りの知識が必要

特徴的な機能 単にビューを分離するだけではなく いろいろな機能を持っています 関数 修飾子 キャッシュ ブロック カスタマイズ コンパイルキャッシュ 等々

Smarty の動作の仕組み 初回読み込み時 テンプレートファイル PHP ファイル内 次回以降 PHP ファイル内 読み込み パースコンパイル 保存 コンパイルキャッシュファイル 読み込み 出力 出力

Smarty のセットアップ 1. Smarty 本体をダウンロード (http://smarty.php.net) 2. ディレクトリに展開 3. templates ディレクトリ templates c ディレクトリを作成 ( デフォルトはスクリプトと同階層 ) 4. templates c ディレクトリに Apache から書き込める権限を付与 5. require ("/path/to/lib/smarty.class.php"); 6. $smarty = new Smarty(); で Smarty オブジェクトを作成 Smarty を使うためのコード <?php require("/path/to/libs/smarty.class.php"); $smarty = new Smarty(); $smarty->assign("var1", "Hello World"); $smarty->display("hoge.html");?>

Smarty の使い方 1 インスタンス作成 2 変数のアサイン 3 出力 or 取得 PHP 側 (hoge.php) <?php $scalar = "Hello World"; $array = array ("a" => "A", "b" => "B"); require("libs/smarty.class.php"); $smarty = new Smarty(); $smarty->assign("scalar", $scalar); $smarty->assign("array", $array); $smarty->display("hoge.html");?> テンプレート側 (templates/hoge.html) 変数を表示する場合 :{$scalar} 配列を表示する場合 :{$array.a} {$array.b}

Smarty の設定 $smarty オブジェクトのプロパティを修正して 各種設定ができる 設定の例 : // デバッグコンソールを出す ({debug} 関数でも可能 ) $smarty->debugging = true; // 各必須ディレクトリの場所の変更 $smarty->template_dir = "/path/to/template_dir"; $smarty->compile_dir = "/path/to/compile_dir"; // デリミタの変更 $smarty->left_delimiter = "{{"; $smarty->right_delimiter = "}}"; // コンパイルを強制する $smarty->force_compile = true;

Smarty 関数の使い方 PHP の関数とは別に Smarty 上で関数が利用できる これにより ビュー特有の処理を関数でまとめることができる 他のファイルを読み込む場合 : {include file=" ファイル名 "} foreach を使う場合 : {foreach from=$array key=key item=item} キー :{$key} 値 :{$item} {/foreach} そのほかにも いくつかの関数がデフォルトで用意されている また 自作で関数を作ることも可能

Smarty 修飾子 (modifier) の使い方 関数をより簡単にした形 Linux でいうパイプの役割をして 表現するデータに合わせて表示形式を変更できる 数値をフォーマットする場合 : {$value number_format} HTML エスケープを行う場合 (XSS 対策 ): {$value escape} また修飾子は重ねることが可能 : {$value escape nl2br} 引数を渡すことも可能 : {$value strip_tags substr:3}

自作関数の利用 関数 修飾子はカスタムで作ることができます 作り方には 2 通りあります プラグインに保存する場合 : 1 プラグイン用ディレクトリを作成し そのディレクトリを plugins dir として指定する $smarty->plugins_dir = array("plugins", "my_plugins"); 2 smarty function 関数名とした関数作成し smarty.function. 関数名という名称でプラグイン用ディレクトリに保存する <?php function smarty_function_imagetag ($params, &$smarty) { $filename = $params["filename"]; list($width, $height, $type, $attr) = getimagesize($filename); return "<img src= "$filename " $attr />"; }?> 3 関数を使う {imagetag filename="image.png"}

キャッシュ 初回読み込み時 PHP ファイル内 テンプレートファイル 読み込み 出力 次回以降 PHP ファイル内 保存 キャッシュ 読み込み 出力 キャッシュ機能を有効にする $smarty->caching = true;

Tips 1 クロスサイトスクリプティング脆弱性を強化する assign メソッドを改良し デフォルトで HTML エスケープされた状態で assign する class MySmarty extends Smarty { function assign($varname, $value) { $parent->assign($varname, htmlspecialchars($value, ENT_QUOTES)); } } $smarty = new MySmarty(); 2 テンプレート変数を連想配列で 1 つにまとめる assign メソッドを必要回数分記述するよりは $template var 等の変数に連想配列形式でテンプレート変数を割り当てると便利 $template_var["var1"] = "Hello World"; $template_var["var2"] = "hogehoge"; $smarty->assign($template_var);

SmartyDWT http://smartydwt.klitsche.org/ Dreamweaver から Smarty を簡単に操作するためのプラグイン

Template Lite(http://templatelite.sourceforge.net/) 以前 Smarty Light と呼ばれていたテンプレートエンジンを引き継ぐ形で 別の作者によって公開されているもの Smarty とほぼ同等の機能を備えている上 for や switch 関数などが追加されている

Simplate(http://simplate.aimy.jp/) Smarty の機能を PHP エクステンションの形で実現したもの 必要最低限の機能しか有していないが とても高速に動作する 変数のアサイン デリミタの変更 Smarty Simplate 関数 {function var=val} 形式 { 関数名 ($var)} 形式 修飾子 ループ処理 section,foreach section,foreach キャッシュ ( キャッシュ ID 対応 ) ( 出力の保存のみ ) 動作速度

ベンチマーク対決 Smarty Simplate TemplateLite で どの程度速度が異なるのか?PHP 5.1.4 で計測 PHP 側 (hoge.php) <?php $scalar = "Hello World"; $array = array ("a" => "A", "b" => "B", "c" => "C"); $smarty->assign("scalar", $scalar); $smarty->assign("array", $array); $smarty->display("hoge.html");?> テンプレート側 (templates/hoge.html) スカラー値 :{$scalar}<br> 配列 :{$array.a} {$array.b} {$array.c} <ul> {foreach from=$array item=a key=k} <li> キー :{$k} 値 :{$a}</li> {/foreach} </ul>

計測結果 ab n 1000 c 10 or 20 http://url 圧倒的にSimplateが高速 これは SimplateがPHPエクステンションとして動作するため 処理速度が速く また機能実装もシンプルであることが大きな要因だと思います

ご清聴 誠にありがとうございました