2008-10-31 9 views
6

Ich arbeite derzeit durch Practical Web 2.0 Appications und habe ein bisschen eine Straßensperre getroffen. Ich versuche, PHP, MySQL, Apache, Smarty und das Zend Framework korrekt zu installieren, damit ich mit dem Erstellen der Anwendung beginnen kann. Ich habe die Bootstrap-Datei für Zend arbeiten, hier gezeigt:Aufruf an eine Member-Funktion auf einem Nicht-Objekt

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

Dies ruft den IndexController. Der Fehler wird mit der Verwendung dieser Templater.php Smarty mit Zend zu implementieren:

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

Der Fehler, den ich immer bin, wenn ich die Seite laden, ist dies:

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

Ich verstehe es doesn Sehe $ name nicht als Objekt, aber ich weiß nicht, wie ich das beheben soll. Soll der Controller nicht auf index.tpl verweisen? Ich konnte nicht herausfinden, was die Variable $ name darstellt und wie ich das beheben kann, damit die Foundation funktioniert.

Jede Hilfe, die Sie haben, wird sehr geschätzt!

+0

Eigentlich ist der Fehler nicht, dass $ Name mehrdeutig ist, es ist, dass $ this -> _ Engine mehrdeutig ist - das ist, was der Parser nicht als ein Objekt sieht. –

Antwort

5

Das Problem ist nicht mit der Variable $ name, sondern mit der Variable $ _engine. Es ist derzeit leer. Sie müssen überprüfen, ob die Pfadangabe zu Smarty.class.php korrekt ist.

Sie könnten versuchen, diese Ihre Debuggen zu beginnen:

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

Sollte sich herausstellen, dass _engine $ zu diesem Zeitpunkt richtig ist dann sicher, dass es immer noch richtig in der render() Funktion gefüllt wird.

0

Das Entfernen der __construct-Methode aus der Klasse löste das ähnliche Problem, mit dem ich konfrontiert war.

0

Umbenennung __construct() zu Tempater() arbeitete für mich.