2012-03-24 11 views
3

Ich versuche, einen benutzerdefinierten Platzhalter aus einem Viewscript zu löschen, lassen Sie uns sagen, dass ich einen Controller-Plugin haben, die eine Sidebar erstellt:Zend Framework - löschen Sie eine benutzerdefinierte Platzhalter aus einem Viewscript

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap'); 
    $view = $bootstrap->getResource('view'); 
    $partial = $view->render('partials/_sidebar.phtml'); 
    $view->placeholder('sidebar')->append($partial); 

Mein Teil enthält mein Untermenü (gerendert durch Zend_Navigation view helper).

Um diese Seitenleiste zu machen, ich habe dies in meinem Layout:

<?= $this->placeholder('sidebar'); ?> 

Aber was, wenn in einigen Seiten ich will nicht meine Sidebar (Login-Seite zum Beispiel) angezeigt werden? Wie kann ich mit diesen Fällen umgehen?

Ich dachte, ich könnte zurücksetzen/lösche meinen Platzhalter $this->placeholder('sidebar')->exchangeArray(array()); verwenden, aber es scheint, dass ich nicht meinen Platzhalter aus einem Viewscript zugreifen:

Jede Idee
// in /application/modules/default/views/account/login.phtml 
<?php $placeholder = $this->placeholder('sidebar'); 
Zend_Debug::dump($placeholder); ?> 

// output: 

object(Zend_View_Helper_Placeholder_Container)#217 (8) { 
    ["_prefix":protected] => string(0) "" 
    ["_postfix":protected] => string(0) "" 
    ["_separator":protected] => string(0) "" 
    ["_indent":protected] => string(0) "" 
    ["_captureLock":protected] => bool(false) 
    ["_captureType":protected] => NULL 
    ["_captureKey":protected] => NULL 
    ["storage":"ArrayObject":private] => array(0) { 
    } 
} 

, wie so etwas zu tun?

Danke.

Edit:

Mein Problem war sehr einfach eigentlich, da mein Plugin registriert und wurde in der postdispatch() -Methode ausgeführt, dann wurde mein Viewscript vor das Plugin und das Layout ausgeführt wurde nach ausgeführt, um die Plugin.

Ab was sind meine Optionen? Ich kann meine Sidebar in der preDispatch-Methode nicht wirklich deklarieren, da kein Skriptverzeichnis festgelegt ist. Daher kann ich nicht bestimmen, welches Ansichtsscript in diesem Schritt ausgeführt werden soll.

Ich könnte auch einen action() Helfer verwenden, was denkst du? Eine Frage wurde already asked about it. Ich habe immer noch das Gefühl, dass das nicht der richtige Weg ist, und es klingt für mich übertrieben. Eine andere Idee wäre, mein Plugin in eine preDispatch() - Methode meines Controllers zu verschieben, aber das würde mich dazu bringen, auf jedem Controller meine Sidebar zu kopieren oder einzufügen, oder einen baseController zu erstellen, aber ich tu immer noch nicht. Ich mag diese Idee, ich fühle mich wie ich es falsch mache.

Irgendeine Idee?

+0

Eine Idee ist, eine Flagge wie '$ view-> isSidebarRenderable' zu ​​setzen und es im Layout überprüfen, bevor die Sidebar-Rendering. Unelegant, sollte aber funktionieren. –

+0

Ich dachte darüber nach, aber wie du gesagt hast, scheint es unelegant. Danke trotzdem für das Teilen deiner Gedanken :) –

+0

In der Tat. Ich bin interessiert zu sehen, ob jemand anderes mit etwas sauberer kommt. Prost! –

Antwort

0

Sie waren eigentlich ziemlich nah. Sie mussten nur den Namen Ihres Platzhalters, sidebar in diesem Fall hinzufügen:

$this->placeholder('sidebar')->exchangeArray(array()); sollte funktionieren.

Siehe http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial.placeholder

EDIT:

Das seltsame ist, dass die oben nicht für Sie arbeiten. Ich habe das auf meiner eigenen ZF-Website getestet und es hat funktioniert. Möglicherweise anderes Szenario. Ich weiß es nicht.

