6

現在、 Practical Web 2.0 Appicationsに取り組んでいますが、ちょっとした障害にぶつかっています。アプリケーションの構築を開始できるように、PHP、MySQL、Apache、Smarty、および Zend Framework をすべて正しく動作させようとしています。ここに示すように、Zend が機能するためのブートストラップ ファイルを取得しました。

<?php
    require_once('Zend/Loader.php');
    Zend_Loader::registerAutoload();

    // load the application configuration
    $config = new Zend_Config_Ini('../settings.ini', 'development');
    Zend_Registry::set('config', $config);


    // create the application logger
    $logger = new Zend_Log(new Zend_Log_Writer_Stream($config->logging->file));
    Zend_Registry::set('logger', $logger);


    // connect to the database
    $params = array('host'     => $config->database->hostname,
                    'username' => $config->database->username,
                    'password' => $config->database->password,
                    'dbname'   => $config->database->database);

    $db = Zend_Db::factory($config->database->type, $params);
    Zend_Registry::set('db', $db);


    // handle the user request
    $controller = Zend_Controller_Front::getInstance();
    $controller->setControllerDirectory($config->paths->base .
                                        '/include/Controllers');

    // setup the view renderer
    $vr = new Zend_Controller_Action_Helper_ViewRenderer();
    $vr->setView(new Templater());
    $vr->setViewSuffix('tpl');
    Zend_Controller_Action_HelperBroker::addHelper($vr);

    $controller->dispatch();
?>

これは IndexController を呼び出します。この Templater.php を使用して Zend で Smarty を実装すると、エラーが発生します。

<?php
    class Templater extends Zend_View_Abstract
    {
        protected $_path;
        protected $_engine;

        public function __construct()
        {
            $config = Zend_Registry::get('config');

            require_once('Smarty/Smarty.class.php');

            $this->_engine = new Smarty();
            $this->_engine->template_dir = $config->paths->templates;
            $this->_engine->compile_dir = sprintf('%s/tmp/templates_c',
                                                  $config->paths->data);

            $this->_engine->plugins_dir = array($config->paths->base .
                                                '/include/Templater/plugins',
                                                'plugins');
        }

        public function getEngine()
        {
            return $this->_engine;
        }

        public function __set($key, $val)
        {
            $this->_engine->assign($key, $val);
        }

        public function __get($key)
        {
            return $this->_engine->get_template_vars($key);
        }

        public function __isset($key)
        {
            return $this->_engine->get_template_vars($key) !== null;
        }

        public function __unset($key)
        {
            $this->_engine->clear_assign($key);
        }

        public function assign($spec, $value = null)
        {
            if (is_array($spec)) {
                $this->_engine->assign($spec);
                return;
            }

            $this->_engine->assign($spec, $value);
        }

        public function clearVars()
        {
            $this->_engine->clear_all_assign();
        }

        public function render($name)
        {
            return $this->_engine->fetch(strtolower($name));
        }

        public function _run()
        { }
    }
?>

ページをロードするときに発生するエラーは次のとおりです。

Fatal error: Call to a member function fetch() on a non-object in /var/www/phpweb20/include/Templater.php on line 60

$name がオブジェクトとして認識されないことは理解していますが、これを修正する方法がわかりません。コントローラは index.tpl を参照することになっていませんか? $name 変数が何を表しているのか、これを修正して基盤を機能させる方法を見つけることができませんでした。

あなたが持っているどんな助けも大歓迎です!

4

4 に答える 4

5

問題は$name変数ではなく、$_engine変数にあります。現在は空です。Smarty.class.phpへのパス指定が正しいことを確認する必要があります。

これを試してデバッグを開始することができます。

$this->_engine = new Smarty();
print_r($this->_engine);

その段階で$_engineが正しいことが判明した場合は、render()関数内にまだ正しく入力されていることを確認してください。

于 2008-10-31T17:50:40.143 に答える
0

名前__construct()を変更しTempater()て私のために働いた。

于 2012-01-19T00:42:32.303 に答える
0

クラスから __construct メソッドを削除すると、私が直面していた同様の問題が解決されました。

于 2011-02-07T10:40:00.533 に答える
0

Zend には、Zend_View_Interface を実装するテンプレート システムを作成する例があります: http://framework.zend.com/manual/en/zend.view.scripts.html#zend.view.scripts.templates.interface

これにより、カスタム ソリューションをデバッグする時間を節約できます。

于 2008-11-10T01:04:32.807 に答える