Frage

Ich arbeite durch Praktische Web 2.0 appications zur Zeit und haben getroffen ein bisschen eine Straßensperre. Ich versuche, PHP, MySQL, Apache, Smarty und das Zend Framework alle richtig zum Laufen zu bringen, so kann ich damit beginnen, die Anwendung zu erstellen. Ich habe die Bootstrap-Datei für Zend Arbeits bekommen, hier:

<?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 die 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 nicht $ namen als Objekt sieht, aber ich weiß nicht, wie über die Festsetzung dieses zu gehen. Ist das nicht die Steuerung auf das index.tpl beziehen soll? Ich habe nicht in der Lage zu entdecken, was der $ name Variable darstellt und wie diese beheben die Grundlage zum Laufen zu bringen.

Jede Hilfe Sie ist sehr willkommen!

War es hilfreich?

Lösung

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

Sie könnten versuchen, das Ihr Debuggen zu beginnen:

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

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

Andere Tipps

Zend hat ein Beispiel ein Template-System zu schaffen, die die Zend_View_Interface hier implementiert: http://framework.zend.com/manual/en/zend.view.scripts.html#zend.view.scripts.templates.interface

Das könnte Ihr etwas Zeit sparen, von dem Versuch, eine benutzerdefinierte Lösung zu debuggen.

Entfernen der __construct Methode aus der Klasse, löste das ähnliche Problem, das ich gegenüberstand.

Umbenennung __construct() Tempater() für mich gearbeitet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top