Hier ist eine andere Alternative, wenn auch mehr beteiligt.

//Get the placeholder object directly 
$placeholderObj = $this->getHelper('placeholder') 

//This may be why you were getting null in your example above. Since your were using the magic method in the View class to call the placeholder view helper method directly. 

//For example you could call the placeholder like so: 
$placeholderObj->placeholder('sidebar')->set("Some value"); 

//Now the alternative way to remove the placeholder value is as follows. 
$registry = $placeholderObj->getRegistry() 
$registry->deleteContainer('sidebar'); 

EDIT3

Es als Zend_Controller_Plugin preDispatch Haken arbeiten sollten mit. Ich denke, das einzige, was Sie sicherstellen müssen, ist, dass Sie dieses Plugin bestellen, nachdem Sie Ihre Ansichtsscript/Hilfspfade und Layoutpfade eingestellt haben. Dies kann im selben Plugin oder in einem anderen Plugin geschehen.

Hier ist ein Codebeispiel, das auf etwas basiert, das ich auf meiner Website verwende. Der relevante Teil ist nur der Stoff, in preDispatch, wo ich die Ansicht Skript Pfade gesetzt, etc

class RT_Theme extends Zend_Controller_Plugin_Abstract 
{ 
    private $_sitename; 
    private $_assets; 
    private $_appPath; 
    private $_appLibrary; 

    /** 
    * Constructor 
    * 
    * @param string $sitename 
    * @param SM_Assets $assets 
    * @param string $appPath 
    * @param string $appLibrary 
    */ 
    public function __construct($sitename, $assets, $appPath, $appLibrary) 
    { 
     $this->_sitename = $sitename; 
     $this->_assets = $assets; 
     $this->_appPath = $appPath; 
     $this->_appLibrary = $appLibrary; 
    } 

    /** 
    * Sets up theme 
    * 
    * Sets up theme template directory and assets locations (js, css, images) 
    * 
    * @param Zend_Controller_Request_Abstract $request 
    */ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $module = $request->getModuleName(); 
     $controller = $request->getControllerName(); 
     $action = $request->getActionName(); 

     $layout = Zend_Layout::getMvcInstance(); 
     $view = $layout->getView(); 

     $view->sitename = $this->_sitename; 
     $view->headTitle()->setSeparator(' - ')->headTitle($view->sitename); 

     $layout->setLayoutPath($this->_appPath . "/html/$module/layout/"); 

     $view->setScriptPath($this->_appPath . "/html/$module/view/"); 
     $view->addScriptPath($this->_appPath . "/html/$module/view/_partials/"); 

     $view->addScriptPath($this->_appLibrary . '/RT/View/Partials/'); 
     $view->addHelperPath('RT/View/Helper', 'RT_View_Helper'); 

     $view->addHelperPath($this->_appPath . '/html/view/helpers','My_View_Helper'); 

     $viewRenderer = 
      Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); 
     $viewRenderer->setView($view); 


     //Ignore this line. Not relevant to the question     
     $this->_assets->loadFor($controller, $action); 

     //Example: Now I can set the placeholder. 
     $view->placeholder('header_title')->set($view->sitename); 
    } 
} 
+0

Ich habe meinen Post bearbeitet, um ihn richtig zu schreiben (ich habe das erste Mal nicht kopiert/eingefügt). Beachten Sie, dass ich eine Warnung erhalten würde, wenn ich den Parameter vergessen hätte. Und wenn Sie meine ganze Frage lesen, werden Sie sehen, dass 'Zend_Debug :: dump ($ placeholder);' ein leeres Objekt ausgibt. Danke für deine Antwort. –

+0

Hmm, ich bin überrascht, dass es nicht für dich funktioniert hat. Das hat auf einer meiner Webseiten für mich funktioniert. Ich fügte meine ursprüngliche Antwort hinzu, die ein bisschen wortreicher ist, aber ich denke, kann eingekapselt werden. Es kann auch erklären, warum Sie ein leeres Objekt erhalten haben. – Gohn67

+0

Mein Problem gefunden, ich habe meine Frage bearbeitet. –