Mojavi + Smartyでコンポーネント化されたテンプレートはどうやって作るんだろうか・・・。
コンポーネント化されたテンプレートとは要するに

こんな奴を
{$loginForm}
って感じで埋め込みたいってこと。
Filterでやろうにも特定のいくつかのページにだけ埋め込みたいし、Actionとテンプレが一緒になったものとしてほしいのでforwardやActionChainもどうもうまくない。それっぽいのがあった気がするブタさんとことももう見れなくなってるし。
たぶん仕事で使ってる人がみんなやってる方法っていうのがあると思うんですが・・・
現在開発中のMojavi 2.0.0を使っている案件で$controller->forward()を実行しているアクションの挙動がおかしいので調べたところ、この事実を知ることになり驚愕しました。超ショック。
まさに、「ここはforward()のためにあったのね」でした。ためんなるわあ。
CPAN を補完しつつ、Perl 以外の言語でも使えるようにしようというプロジェクト FreePAN がスタート。Free Programming Archive Network の略で、Subversion レポジトリのミラーリングと、開発者の追加などが簡単に行えるような感じ。
言語問わないCPAN?こりゃ速攻でなんか上げたろ思いましたが、
How can I get a FreePAN account?
FreePAN accounts are initially being distributed manually. Join the FreepanIrc channel and ask for an account.
まだサイト上からアカウント発行とかはできないみたいです。
<?php
require_once("AllSession.php");
$allSession =& new AllSession();
echo "<pre>";
// セッションIDの配列
print_r($allSession->sessionId);
// $sessions["セッションID"] = セッションの中身
print_r($allSession->sessions);
echo "<pre>";
?>
session.save_pathからsess~というファイルを復元しています。
共有サーバなんかはsafe mode or CGI&SuEXECが必須かもしれないですね。
ref: セパレータとして ””|”” を使ってるんですよ
ref: PHPのセッション自力復元
Mojavi + DB_DataObject使ってるとやっぱり、
$Member =& DB_DataObject::factory('Member');
$Member->get("userName", $request->getParameter("userName"));
if ($Member->password == md5($request->getParameter("password"))) {
$user->setAuthenticated(true);
$user->setAttribute("Member", $Member);
}
こんな感じで$userに$Memberを突っ込んだりしたくなるわけですよ。
でも悲しいことにPHPのセッションはリクエスト毎にファイルにserialize ⇒ ファイルからunserializeをしてるだけなのでunserializeするとき(session_start時)にクラスが宣言されて無いとPHP_Incomplete_Classという謎オブジェクトが。
Mojaviでsession_startはSessionContainer#loadでやっているのでFilterでは遅いようです。しょうがないのでPHP_Incomplete_Classが現れた時に動くコールバック関数を指定するunserialize_callback_funcを使って無理やり読み込むことにしました。
<?php
ini_set("unserialize_callback_func", "findIncompleteClass");
function findIncompleteClass($className) {
$config = parse_ini_file(BASE_DIR."configs/DB_DataObject.ini", true);
$name = str_replace(strtolower($config["DB_DataObject"]["class_prefix"]), "", $className);
include_once($config["DB_DataObject"]["require_prefix"]."/".$name.".php");
}
?>
これもっといい方法無いのかな。
PEAR :: PEPr :: Details :: RSSBuilder
This is an RSS (Reach Site Summary) PHP Class, which make use of PHP DOM extension to produce valid RSS Feeds in one of the most common RSS formats such as ‘RSS 0.91’, ‘RSS 0.92’, ‘RSS 1.0’, ‘RSS 2.0’, ‘Atom’, ‘JavaScript’. The output maybe cached in a file. For more info take a look at ’./RSSBuilder/example.php’.
正しいRSSを作ってくれそうなRSSBuilderがPEAR proposalに。
書く方は普通に書いてもそんなに大変じゃないですが、コレ使ったら気持ちよさそう。
PEAR :: Package :: XML_FastCreate
Description
- Easy way to make valid XML :
$x->div(
$x->h1(””Example”“),
$x->p(””Hello”“),
$x->p(array(‘class’=>‘example’), ””World !”“)
)
おれの求めてたのはコレか?と思わせるXML_FastCreate 1.0.0がリリース。
XML_Treeとコレで4系でも扱いが簡単になるのかも。今度使ってみたい。
ブタさんとこのサンプルにあったようにMojavi + Smartyでcompileディレクトリを一個にしてると別モジュールの同名テンプレートを読み込んだ時にコンパイルされたファイル名がカブって動かない。(index.htmlとか)
Smartyのcompile_idにモジュール名を設定するさり気無い気配りを。
SmartyFilter.class.php:
<?php
require_once(RENDERER_DIR . "SmartyRenderer.class.php");
class SmartyFilter extends Filter {
function execute (&$filterChain, &$controller, &$request, &$user) {
// see if renderer is already loaded
$loaded =& $request->getAttribute("SmartyRenderer");
if ($loaded == NULL) {
// smarty init params
$params = array(
"cache_dir" => SMARTY_CACHE_DIR,
"caching" => SMARTY_CACHING,
"force_compile" => SMARTY_FORCE_COMPILE,
"compile_dir" => SMARTY_COMPILE_DIR,
"config_dir" => $controller->getModuleDir()."config/",
"app_name" => $controller->getCurrentModule(),
"debug_tpl" => SMARTY_DEBUG_TPL,
"debugging_ctrl" => SMARTY_DEBUGGING_CTRL,
"debugging" => SMARTY_DEBUGGING,
<strong>"compile_id" => $controller->currentModule</strong>
);
$renderer =& new SmartyRenderer($controller, $request, $user);
$smarty = & $renderer->getEngine();
foreach ( $params AS $key => $value ) {
$smarty->$key = $value;
}
// set the renderer as a request attribute so we can retrieve it
$request->setAttributeByRef("SmartyRenderer", $renderer);
// execute chain
$filterChain->execute($controller, $request, $user);
// remove renderer
$request->removeAttribute("SmartyRenderer");
} else {
$filterChain->execute($controller, $request, $user);
}
}
}
?>
PEAR :: Package :: File :: 1.2.0
Changelog:
* Fixed package.xml for PEAR 1.4 (dufuz)
added FILE_SORT_RANDOM mode (mike)
added File_Util::switchExt() (mike)
ファイルやディレクトリの読み書きなどが簡単にできるFileの1.2.0がリリース。
ChangelogにあるFILE_SORT_RANDOM modeを試してみました。
<?php
require_once("File/Util.php");
foreach (File_Util::listDir("foo", FILE_LIST_FILES | FILE_LIST_DIRS, <strong>FILE_SORT_RANDOM</strong>) as $file) {
echo $file->name."\n";
}
?>
結果:
>php FileListing.php
d.txt
b.txt
a.txt
c.txt
なるほど、ちょっとだけ嬉しい。
