Zend_LayoutとSmartyの連携

SmartyをZendFrameworkのビューとして利用

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

SmartyをZendFrameworkのビューとして利用する

Zend_Layoutに対応させるための変更

1. Zend_Layoutの基底パスとするディレクトリの生成

Zend_Layoutの基底パスとするディレクトリは以下の赤字でハイライトしているディレクトリです。

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

まだ生成していない場合は、これらを生成します。

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

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

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

3. アプリケーション設定ファイル application.ini の編集

application/configs/application.ini に下記の数行を加えます。


resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" 
resources.layout.viewSuffix = "tpl" 

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

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

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

application/controllers/IndexController.php
<?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/views/scripts/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|smarty:nodefaults} 
</body> 
</html>  

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


最終更新 2011-01-22

この記事へのコメント

  1. 初めまして、参考にさせていただきました。
    smartyと連携させておりモジュールごとに切替えをしたく
    過去の記事も参照し同様にやってみたのですがエラーに
    なってしまいます。
    
    Fatal error: Call to a member function getControllerDirectory() on a non-object in C:\site\zend\library\Zend\Application\Resource\Modules.php on line 69
    
    application.iniに設定として下記のようにしており間違いなく
    コントロールディレクトリも存在しているのですが何が原因か
    おわかりになりますでしょうか?
    
    bootstrap.path  = APPLICATION_PATH "/Bootstrap.php"
    bootstrap.class = "Bootstrap"
    
    resources.frontController.controllerDirectory = APPLICATION_PATH "/modules/default/controllers"
    resources.frontController.moduleDirectory     = APPLICATION_PATH "/modules"
    
    resources.modules[] =
    
    resources.layout.layout             = "layout"
    default.resources.layout.layoutPath = APPLICATION_PATH "/modules/default"
    admin.resources.layout.layoutPath   = APPLICATION_PATH "/modules/admin"
    resources.layout.viewSuffix         = "tpl"
    

    投稿者 : toshi  |  投稿日時 : 

  2. 初めまして、参考にさせていただきました。
    smartyと連携させておりモジュールごとに切替えをしたく
    過去の記事も参照し同様にやってみたのですがエラーに
    なってしまいます。
    
    Fatal error: Call to a member function getControllerDirectory() on a non-object in C:\site\zend\library\Zend\Application\Resource\Modules.php on line 69
    
    application.iniに設定として下記のようにしており間違いなく
    コントロールディレクトリも存在しているのですが何が原因か
    おわかりになりますでしょうか?
    
    bootstrap.path  = APPLICATION_PATH "/Bootstrap.php"
    bootstrap.class = "Bootstrap"
    
    resources.frontController.controllerDirectory = APPLICATION_PATH "/modules/default/controllers"
    resources.frontController.moduleDirectory     = APPLICATION_PATH "/modules"
    
    resources.modules[] =
    
    resources.layout.layout             = "layout"
    default.resources.layout.layoutPath = APPLICATION_PATH "/modules/default"
    admin.resources.layout.layoutPath   = APPLICATION_PATH "/modules/admin"
    resources.layout.viewSuffix         = "tpl"
    

    投稿者 : toshi  |  投稿日時 : 

  3. toshiさん
    
    >C:\site\zend\library\Zend\Application\Resource\Modules.php on line 69
    
    このファイルの69行目前後の
    
    >$front = $bootstrap->getResource('FrontController');
    
    ↑この部分でフロントコントローラが取得出来ていないようですね。
    
    申し訳ありませんが、私の方では原因を特定することができません。
    お見受けしたところWindows環境のようですね。こちらとは何かと状況が異なるのかもしれません。
    
    お力になれずに申し訳ないです。
    

    投稿者 : 管理者  |  投稿日時 : 

カテゴリー

その他



スポンサードリンク