Ich stand vor dem Problem, in meinem Headerlayout einen Helper für jedes Modul contextbezogen aufrufen zu wollen, um jeder seite einen entsprechenden header zu präsentieren. Dabei wollte ich in meinem Actioncontroller einfach eine variable $headline setzen, die dann vom viewhelper ins layout geschrieben wird.
Wer sich einen Viewhelper einrichten will und in diesem auf die Viewvariablen zugreifen möchte sollte 2 Dinge beachten.
1) Der Viewhelper muss von Zend_View_helper_Abstract abgeleitet sein oder das Zend_View_Helper_Interface implementieren
2) Es wird empfohlen. das Viewobject explizit zu setzen und setView zu überschreiben.
ist ganz einfach.
1) Ihr legt den Viewhelper im Ordner “views/helpers” ab. Ich habe einen Helper “getMyViewHelper.php” verwendet.
2) Ihr definiert die Helperklasse. Sie heist demnach Zend_View_Helper_getMyViewHelper
<?php
/**
* Description of getMyViewHelper
*
* @author peter
*/
class Zend_View_Helper_getMyViewHelper extends Zend_View_Helper_Abstract {
protected $returnObject=NULL; // soll in einen ViewScript (siehe unten) ausgegeben werden.
function __construct() {
//do some stuff
}
//den aktuellen view setzen
public function setView(Zend_View_Interface $view)
{
$this->view = $view;
}
//diese methode wird aufegrufen, wenn ihr im layout $this->getMyViewHelper() einbindet. Beispiel siehe "headerlayout"
function getViewPortItems()
{
$this->returnObject=(object)$empty; //wir wollen kein array oder eine einzelne variable , wir wollen ein object
$this->returnObject->eintest="erster Test";
$this->returnObject->nocheintest="noch ein Test";
//hier werden die Variablen aus dem ActionController verwendet
$this->returnObject->headline=$this->view->eindrittertest;
return $this->returnObject;
}
}
?>
Das layouttemplate “header.phtml”
<h1><?php echo this->getMyViewHelper()->eintest?></h1> //variable aus dem helper <h2><?php echo this->getMyViewHelper()->nocheintest?></h2> //variable aus dem helper <h3><?php echo this->getMyViewHelper()->headline?></h3> // und da ist die headline aus dem view
im controller cann man dann einfach die headline setzen.
<?php
class Admin_IndexController extends Zend_Controller_Action {
public function init() {
$this->translate=Zend_Registry::get("translate_mod");
}
/**
* @desc generates and populates the Adminpanelform
*/
public function indexAction() {
$this->view->headline = $this->translate->_("modHeadline");
}
}