2013-08-26 26 views
28

Ich möchte eine Reihe von Variablen an meine layout.phtml in der gesamten Anwendung (global) übergeben. Und damit meine ich, ich will nicht verwendenWie können Variablen in ZF2 global an layout.phtml übergeben werden?

$this->layout()->someVar = someValue; 

in jeder Aktion, die ich habe, da es eine Menge zusätzlicher Arbeit und Code wäre. Gibt es einen Weg, dies an nur einem Ort zu tun? Oder Was ich erwähnt habe ist alles was ich habe! Hoffe nicht :)

Vielleicht Sitzungen verwenden? - Remi Thomas

Danke für die Lösung. Für den Moment verwende ich das. Für eingeloggte Benutzerinformationen, System- und Layouteinstellungen und eine ACL-Liste. Aber das Problem ist, dass ich ein neues Objekt in layout.phtml definieren muss, was ich nicht für angemessen halte, oder? Ich habe irgendwo gelesen, dass die Daten, die wir in View-Modellen verwenden müssen, über Controller-Aktionen an sie übergeben werden. Und vor allem bin ich kein Fan von Schnitten, also wenn es einen sauberen Weg dafür gibt, würde ich es lieber nicht so machen. Und vor kurzem muss ich die Anzahl der ungelesenen Nachrichten für jeden Benutzer abrufen und in layout.phtml verwenden. Also, wenn ich es in layout.phtml mache, ist es eine Menge PHP-Skript in einem Ansichtsmodell oder Layout.

Danke

+0

Vielleicht Sitzungen verwenden? –

Antwort

36

Der beste und sauberste Weg ist die Verwendung eines ViewHelper, wie Orochi vorschlägt. Hier einige Anweisungen zum Erstellen eines eigenen ViewHelper: http://framework.zend.com/manual/2.2/en/modules/zend.view.helpers.advanced-usage.html. Es ist nicht zu komplex;)

Allerdings könnte Ihr Problem auch auf andere Weise gelöst werden. Angenommen, die Variablen, die Werte enthalten, die von Services bereitgestellt werden, die bereits in Ihrer Anwendung vorhanden sind (und dann vom ZF2 ServiceManager bereitgestellt werden), können Sie einige Zeilen der Funktion "onBoostrap" in Ihrer Module.php hinzufügen (z. B. im Anwendungsmodul).

Hier ein Beispiel:

public function onBootstrap($e) { 

    $serviceManager = $e->getApplication()->getServiceManager(); 
    $viewModel = $e->getApplication()->getMvcEvent()->getViewModel(); 

    $myService = $serviceManager->get('MyModule\Service\MyService'); 

    $viewModel->someVar = $myService->getSomeValue(); 

} 

Auf diese Weise können Sie die Zuordnung schreiben nur einen Ort in. Die Variable ist dann zugänglich wie gewohnt:

$this->layout()->someVar; 
+1

Danke Stefan, das schätze ich sehr. Ich bin gerade mit einem anderen vorrangigen Teil der Anwendung beschäftigt. Aber in ein paar Tagen werde ich definitiv diese Lösungen ausprobieren. Aber momentan denke ich, dass der onBootstrap genau das ist, was ich brauche. Ich werde es testen. Danke wieder bro :) –

+0

Toller Beitrag! Klappt wunderbar! – Ron

2

Erstellen Sie Ihren eigenen ViewHelper dafür.

EDIT:

Das ist, wie ich es tun: Innerhalb Ihres Moduls src Ordner, ich erstellen Sie neue Ordner anzeigen dann in diesem Ordner anzeigen, erstelle ich einen anderen Ordner namens Helper. In diesem Ordner erstelle ich meine Hilfsklassen. Also zum Beispiel, ich erstelle die Datei Navigation.php. In dieser Datei erstelle ich eine Klasse namens Navigation, die sich von AbstractHelper erstreckt (benutze Zend \ View \ Helper \ AbstractHelper). Dann schreibe ich Code innerhalb der öffentlichen Funktion __invoke(), die auch ein Ergebnis zurückgibt. Sie haben auch Ihre Ansicht Helfer Klasse ‚view_helpers‘ innerhalb des Moduls config/module.config.php, so etwas hinzuzufügen:

'view_helpers' => array(
    'invokables' => array(
     'nav' => 'Application\View\Helper\Navigation', 
    ), 
), 

