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:
// 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?
Eine Idee ist, eine Flagge wie '$ view-> isSidebarRenderable' zu setzen und es im Layout überprüfen, bevor die Sidebar-Rendering. Unelegant, sollte aber funktionieren. –
Ich dachte darüber nach, aber wie du gesagt hast, scheint es unelegant. Danke trotzdem für das Teilen deiner Gedanken :) –
In der Tat. Ich bin interessiert zu sehen, ob jemand anderes mit etwas sauberer kommt. Prost! –