2008-10-31 30 views
6

Estoy trabajando a través de Practical Web 2.0 Appications actualmente y he golpeado un poco de una barricada. Intento que PHP, MySQL, Apache, Smarty y Zend Framework funcionen correctamente para poder comenzar a construir la aplicación. He conseguido el archivo de arranque para Zend de trabajo, que se muestra aquí:Llamar a una función de miembro en un objeto no

<?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 requiere la 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 estoy consiguiendo cuando la carga de la página es la siguiente:

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

entiendo que doesn No veo $ name como un objeto, pero no sé cómo solucionarlo. ¿No se supone que el controlador se refiere 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!

+0

En realidad, el error no es que $ name sea ambiguo, es que $ this -> _ engine es ambiguo, eso es lo que el analizador no ve como un objeto. –

Respuesta

5

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 es correcta.

Es posible probar este para comenzar su depuración:

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

Si resulta que $ _engine es correcto en esa etapa continuación, compruebe que todavía se rellena correctamente dentro de la función render().

0

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

0

Renombrando __construct() a Tempater() trabajado para mí.

Cuestiones relacionadas