Dann können Sie Ihre ‚nav‘ als Methode eine beliebige Stelle innerhalb Ihrer Ansicht nennen oder Layout, zum Beispiel nav();?>

+0

Danke, obwohl ich denke, es ist zu weit fortgeschritten für mich: D. Ich werde etwas recherchieren und zurückkommen. –

+0

Und danke für die Nachfolge Orochi;) –

32

Dies ist genau das, was Sie wollen ...

// Do this inside your Controller before you return your ViewModel 
$this->layout()->setVariable('stack', 'overflow'); 

// Then inside your layout.phtml 
echo $this->stack; 

Keine Ansicht Helfer, kein Event-Manager, kein Service Manager oder andere Klassenmethode Jonglieren. Warum machen Leute auf Stack die Dinge manchmal so kompliziert?

+2

Danke, Alter, aber das wusste ich schon. Die Frage ist, in welchem ​​Controller, es ein für alle Mal zu tun! d. h. nur an einem Ort, aber überall zugänglich und die richtige Antwort ist, dass Sie es nicht in einem Controller tun. Welche stefanovalle freundlicherweise zur Verfügung gestellt hat die onBootstrap Lösung. Danke sowieso :) –

+0

Weil deine einfache Lösung nicht skalierbar ist. –

+0

Fehler mit Zend 1.12: Methode "Layout" existiert nicht und wurde nicht in __call() –

0

Sie können globalen Variable zum Layout von Anwendung/module.php in ZendFramework passieren 2 mit Module wie folgt:

in Ihrer Anwendung/module.php

Schritt 1:

use Zend\ModuleManager\Feature\AutoloaderProviderInterface; 
use Zend\ModuleManager\Feature\ConfigProviderInterface; 
use Zend\Mvc\MvcEvent; 

Schritt 2:

class Module implements AutoloaderProviderInterface, ConfigProviderInterface 
{  
    public function onBootstrap(MvcEvent $e) 
    { 
     $eventManager  = $e->getApplication()->getEventManager(); 
     $eventManager->attach('dispatch', array($this, 'loadConfiguration')); 
    }  
    public function loadConfiguration(MvcEvent $e) 
    {   
      $controller = $e->getTarget(); 
      $controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE; 
    } 


    // Your remaining code here.... 

} 

Schritt 3:

In Ihrer layout.phtml Datei verwendet Ihre Variable als $this->YOUR_VARIABLE_NAME

Ich hoffe, das hilft.

+0

Downvoting hier, da dieser Code nicht funktioniert und eigentlich nicht der richtige Ansatz entweder. 1) $ Controller ist nicht definiert, sollte aus dem MvcEvent genommen werden, ist es aber nicht. 2) Sie sollten über den Controller auf das Layout zugreifen. Holen Sie es direkt über das View-Modell des MvcEvent, wie die angenommene Antwort zu dieser Frage nahelegt. –

+0

Ich definiere nur $ Controller-Variable hier, jetzt der Code OK, denke ich. und manchmal möchten Sie eine globale Variable zu jeder Aktion von Ihrem Modul hinzufügen. nur für den Fall, dass Sie für diesen Ansatz gehen können. So können Sie authentifizierte Benutzervariablen über diese Tricks hinzufügen, um Ihren Benutzer bei jeder Aktion Ihres Moduls zu unterstützen –

2

in Ihrer Anwendung/module.php 1) Erstellen Sie ein Dispatch-Ereignis für Zend Framework wie folgt aus:

public function onBootstrap(MvcEvent $e) 
{ 
    $eventManager  = $e->getApplication()->getEventManager(); 
    $eventManager->attach('dispatch', array($this, 'loadConfiguration')); 
}  
public function loadConfiguration(MvcEvent $e) 
{   
     $controller = $e->getTarget(); 
     $controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE; 
} 

2) Jetzt können Sie Ihre definierten Variablen wie dies in Ihrem Layout zugreifen: $ this- > YOUR_VARIABLE_NAME;

0

Warum Vererbung verwenden, um wiederholbare Konfiguration über einen Basis-Controller zu abstrahieren, der die Layoutvariablen festlegt. Da hier die Wiederverwendung im Vordergrund steht, sollte die grundlegende OOP ausreichen. Zend muss nicht alles machen :).

Verwandte Themen