2009-03-25 5 views
1

Wie kann ich zusätzliche Ansichtsparameter senden, nachdem ich eine Umleitung vorgenommen habe (z. B. $ this -> _ redirect-> gotoSimple();)?Zend: Ist es möglich, View-Variablen nach einer Weiterleitung zu senden?

Nehmen wir zum Beispiel an, ich habe eine Edit-Aktion, die den Benutzer zu einem Error-Action-Handler leitet und ich möchte in der Lage sein, benutzerdefinierte, detaillierte Fehlermeldungen an seine Ansicht zu senden. Zur Veranschaulichung es klarer, würde der Fluss sein:

  1. Auf der Edit-Ansicht (etwa http://localhost/product/edit), gibt die Nutzer etwas Gemeines
  2. Bei editAction(), eine Prüfung nicht löst eine Umleitung zu meinem Fehler Ansicht/Aktionshandler (so dass meine URL wie http://localhost/error/index lesen würde)
  3. Die Error/index.phtml nimmt eine "ErrorMessage" View-Variable, um die benutzerdefinierte Fehlermeldung anzuzeigen, und editAction() benötigt ein Mittel, um einen Wert an diese übergeben " errorMessage "view variable

Ein schneller Code Schnipsel würde wahrscheinlich wie aussehen:

Alle Lösungen oder sogar andere bessere Möglichkeiten, dies zu erreichen, wird sehr geschätzt.

Antwort

4

Ich habe nirgendwo gesehen, dass eine Aktion (editAction) auf die Ansicht einer anderen Aktion (errorView) zugreift. Für den speziellen Fall der Fehlerbehandlung verwendet meine Idee Exceptions. Sie verschiedene Ausnahmen für verschiedene schlechte Situationen zu werfen, und in Ihrer Fehlerbehandlungs Aktion können Sie entscheiden, was auf der Ausnahme Typ Benutzer zu zeigen, basiert:

// file: ProductContorller.php 
public function editAction() { 
    // some code 
    if ($badThing) { 
     throw new Exception('describe the bad thing',$errorCode); 
    } 
    if ($badThing2) { 
     throw new Exception('describe the other bad thing',$errorCode2); 
    } 
} 

// file: ErrorController.php 
public function errorAction() { 
    $error = $this->_getParam('error_handler'); 
    $exception = $error->exception; // the original Exception object thrown by some code 
    $code = $exception->getCode(); 
    switch ($code) { 
      // decide different things for different errors 
    } 
} 

Weitere Informationen zur Fehlerbehandlung ist die Zend Framework quick start ein großes Tutorial .

In anderen Situationen können Sie einen Nachrichtenmechanismus verwenden, um zwischen diesen beiden Aktionen zu kommunizieren. flashmessenger Action Helfer verwendet ist das erste, was kommt mir in den Sinn:

// file: ProductContorller.php 
public function editAction() { 
    // some code 
    if ($badThing) { 
     $this->_helper->flashMessenger->addMessage('error1'); 
     $this->_redirect('error'); 
    } 
    if ($badThing2) { 
     $this->_helper->flashMessenger->addMessage('error2'); 
     $this->_redirect('error'); 
    } 
} 

// file: ErrorController.php 
public function errorAction() { 
    $errors = $this->_helper->flashmessenger->getMessages(); 
    if (in_array('error1',$errors)) { 
     // do something 
    } // elseif (... 
} 

obwohl nicht vergessen, dass Sitzungen verwendet flashmessenger, so Sitzungen und höchstwahrscheinlich Cookies werden in diesem Messaging-Prozess einbezogen werden.

5

Verwenden Sie nicht gotoURL() für interne Weiterleitungen. Verwenden Sie gotoSimple(). I nimmt zu 4 Parameter auf:

gotoSimple($action, 
      $controller = null, 
      $module = null, 
      array $params = array()) 

In Ihrem Fall, es wird sein:

$this->_redirector->gotoSimple('index', 
           'error', 
           null, 
           array('errorMessage'=>$errMsg)); 

Siehe Redirector Zend_Controller_Action_Helper für weitere Einzelheiten.

3

Die Standardmethode hierfür ist der sitzungsbasierte Speicher einer Nachricht, die Sie anzeigen möchten. Es ist häufig genug, dass es einen View-basierten Helper gibt, FlashMessenger.

Der Flashmessenger Helfer erlaubt es Nachrichten zu übergeben, die der Benutzer kann Bedarf auf die nächste Anforderung zu sehen. Um dies zu erreichen, verwendet FlashMessenger Zend_Session_Namespace zu speichern Nachrichten für zukünftige oder nächste Anfrage Abruf.Es ist im Allgemeinen eine gute Idee , dass wenn Sie Zend_Session oder Zend_Session_Namespace planen, dass Sie initialisieren mit Zend_Session :: start() in Ihrer Bootstrap-Datei. (Siehe Zend_Session Dokumentation für mehr Details über die Verwendung.)

+0

Dies ist wirklich der beste Weg, um Nachrichten im Allgemeinen zu übergeben. Die akzeptierte Antwort ist ein speziellerer Fall für außergewöhnliche Fehler. –

0

gesetzt werde ich hinzufügen Dies gibt weitere Informationen darüber, wie die FlashMessenger-Klasse funktioniert (ich hatte einige Probleme, dies herauszufinden).

Ich habe irgendwo gelesen, dass eine Sitzung in Bootstrap.php gestartet werden soll

Zend_Session::start(); 

..aber mein Code ohne dass die Verwendung gearbeitet, so dass ich vermute, Sitzungen bereits begonnen werden.

Wir sind in einem Controller-Objekt und eine Aktionsmethode wird aufgerufen. Dann passiert etwas, wie ein Insert oder ein Edit in die Datenbank, alles wirklich.

Wir haben jetzt eine oder mehrere Nachrichten eingestellt. Ich benutze die folgende Syntax.

$this->_helper->FlashMessenger("Message in a bottle."); 

Welche genau ist das gleiche wie mit

$this->_helper->FlashMessenger->addMessage("Message in a bottle."); 

Diese Nachricht in der Sitzung setzt, können Sie dies direkt überprüfen, indem Aufruf

print_r($this->_helper->FlashMessenger->getMessages()); 
die(); 

Jetzt eine Umleitung gibt es zu eine neue URL (so eine neue Anfrage im Grunde), innerhalb der Controller + Aktion, die die Anfrage behandelt, werden wir die Nachrichten wie folgt hinzufügen:

$this->view->flashMessages = $this->_helper->FlashMessenger->getMessages(); 

Wir haben jetzt eine Wahl, wo diese Nachrichten ausgegeben werden. Wir können in einer Ansicht dies tun, dass „gehört“ eine gewisse Steuerung, so dass

views/scripts/index/index.phtml 

Der Nachteil hier sein könnte, ist, dass Sie den Code hinzufügen, müßten die Nachrichten an jedes Viewscript ausgibt, die es verwendet. Das ist nicht sehr DRY.

In meinen Augen ist eine überlegene Lösung folgende. Geben Sie diese Nachrichten in der Datei aus, in der Sie das grundlegende Layout Ihrer Anwendung definieren. Das ist wahrscheinlich

layouts/scripts/index.phtml 

Ich schrieb den folgenden Code dort.

<?php if(isset($this->flashMessages) && !empty($this->flashMessages)){ ?> 
    <ul id="messages">    
     <?php foreach($this->flashMessages as $message){?> 
      <li> 
       <?php echo $message;?> 
      </li>  
     <?php } ?> 
    </ul> 
<?php } ?> 
Verwandte Themen