2008-10-31 2 views
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 реализовать Smarty с 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() 
     { } 
    } 
?> 

ошибка я получаю, когда я загрузить страницу это:

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 и как ее исправить, чтобы получить фундамент.

Любая помощь, которую вы имеете, очень ценится!

+0

На самом деле ошибка не в том, что $ name неоднозначно, это то, что $ this -> _ engine неоднозначно - это то, что синтаксический анализатор не видит в качестве объекта. – 2008-10-31 17:50:05

ответ

5

Проблема не в переменной $ name, а в переменной $ _engine. В настоящее время он пуст. Вам нужно проверить правильность спецификации пути к Smarty.class.php.

Вы могли бы попробовать это, чтобы начать отладку:

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

Если выясняется, что $ _engine правильно на этом этапе, то убедитесь, что он по-прежнему корректно заполняется в функции визуализации().

0

удаление метода __construct из класса разрешило аналогичную проблему, с которой я столкнулся.

0

Переименование __construct() в Tempater() Работало для меня.

Смежные вопросы