Ich verstehe noch nicht ganz, warum man im Controller ein View rendern will. Das macht Zend_Layout doch ganz von alleine. Du brauchst lediglich ein view-Script erstellen (da du sonst ohnehin eine Exception bekommst). Dieses View-Script kann dann assigned Variablen verwenden.
Ich mach das grundsätzlich so:
zf.bat/sh aufrufen, um mein App-Skeleton zu erstellen. Dann meine Controller mit zf erstellen und anschließend Actions im Controller erzeugen. Das alles geht ganz einfach mit zf. Du brauchst da keine einzige Zeile Code anfassen.
Dann wird das application.ini erweitert (Db-Ressource einhängen, Layout-Pfad deklarieren, etc).
Dann Boostrap.php um eine Methode _initLayout() erweitern, in der startMVC() gerufen wird und der Doctype festgelegt. Dann eine Methode _initTranslate() anlegen, in der I18N initialisiert und registriert wird.
Dann eine Methode _initDB() anlegen, in der ein Objekt in Zend_Db::factory() mittels der Resource Db erzeugt wird. Dieses Objekt wird dann auch gleich als Default-Adapter an Zend_Db_Table registriert.
Anschließend kommt das Basis-Layout in application/layouts/main.phtml definiert, was z.B. so aussehen kann:
PHP:
<?php
$this->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8');
$this->headMeta()->appendName('keywords', Bootstrap::getConfigInstance()->application->keywords);
$this->headTitle()->prepend(Bootstrap::getConfigInstance()->application->name);
$this->headTitle()->setSeparator(' - ');
echo $this->doctype('XHTML1_TRANSITIONAL');
?>
<html>
<head>
<?php echo $this->headMeta(); ?>
<?php echo $this->headLink()->appendStylesheet('/_files/css/styles.css'); ?>
<?php echo $this->headLink()->appendStylesheet('/_files/js/dijit/themes/tundra/tundra.css'); ?>
<?php echo $this->headTitle(); ?>
</head>
<body>
<div id="page">
<div id="header">
<center><h1><?php echo $this->pageName();?></h1></center>
</div>
<div id="main">
<!--
<div id="navi">
<ul>
<li><a href="#">a</a></li>
<li><a href="#">b</a></li>
<li><a href="#">c</a></li>
<li><a href="#">d</a></li>
</ul>
</div>
-->
<div id="extra">
<?php
if(!Bootstrap::getSess()->user)
{
$this->formBox('login');
}
else
{
$this->contentBox('logout');
$this->contentBox('actions');
$this->mailBox();
}
?>
</div>
<?php
echo $this->layout()->content;
?>
</div>
<div id="footer">
<?php echo $this->pageFooter(); ?>
</div>
</div>
</body>
</html>
Bis hier hin habe ich ca. 10 Minuten investiert. Die Actions können bereits aufgerufen werden, es werden die Standard-View-Scripts angezeigt.
Nun kann ich die Business-Logik in die Controller-Actions implementieren. Dafür werden natürlich Models benötigt. Diese Models können durchaus erweitertes CRUD implementieren, oder ich nehme einfach die Basis-Funktionen.
Das aufwendigste kommt dann beim designen der View-Scripts. Diese View-Scripts können durchaus auch mal Helper in Form von _partialLoop() verwenden, um z.B. alle Datensätze eines Blogs innerhalb eines bestimmten Zeitraums anzuzeigen.
Bis hier hin habe lediglich meine Controller customized, eigene Models angelegt und View-Scripts definiert.
Ich sehe aber langsam, was dein Problem ist: Du hast sicherlich das Tutorial von Ralf Eggert gelesen. Dieses Tutorial ist leider für das aktuelle ZF überhaupt nicht mehr geeignet. Dort werden viele mittlerweile obsolete Schritte erklärt, wie man das eine oder andere lösen kann.
Eigentlich ist es an der Zeit, ein neues Tut zu schreiben....
Edit:
Vor einiger Zeit hatte ich das allerdings noch so gemacht:
Bootstrap.php:
PHP:
/**
* View instance
* @var Zend_View
*/
private static $_view = null;
/**
* Register a customized view instance
*
* @return void
*/
private static function registerView()
{
// get ViewRenderer
$viewRenderer= Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
self::$_view = new Zend_View();
self::$_view->addHelperPath(APPLICATION_DIR . DIRECTORY_SEPARATOR . "lib" . DIRECTORY_SEPARATOR . 'My/View/Helper', 'My_View_Helper');
self::$_view->setEncoding('UTF-8');
// set new View
$viewRenderer->setView(self::$_view);
}
/**
* Setup the layout
*
* @return void
*/
private static function setupLayout()
{
$layout = Zend_Layout::startMvc(array(
'layoutPath' => APPLICATION_DIR . DIRECTORY_SEPARATOR . 'layouts',
'layout' => 'main'
));
$layout->setView(self::$_view);
}
/**
* Initialization
* @return void
*/
public static function initialize()
{
Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);
self::registerView();
self::setupLayout();
}