WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート [symfony] 他アプリケーションのパーシャルを取得する

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

actionからパーシャルを取得するのは


$this->getPatial('module/action',array('var'=>$var));
みたいにして取得できますが、メールのテンプレートで、バックエンドとフロントエンドで、共通に使用したいパーシャルがあって、他のアプリケーションのパーシャルを取得できないかと色々試してみました。
パーシャルを取得するのは

$view = new sfPartialView($context, $moduleName, $actionName, '');
$view->setPartialVars($vars);

return $view->render();
のようにsfPartialViewを使えば簡単に取れるのですが、$contextが必要なので他アプリケーションのContextを作る必要があります。
また、一度他のContextを取得するとアクティブなContextが切り替わってしまうので使用した後戻す必要があります。

//現在のアプリケーション名を取得
$current_app = sfContext::getInstance()->getConfiguration()->getApplication();

if(!sfContext::hasInstance($app_name))
{
$debug = sfContext::getInstance()->getConfiguration()->isDebug();
$env = sfContext::getInstance()->getConfiguration()->getEnvironment();
sfContext::createInstance(
ProjectConfiguration::getApplicationConfiguration($app_name, $env, $debug)
);
}

//sfContext::createInstancで新しいアプリ用になっているので一回きりならいりません。
//2度目は新しいほうに切り替える必要があります。
sfContext::switchTo($app_name);

//Contextを取得
$context = sfContext::getInstance($app_name);

$view = new sfPartialView($context, $moduleName, $actionName, '');
$view->setPartialVars($vars);

$body = $view->render();

//元に戻す
sfContext::switchTo($current_app);
sfContext内に複数のインスタンスを持てるようになってるので想定内の使い方だとは思うのですが、なんか微妙な感じですね。実際にはclassを作ってマジックメソッド__callでsfContext::switchToをメソッド呼び出しの前後に行うようにしてみました。

class sdApplication
{
private
$context,
$main_app,
$target_app;

public function __construct($app_name)
{
$this->main_app = sfContext::getInstance()->getConfiguration()->getApplication();
$this->target_app = $app_name;

if(!sfContext::hasInstance($app_name))
{
$debug = sfContext::getInstance()->getConfiguration()->isDebug();
$env = sfContext::getInstance()->getConfiguration()->getEnvironment();
sfContext::createInstance(
ProjectConfiguration::getApplicationConfiguration($app_name, $env, $debug)
);
}

$this->context = sfContext::getInstance($app_name);
sfContext::switchTo($this->main_app);
}

protected function _getPartial($arguments)
{
$templateName = $arguments[0];
$vars = $arguments[1];

$sep = strpos($templateName, '/');
$moduleName = substr($templateName, 0, $sep);
$actionName = '_'.substr($templateName, $sep + 1);

$view = new sfPartialView($this->context, $moduleName, $actionName, '');
$view->setPartialVars($vars);

return $view->render();
}

public function __call($method, $arguments)
{
sfContext::switchTo($this->target_app);
$method = '_'.$method;
$value = $this->$method($arguments);
sfContext::switchTo($this->main_app);

return $value;
}
}
テンプレートエンジンがアプリケーション全体と密接にかかわってるので単独で使用は微妙な感じですね。メール部分だけ、他のテンプレートエンジンを使用してもいいかもしれません。そのうちどっちが軽量か試してみるかも。(25日にSmartyを使って試してみました。そちらの記事もご覧ください
スポンサーサイト

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。