mosowave

sinamon129による(主に)技術ブログ。Ruby,Ruby on Rails,Elasticsearchやその他について書きます。

Cakephp2系にsmarty3をいれるはなし

Cakephp2系をつかっています。

テンプレートエンジンsmartyをいれたかったのですが、Cakeを使い始めた頃(4ヶ月ぐらいまえ?)にはよくわからなくていれられなかったのですが、いろいろ整備し直すタイミングでいれてみることに。

Smartyを入れる
まずは、公式から、smartyをダウンロード。
f:id:sinamon129:20130212022434p:plain
この、libsディレクトリをsmartyにrenameして、
app/Vendorの中に置きます。

次に、Smartycakephpで使うためのSmartyViewをつくります。
app/Viewの中に置きます。

参考:CakePHP 2.0.0 Beta && Smarty 3

で、ここのソースコードが化けてるので、http://www18.atwiki.jp/javascripter/pages/26.htmlを参考に。

<?php
class SmartyView extends View {
	function __construct (&$controller) {
		parent::__construct($controller);
		if (is_object($controller)) {
			$count = count($this->_passedVars);
			for ($j = 0; $j < $count; $j++) {
				$var = $this->_passedVars[$j];
				$this->{$var} = $controller->{$var};
			}
		}

		if(!App::import('Vendor', 'Smarty', array('file' => 'smarty'.DS.'Smarty.class.php')))
			die('error Loading Smarty Class');
		$this->Smarty = new Smarty();

		//$this->subDir = 'smarty'.DS;

		$this->ext= '.tpl';
		//$this->Smarty->plugins_dir[] = VENDORS.DS.'smarty'.DS.'plugins';
		$this->Smarty->compile_dir = TMP.'smarty'.DS.'compile'.DS;
		$this->Smarty->cache_dir = TMP.'smarty'.DS.'cache'.DS;
		$this->Smarty->error_reporting = 'E_ALL & ~E_NOTICE';
		$this->Smarty->debugging = true;
		$this->Smarty->compile_check = true;
		$this->viewVars['params'] = $this->params;

		$this->Helpers = new HelperCollection($this);
	}

	protected function _render($___viewFn, $___dataForView = array()) {
		$trace = debug_backtrace();
		$caller = array_shift($trace);
		if ($caller === "element") parent::_render($___viewFn, $___dataForView);

		if (empty($___dataForView)) {
			$___dataForView = $this->viewVars;
		}

		extract($___dataForView, EXTR_SKIP);

		foreach($___dataForView as $data => $value) {
			if(!is_object($data)) {
				$this->Smarty->assign($data, $value);
			}
		}

		$this->Smarty->assign('View', new View(null));

		ob_start();
		$this->Smarty->display($___viewFn);
		return ob_get_clean();
	}

	public function loadHelpers() {
		$helpers = HelperCollection::normalizeObjectArray($this->helpers);
		foreach ($helpers as $name => $properties) {
			list($plugin, $class) = pluginSplit($properties['class']);
			$this->{$class} = $this->Helpers->load($properties['class'], $properties['settings']);
			$this->Smarty->assign($name, $this->{$class});
		}
		$this->_helpersLoaded = true;
	}
}

?>

レイアウトファイルを置く所を、app/View/Layoutsの中にしたいので、

$this->subDir = 'smarty'.DS;

をコメントアウトしています。

次に、default.tplをつくります。

<html>
<head>
<title>{$pageTitle}</title>
</head>
<body>
{$content_for_layout}
</body>
</html>

後は、AppControllerにsmartyが使えるようにしていしてあげればおっけー。
app/Controller/AppController.php

class AppController extends Controller {
    public $viewClass = 'Smarty';
}

これで、smartyがつかえるようになりました!

参考:
CakePHP 2.0.6とSmarty
akePHPでSmartyで使う方法(2010年2月現在)