Category Archives: Smarty - Page 2

Smartyで数値を3桁毎にカンマで区切るには。

Smartyで通貨などの数値を出力する時に、

1,234,567

などとカンマをつけて出力したい時に一番簡単な方法は、PHPのnumber_format関数を使うことです。
SmartyはPHPの関数をそのまま修飾子に使えますので、
[smarty]
{$num|number_format}
[/smarty]
これでOKです!

Smarty初心者に最適な解説ページ

Smarty初心者に最適なIBMのPHP アプリケーションの表示形式と機能を Smarty で分離する。Smartyって何が便利なの? Smartyってどう使えばいいの? という方にオススメの記事です。

SmartyでPHPの定数を出力するには。

Smartyマニュアル を紐解くと、

{$smarty.const}

PHP 定数の値に直接アクセスできます。smarty 定数 も参照してください。

// php で定義されている定数
define('MY_CONST_VAL','CHERRIES');
?>

定数を出力するテンプレート

{$smarty.const.MY_CONST_VAL}

とあります。メモメモっと。

Smartyでオブジェクト変数を埋め込むには。

今まで、こんなこと言ってましたが、マニュアル見たらやり方が普通に書いてありました。

その他の文字、たとえば .(ピリオド)や $object>reference(オブジェクト参照)を含む場合は、 その変数を `バッククォート` で囲む必要があります。

というわけで、“で囲んでしまえばバッチリです。例えばpopupの中にオブジェクトを入れるには、

[smarty]
sticky=true
caption="PHP-SeeD"
text="`$obj->description`”
snapx=10
snapy=10}>PHP-SeeD

[/smarty]

こんな感じですね。

Smartyならとても簡単にポップアップが出せる

世に色々なJavascriptツールチップライブラリがありますが、Smartyを使っている方ならとても簡単にポップアップが出せちゃいます。
とはいいつつも、Javascriptライブラリを使用するんですケド。

overLIB

上記のoverLIBを使用します。

ポップアップを使いたいSmartyテンプレートで
[smarty]
{popup_init src=”/scripts/overlib.js”}
[/smarty]
overlib.jsを呼び出して、

使いたいHTMLタグに付ける属性のような感じで{popup text=”"}を記入します。

[smarty]
this
[/smarty]

これなら気軽にポップアップを使用できますね。

とっても簡単なのでさくっと出来たサンプルを置いておきます。

[smarty]
this

sticky=true
caption="PHP-SeeD"
text="


snapx=10
snapy=10}>PHP-SeeD
[/smarty]

Smartyマニュアルにデザインの変え方など詳しい情報が載っていますのでより詳しく知りたい方はそちらをどうぞ。

Zend Framework 1.0でSmarty追記

Zend Framework 1.0でSmartyを使用する

Smarty用のView_Helperですが、getScriptPathsがArrayを返すようにしないと、エラーが出てしまいますね。

[php]
/**
* 現在のテンプレートディレクトリを取得します
*
* @return string
*/
public function getScriptPaths()
{
return $this->_smarty->template_dir;
}
[/php]

これを、

[php]
/**
* 現在のテンプレートディレクトリを取得します
*
* @return array
*/
public function getScriptPaths()
{
return array($this->_smarty->template_dir);
}
[/php]

Arrayを返すように変更しておきましょう。

ソースを追ってみると、Zend_Controller_Action_Helper_ViewRendererのinit_view()メソッドで、getScriptPaths()を呼び出してます。
[php]
// Determine if this path has already been registered
$currentPaths = $this->view->getScriptPaths();
$path = str_replace(array(‘/’, ‘\\’), DIRECTORY_SEPARATOR, $path);
$pathExists = false;
foreach ($currentPaths as $tmpPath) {
if (strstr($tmpPath, $path)) {
$pathExists = true;
break;
}
}
if (!$pathExists) {
$this->view->addBasePath($path, $prefix);
}

[/php]

