Monthly Archives: 7月 2007 - Page 2

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階層に合わせてください。

追記しました

PHP Variable Tests

Variableのいわゆるチートシートですね。

PHP Variable Tests

動作が思い出せない時にテストを走らせるよりも早い!です。

Zend Frameworkや他のPHPフレームワークのベンチ

私が愛用?しているZend Frameworkや、その他のPHPフレームワーク Symfony、CakePHP、CodeIgniter、PHP on TRAXのベンチーマークをとって比較をされています。

徒然なるままにBlog

Zend Framework 16.7 Request/Sec
Symfony 10.7 Request/Sec
CakePHP 10.4 Request/Sec
CodeIgniter 33.2 Request/Sec
PHP on TRAX 7.8 Request/Sec
(参考)フレームワーク無し 586.1 Request/Sec

この結果を見るに、ZendFrameworkは中々に優秀みたいですね。良くも悪くもシンプルなのが結果に繋がった感じです。しかし、フレームワーク無しの早いことw
楽をするためにフレームワークを使い、負荷が高い所が出てきたらフレームワークを介さない処理を作成する、というのが良い開発手法でしょうか。

WordPressを極めるならこのサイト

というわけで、WordPressを導入するにあたって色々と参考にさせていただきました。

http://bono.s201.xrea.com/wordpress/

逆引リストはとてもお役立ちです!

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してやれ、という感じで使っていますが、どうなのですかね。。

コードhilightのためのpluginはiG:SyntaxHiliter

コードをハイライトするPluginは色々あると思いますが、Smartyにも対応しているということで、
iG:SyntaxHiliterを導入しました。
ただ、Vicuna.Extと相性が悪いのかコード表示が怪しいことになってしまいましたので、テーマはEasyAllに戻し、コツコツとカスタマイズしていこうと思います。

大変満足度の高いiG:SyntaxHiliterなのですが、smarty表示時に
{assign}
が、
[smarty]
{assign}
[/smarty]
となってしまうんですよね。でも気にしない!

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}ならいくらでも自由にできそうですが、テンプレートにそこまで処理させるのは躊躇してしまう私です。

とりあえずのWordPress

BlogといえばWordPressだったので

とりあえず導入しました。

スキンがいっぱいあって迷い中です。