2008-10-31 24 views
6

Tôi đang làm việc qua Practical Web 2.0 Appications hiện tại và đã gặp phải một chút rào cản. Tôi đang cố gắng để có được PHP, MySQL, Apache, Smarty và Zend Framework tất cả hoạt động chính xác để tôi có thể bắt đầu xây dựng ứng dụng. Tôi đã nhận được tệp bootstrap cho Zend hoạt động, được hiển thị ở đây:Gọi tới chức năng thành viên trên một đối tượng không

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

Điều này gọi cho IndexController. Các lỗi đi kèm với việc sử dụng các Templater.php này để thực hiện Smarty với 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() 
     { } 
    } 
?> 

lỗi Tôi nhận được khi tôi tải trang là thế này:

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

Tôi hiểu nó doesn Không thấy tên $ như một đối tượng, nhưng tôi không biết làm thế nào để sửa chữa điều này. Không phải là bộ điều khiển phải đề cập đến index.tpl? Tôi đã không thể khám phá biến $ name đại diện và cách khắc phục điều này để nền tảng hoạt động.

Bất kỳ trợ giúp nào bạn có được đánh giá cao!

+0

Trên thực tế, lỗi không phải là $ name là mơ hồ, đó là $ this -> _ engine không rõ ràng - đó là những gì mà trình phân tích cú pháp không xem như một đối tượng. –

Trả lời

5

Sự cố không phải với biến $ name mà là với biến $ _engine. Nó hiện đang trống. Bạn cần xác minh rằng đặc tả đường dẫn đến Smarty.class.php là chính xác.

Bạn có thể thử này để bắt đầu gỡ rối của bạn:

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

Nếu nó quay ra rằng $ _engine là đúng ở giai đoạn đó sau đó xác nhận rằng nó vẫn được phổ biến một cách chính xác trong render() chức năng.

0

xóa phương thức __construct, khỏi lớp học, giải quyết vấn đề tương tự mà tôi đang gặp phải.

0

Đổi tên __construct() thành Tempater() làm việc cho tôi.

Các vấn đề liên quan