foreachに使うのでArrayじゃないと駄目みたいです。まあメソッド名が、getScriptPathsですし。Zend Frameworkでは、templateディレクトリを配列で複数管理することができるのですね。

Zend Framework 1.0でSmartyを使用する

もちろん使用する、というのはView_Helperとして。楽ちんですからね。2007/07/20の最新バージョンである1.0.0で動作を確認しています。
Smarty用のZendViewはマニュアルに載っています。

別のテンプレートシステムの使用

これを保存して、
(ドキュメント上ではZend_View_Smartyとなっていますが、
 Common_View_Smartyと変更しています)
起動ファイルで
[php]
require_once ‘Common/View/Smarty.php’;
require_once ‘Zend/Controller/Action/Helper/ViewRenderer.php’;
require_once ‘Zend/Controller/Action/HelperBroker.php’;

$extraParams = array(
‘compile_dir’ => APPLICATION_PATH. ‘/views/templates_c’,
/* 他色々なSmartyオプション */
);
$view = new Common_View_Smarty(null, $extraParams);
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
$viewRenderer->setViewBasePathSpec(APPLICATION_PATH . ‘/views/templates’)
->setViewScriptPathSpec(‘:controller/:action.:suffix’)
->setViewScriptPathNoControllerSpec(‘:action.:suffix’)
->setViewSuffix(‘tpl’);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

[/php]

としてやれば、ViewHelperとして動作します。
#上記APPLICATION_PATH . ‘/views/templates’はお使いのtemplate階層に合わせてください。

追記しました

Smartyでオブジェクトを操る時の問題解決>プロパティを配列の添え字に使用できない?

表題の通りなのですが、Smartyでオブジェクトのプロパティを配列の添え字に使用できません。
#実は私がやり方を知らないだけ、という可能性は多分にありますが。

どういうことかと言うと、
[smarty]
{foreach from=$list item=val}
{$hogeList[$val->id]->name|escape}
{/foreach}
[/smarty]
というようにオブジェクト($val)のプロパティ($val->id)を添え字に使用するとエラーが出てしまいます。
このような場合は
 [smarty]
{foreach from=$list item=val}
{assign var=”id” value=$val->id}
{$hogeList[$id]->name|escape}
{/foreach}
[/smarty]
とすると、問題無く動作します。何かあったらAssignしてやれ、という感じで使っていますが、どうなのですかね。。

Smartyでfor文のようなもの。

PHP構文ライクにSmartyでもfor文を使いたくなりますよね。

最近は
[code]
{section name=cnt start=0 loop=10}{assign var="i" value=$smarty.section.cnt.index}

{/section}[/code]
のような感じで使っています。カウンタを$iにassignすることで視覚的にも分かりやすくなると思います。処理的には無駄ですが、可読性は大事ということで。

#コードのハイライトで使っているiG:SyntaxHiliterがSmartyのassignを上手く処理できない?んですよね。
[smarty]
{assign var=”i” value=1}
[/smarty]

参考URL

Smartyでサブルーチンのようなものは出来ないのか。

Smartyで表示の為の条件判定が多岐にわたってくると、HTML部分から判定処理を抜き出したくなってしまいます。
可読性が悪くなりますからね。
と思って、Smartyの処理をサブルーチン化できないかなと、色々調べてみたのですが、出来ないっぽい・・?ですか?

まあ、テンプレートなのだから呼ぶ側で処理するのが正しいんですケド。

とりあえず簡単な条件判定ぐらいなら
[smarty]
{capture name=”hoge_value”}
{if isset($hoge)}
value=”{$hoge}”
{/if}
{/capture}

[/smarty]
というような感じで外に出せますね。PHP側で
[php]
$hoge_value = ‘value=”‘ . $hoge . ‘”‘;
[/php]
しろって声が画面の向こうから聞こえてきそうではあります。
{php}{/php}ならいくらでも自由にできそうですが、テンプレートにそこまで処理させるのは躊躇してしまう私です。