Pregunta

Estoy trabajando a través de Aplicaciones prácticas Web 2.0 actualmente y he alcanzado un poco como un obstáculo Estoy tratando de hacer que PHP, MySQL, Apache, Smarty y Zend Framework funcionen correctamente para poder comenzar a construir la aplicación. Obtuve el archivo bootstrap para que Zend funcione, como se muestra aquí:

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

Esto llama al IndexController. El error viene con el uso de este Templater.php para implementar Smarty con 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()
        { }
    }
?>

El error que obtengo al cargar la página es este:

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

Entiendo que no ve $ name como un objeto, pero no sé cómo solucionarlo. ¿No se supone que el controlador hace referencia al index.tpl? No he podido descubrir qué representa la variable $ name y cómo solucionarlo para que la base funcione.

¡Cualquier ayuda que tenga es muy apreciada!

¿Fue útil?

Solución

El problema no es con la variable $ name sino con la variable $ _engine. Actualmente está vacío. Debe verificar que la especificación de ruta a Smarty.class.php sea correcta.

Puede intentar esto para comenzar su depuración:

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

Si resulta que $ _engine es correcto en esa etapa, verifique que todavía esté correctamente poblado dentro de la función render ().

Otros consejos

Zend tiene un ejemplo de creación de un sistema de plantillas que implementa Zend_View_Interface aquí: http://framework.zend.com/manual/en/zend.view.scripts.html#zend.view.scripts.templates.interface

Eso podría ahorrarle algo de tiempo al intentar depurar una solución personalizada.

eliminar el método __construct, de la clase, resolvió el problema similar que estaba enfrentando.

Renombrar __construct() a Tempater() funcionó para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top