Pergunta

Eu estou trabalhando através Web Prático 2.0 Appications atualmente e ter sucesso um pouco de um obstáculo. Eu estou tentando obter PHP, MySQL, Apache, Smarty eo Zend Framework tudo funcionando corretamente para que eu possa começar a construir a aplicação. Tenho obtido o arquivo de inicialização para Zend trabalho, mostrado aqui:

<?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();
?>

Este chama o IndexController. O erro vem com o uso deste Templater.php para implementar Smarty com Zend:

<?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()
        { }
    }
?>

O erro que eu estou recebendo quando eu carregar a página é o seguinte:

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

Eu entendo que não vê $ nome como um objeto, mas eu não sei como ir sobre a fixação desta. não é o controlador deveria se referir ao index.tpl? Eu não tenho sido capaz de descobrir o que a variável $ name representa e como corrigir isso para obter o funcionamento da fundação.

Qualquer ajuda que você tem é muito apreciada!

Foi útil?

Solução

O problema não é com a variável $ name, mas sim com a variável $ _engine. É vazio no momento. Você precisa verificar se a especificação do caminho para Smarty.class.php está correto.

Você pode tentar isso para começar a sua depuração:

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

Se se verificar que $ _engine está correto nessa fase, em seguida, verificar se ele ainda está corretamente preenchida dentro da função render ().

Outras dicas

Zend tem um exemplo de criação de um sistema de templates que implementa o Zend_View_Interface aqui: http://framework.zend.com/manual/en/zend.view.scripts.html#zend.view.scripts.templates.interface

Isso pode poupar algum tempo de tentar depurar uma solução personalizada.

remover o método __construct, a partir da classe, resolveu o problema semelhante que eu estava enfrentando.

Renomear __construct() para Tempater() funcionou para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top