Posts tagged Smarty
PHP を勉強するのにオススメ書籍の10冊
1これから PHP を覚える人、もっと技術を向上させたい人にオススメの本を10冊ピックアップしてみました。
逆にこれはオススメ!という本があればコメントで教えてください。
順番はとくにオススメの順ではありません。気になったところから読んでみるのがよいかと思います。
(続きを読む…)
Smarty で正規表現を if 文で使用する
2Smarty には正規表現を使用して文字列を置換する regex_replace があります。
これを上手に使用して if 文で正規表現を用いて条件分岐させます。
if (preg_match('/php/i', 'PHP is the web scripting language of choice.')) { echo 'A match was found.'; } else { echo 'A match was not found.'; }
PHP で上記のような処理を Smarty で書くと下記のようになります。
{assign var='string' value='PHP is the web scripting language of choice.'} {if $string|regex_replace:'/.*php.*/i':'php' eq 'php'} A match was found. {else} A match was not found. {/if}
ポイントは regex_replace を用いて、正規表現のパターンに該当する場合は元の文字列を何かしらの文字列(上の例でいうと’php’)に置換してしまい、それを eq で置換されているか判定するということです。
これを実際に使用したのは OpenPNE のテンプレートです。
OpenPNE を使用していて、特定のカテゴリのときのみ読み込む CSS を変えたいときがありました。
OpnePNE のイベント関連の URL は http://expamle.com/?m=pc&a=page_c_event_*** という感じになります。
全部で14種類ありますので、これを普通に if 文で書いていると大変なことになりますし、追加などがあったときのことを考えるとよくありません。
そこで Smarty の if 文に正規表現を使用して下記のようにすることにより1つの条件で page_c_event_*** の URL を条件分岐させました。
Smarty テンプレート
{if $smarty.get.a|regex_replace:"/page_c_event.*_/":"event" eq "event"} {** イベントです**} {else} {** イベント以外です **} {/if}
Smarty 今日の日付で曜日を漢字で出力する
2Smarty を使用していてよく今日の日付の曜日を漢字で出力するのでメモ。
{$smarty.now|date_format:"%Y年%m月%d日(%a) %T"|replace:"Sun":"日"|replace:"Mon":"月"|replace:"Tue":"火"|replace:"Wed":"水"|replace:"Thu":"木"|replace:"Fri":"金"|replace:"Sat":"土"}
とやると
2007年10月03日(水)17:42:10
のように表示できる。
OpenPNEでのSmarty の覚書
1「OpenPNE PHP で作成したプログラムを組み込む」で書いたように、
/openpne/webapp_ext/modules/pc/page/hoge_foo.php に
class pc_page_hoge_foo extends OpenPNE_Action { function execute($requests) { // ここに処理を書く } }
のようにすると ?m=pc&a=page_hoge_foo でアクセスできるようになります。
このときにどうやって Smarty に値を渡すのか少し戸惑ったのでメモしておきます。
Smarty タグ
通常は 「{」「}」 ですが、OpenPNE では 「({」「})」 です。
assign
$smarty->assign("var", $var);
のようにして Smarty に値を渡したいときは execute メソッド内で
$this->view->set("var", $var);
とすればOK。
display
$smarty->display("hoge_foo.tpl");
は自動的にやってくれます。
default_modifiers (escape)
また、OpenPNE の smarty オブジェクトはオブジェクト生成時に
$smarty->default_modifiers に escpae 修飾子が設定されているので、
テンプレート変数に HTML タグが設定されていて HTMLタグを出力したい場合は
({$var|smarty:nodefaults})
とすれば、escape 処理されずに出力されます。
私は HTML_QuickForm をよく使うので、form タグ関係を出したいことがありますので、その場合に使用しています。
OpenPNE 画像の保存、表示方法
2OpenPNE で写真のアップロード機能を作成していて調べたことをまとめておきます。
画像を保存するテーブル c_image
OpenPNE では画像をDB に保存しています。保存するテーブル名は c_image です。
このテーブルにはプロフィール写真や日記の写真、スキンの画像などが保存されるようです。
CREATE TABLE c_image ( c_image_id int(11) NOT NULL auto_increment, filename text NOT NULL, bin longblob NOT NULL, r_datetime datetime NOT NULL default '0000-00-00 00:00:00', `type` text, PRIMARY KEY (c_image_id), KEY filename (filename(100)) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- filename
- 画像のファイル名、任意につけていいみたいですが、プロフィール写真だと
m_2_1188204858.jpg
という感じです。
最初の 「m 」はたぶんプロフィール写真を表す文字、
次の「2」はプロフィール写真のNo(2番目にアップした写真)
次の10桁の数字は多分 time() 関数で取得したアップロードした時間 - bin
- base64_encode した画像ファイルのバイナリデータ
- type
- 画像のタイプ( jpg | gif | png )
- r_datetime
- 登録日時
表示方法
c_image テーブルに格納した画像を表示するHTML
<img src="/img.php?filename=m_2_1188204858.jpg&w=180&h=180&m=pc">
Smarty のタグで書くと
<img src="({t_img_url filename=$pet.image1 w=180 h=180})">
filename に c_image.filename を指定して、
w, h に幅と高さの最大値を指定する。
幅と高さは最大値を超えると自動的にリサイズする。
その他
c_image に画像を保存しておくと管理画面からアップロードされた写真をすべて管理することができるので、SNS を運営する上で便利だと思います。
OpenPNE テンプレートのカスタマイズ
2OpenPNE は Smarty を使用していますが、そのテンプレートを修正したい場合、直接オリジナルのテンプレートを編集するのではなくカスタマイズ用のテンプレートを作成して修正することができます。
ディレクトリは下記になります。
オリジナルのテンプレート
/openpne/webapp/modules/pc/templates/
カスタマイズ用のテンプレート
/openpne/webapp_ext/modules/pc/templates/
/openpne/webapp_ext/modules/pc/templates/ ディレクトリは最初からはないので作成します。
次にカスタマイズしたいテンプレートをオリジナルのテンプレートディレクトリからカスタマイズ用のディレクトリにコピーします。
次に /openpne/config.php の
define('USE_EXT_DIR', false);
を
define('USE_EXT_DIR', true)
に変更すれば、カスタマイズ用ディレクトリにテンプレートが存在すればそちらを優先して使用されます。
カスタマイズ失敗してもカスタマイズ用のテンプレートを削除すればオリジナルのテンプレートが使用されますので、便利ですね。
この /openpne/webapp_ext/ ディレクトリはテンプレート以外でも webapp ディレクトリのファイルを上書きできます。
Smarty truncate のマルチバイト対応 mb_truncate
2Smarty のマルチバイトプラグインの紹介の続きです。
truncate というプラグインが Smarty に標準であります。
文字列を指定文字数で切るというものです。
ただ、マルチバイトには対応していないため最後の切られた文字が文字化けしてしまうことがあります。
その truncate プラグインをマルチバイト対応したものが下記のページで紹介されている mb_truncate プラグインです。
このプラグインは以前からかなり重宝しています。
文字化けしたり、切り捨てられる文字数がおかしい場合は mb_internal_encoding で内部文字コードを指定してあげれば直ると思います。
もともとの配布元のページが見れないので、下記のページよりダウンロードできます。
kawama.jp: [Smarty]mb_truncate
Smarty のマルチバイト対応
0マルチバイトの文字列を指定行数で強制改行する仕様があって、wordwrap 関数をマルチバイト化してさらに Smarty のプラグインを作ろうと思っていたらありました。
Smarty のマルチバイト対応
Artisan Version管理システム
マルチバイト処理に弱いとされる、Smartyをマルチバイト対応とし、よりアプリケーション内で役立てることができるよう、オリジナルの関数や、関数に改造を行っています。
CakePHP で Smarty を使用するメモ
3Smarty を CakePHP で使用する方法を調べたメモ
Smarty の用意
Smarty ディレクトリを/vendors ディレクトリへコピー
/vendors/smarty/Smarty.class.php
のようになる。
Smarty が使用するディレクトリを作成
/app/tmp/smarty/cache/ /app/tmp/smarty/compile/
Smarty 用の View クラスの準備
レンダリングを任せる Smarty View Class を設定します。
Smarty View Class をダウンロードして smarty.php とリネームして
/app/views/
に配置する。
smarty という名前のサブディレクトリを使用しないなら
$this->subDir = 'smarty'.DS;
をコメントアウトする。
また、
$this->Smarty->assign_by_ref('view', $this);
を
$this->Smarty->assign_by_ref('this', $this);
に変更する。
この変更はテンプレートの中で $this を .thtml と同じように使用したい場合に必要。
AppController の設定
/app/app_controller.php
を作成
class Appcontroller extends Controller{ var $view = "Smarty"; }
実際の使用
view に .tpl があれば Smarty テンプレートとして処理を行い、なければデフォルトの .thtml を表示するようになる。
.tpl の中では .thtml で使用できるヘルパーも使用できる。
.thtml の「<?php echo」を「{」、「;?>」を「}」にすればほぼそのまま利用できる。
ただ、.thtml で HTMLヘルパーを使用している場合
{$html->input('Post/name', array('size'=>'30'))}
のままでは、array(…) でエラーになる。
これを修正するには、Smarty のプラグインを使用して解決する。
プラグインをダウンロードして function.assign_assoc.php にリネームして
/vendors/samrty/libs/plugins/
に配置する。
テンプレートの先頭で
{assign_assoc var='ArrayName' value='size=>30'}
などとして
{$html->input('Post/name', $ArrayName)}
とすればOK.
ただ結構最後のやつが面倒かも。。。