WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

Zend_LayoutとSmartyの連携(旧)

      2012/12/17

※この記事は内容が古くなっています。同様の新しい手法は下記ページを参考にしてください。
Zend_LayoutとSmartyの連携

ZendFrameworkのビューとしてSmartyを採用する方法

この記事は、ZendFrameworkのビューとしてSmartyを採用し、さらにSmartyをZend_Layoutに対応させるためのものです。
ZendFrameworkのビューとしてSmartyを組み込むことに成功した以下の記事の続きから始めます。

SmartyをZendFrameworkのビューとして利用する(モジュール化対応版)

ディレクトリ構成は以下のような形になります。
この記事から追加したファイルは赤字でハイライトしてそれ以外は主要なものだけ抜粋しています。

|-- application
|   |-- layouts
|   |   `-- scripts
|   |       `-- layout.tpl
|   |-- modules
|       |-- default
|           |-- controllers
|           |   `-- IndexController.php
|           `-- templates
|               `-- index
|                   `-- index.tpl
|
|-- library
|   `-- Zend_View_Smarty.class.php
|-- public
    `-- index.php

Zend_View_SmartyクラスをZend_Layoutに対応させる

上記記事の、ZendFrameworkの公式マニュアルから転載したSmartyのラッパークラスのrenderメソッドに数行加えます。
以下に加える行だけ赤字で示します。

    /** 
     * テンプレートを処理し、結果を出力します 
     * 
     * @param string $name 処理するテンプレート 
     * @return string 出力結果 
     */ 
    public function render($name) 
    { 
        require_once 'Zend/View/Helper/Placeholder.php';
        $holder = new Zend_View_Helper_Placeholder(); 
        $data = $holder->placeholder('Zend_Layout')->getArrayCopy(); 
        $this->_smarty->assign('content', $data['content']);
        return $this->_smarty->fetch($name); 
    } 

ここでは便宜上require_once文をメソッド内に書きましたが、実際はclass宣言前に書いています。

フロントコントローラでの処理

フロントコントローラでZend_Layoutを利用するために追記した処理を下記に抜粋致します。

public/index.php(抜粋)
$layout = Zend_Layout::startMvc( 
    array( 
        'layoutPath' => APP_PATH . 'layouts/scripts', 
        'viewSuffix' => 'tpl', 
    ) 
);    

アクションコントローラ・ビュースクリプトの設置

デフォルトモジュールにアクションコントローラを、テンプレートディレクトリにビュースクリプトをそれぞれ設置してみて動作を確認します。

動作確認用のデフォルトモジュールのアクションコントローラは下記の通りです。

application/modules/default/controllers/IndexController.php
<?php echo '<?php'; ?>

require_once 'Zend/Controller/Action.php'; 
 
class IndexController extends Zend_Controller_Action{ 
    public function indexAction() { 
        $this->view->assign('str', 'Smarty and Zend_Layout.'); 
    }   
} 

続いて上記アクションコントローラのテンプレートです。

application/modules/default/templates/index/index.tpl
文字列 : {$str}

下記はレイアウトスクリプトになります。

application/layout/scripts/layout.tpl
<!DOCTYPE HTML> 
<html lang="ja"> 
<head> 
>---<meta charset="UTF-8"> 
>---<title>Smarty and ZendFramework test</title> 
</head> 
<body> 
>---{$content} 
</body> 
</html>  

これでブラウザから閲覧すると、”Smarty and Zend_Layout”と.表示されるはずです。

 - ZendFramework , , , , , ,