• Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

forward und Datenübergeben?

tsedeke

New member
Hallo ich hab eine validationAction, die meine Daten prüft.
Bei einem Fehlern ruf ich mit _forward die Action auf die die Form Maske wieder aufbaut und die fehlerhaften Felder anzeigt.
Wie aber kann ich am besten die in der validationAction gesammelten Daten weiter an die nächste Action übergeben. Mit Zend Register? Halte ich für nicht so gut.
 

wschott

New member
Im letzten Argument, welches man übergeben kann, glaube das heißt $param, kann man ein Array übergeben. Da kannst du z.B. dann $this->_forward('action', 'controller', 'module', array('logincheck'=>'invalid')); übergeben. Auf die Art und Weise kann man dann Daten übergeben.

Alternativ geht natürlich der Weg über eine Registry oder ähnliches.
 

awu

New member
Ich habe es über eine Unterfunktion _renderForm gemacht:

PHP:
// wenn es Eingabefehler gab, zurück zum Formular
        if(!$this->getFormValidator()->isValid()) {

            $this->_renderForm('EDIT', $aData, 'VALID_ERR');
PHP:
    /**
     * Rendert das Formular, leer oder gefüllt, ggf. mit Meldungen über Eingabefehler
     *
     * @param $fp_sMode     string  Darstellungsmodus 'ADD' oder 'EDIT'
     * @param $fp_aVDatA  string  im Falle 'EDIT' müssen die darzustellenden Daten als Array übergeben werden
     * @param $fp_sOption   string  VALID_ERR, wenn Eingabefehler gerendert werden sollen
     */
     protected function _renderForm($fp_sMode, $fp_aData = null, $fp_sOption = null) {
Ich habe mir dazu eine Klasse geschrieben, die die Informationen über das Validierungsergebnis hält (Feld, Fehlernachricht). Diese ist zentral für einen Action-Controller instantiiert.
 

tsedeke

New member
Danke für die Ideen.
Mir ist dann aber in der Doku aufgefallen, daß anstatt die ganzen Daten zurück an die Aktion mit der Form zurück zugeben, es einfacher ist die View aufzurufen die rendered werden soll.
Dafür gibt es die Eigenschaft: $this->_helper->viewRenderer->setScriptAction('dieGewünschteView');

In meinem Fall meine Edit oder Update View. Somit kann ich auch alle Daten (Values und Errors und Messages) übergeben. Ganz einfach mit $this->view->assign().
Das sieht dann etwa so aus:
PHP:
      if (count($errors)> 0)
        {
            $this->_helper->viewRenderer->setScriptAction('update');
            $this->view->assign('data',$data);
            $this->view->assign('errors',$errors);
            return;
        }

        $this->saveData($data, $_POST['action']);
Um reine messages weiter zu geben, soll man am besten den FlashMessenger Helper benutzen. (Laut Docu)
PHP:
    public function init()
    {
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
    }
Wobei ich bemerkt habe das bei einem forward es einen Fehler gibt. Bei redirect aber nicht. Hier verwende ich den Helper Redirector.
PHP:
    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');
    }
und dann weiter in der Action mit: $this->_redirector->gotoUrl('/meinController/');

Dies scheint mir auch der vorgesehene Weg.
Am einfachsten wäre wenn die Zend Framework Developer einen "Best Way" vorgegeben hätten. Ich hab das Gefühl viele hier Programmieren Sachen und Wege die so nicht gedacht waren und schon vorhanden sind :(
 

Stalker

New member
Definitiv fehlt der Doku ein Verzeichnis von "best practices", das wäre echt sehr hilfreich (gibts dafür schon ein proposal? wenn nich, *zuthomasrüberschiel*). Andererseits finde ich es auch gut, dass das ZF versucht, so wenig wie möglich in die Art einzugreifen, wie man entwickelt, denn sieh dir mal diverseste andere Frameworks an, zum Beispiel Symfony oder Cake. Da heißt es nämlich dann "Mach es so wie wir es wollen, oder mach es gar nicht".

Das ganze kann man also sowohl als Vorteil wie auch als Nachteil sehn.
 
Zuletzt bearbeitet:

tsedeke

New member
Genau deshalb bin ich hier uns nicht bei Symfony oder Cake.
Ich bereite mein Projekt nun ca. 2 Jahre vor und hab somit mir die Sprache und Tools/Frameworks genau ausgesucht.
Aber ein paar "best practices" sind notwendig. Die Entwickler haben sich ja paar Gedanken gemacht und ihre Ideen umgesetzt. Nun wäre es noch hilfreich zu wissen welche Wege (Mehrzahl;)) sie für Ihre Anwender vorgesehen haben.
Denn ich bin zwar nicht all zu gut in php aber auch ich erkenne wann ich eine "rektal dent" Operation/Programmierung mache oder sie sehe.:D
 

KingCrunch

New member
forward und redirect sind allerdings weiterhin zwei völlig verschiedene Sachen. Sie sind nicht einfach so gegeneinander austauschbar ;)
Und der Flashmessenger is vorallen für Nachrichten über Requests hinweg (kannst ja mal reingucken: Der instanziert ein Session-Objekt mit maximal 1 Hop).
 

tsedeke

New member
Genau King. Und dafür will ich ihn auch nutzen. Eben für nachrichten wie: Daten gesichert oder gelöscht usw.
Leider erhalte ich mit forward einen Fehler. Was mir ja einleuchtet da sie für Nachrichten über einen Request hinweg gedacht sind. Aber bei redirect ist das Session Objekt leer.
 

ChristianFischer

New member
Hm versuch mal bitte von Hand was in die Session zuschreiben und das auf einer anderen Seite wieder auszulesen.

Maybe verschluckt er bei redirect da was.

Edit:

Bzw. wie greifst du denn auf die Session zu und wie befüllst du sie ?
 

tsedeke

New member
So wie in der Docu:
PHP:
<?php
class SomeController extends Zend_Controller_Action
{
    /**
     * FlashMessenger
     *
     * @var Zend_Controller_Action_Helper_FlashMessenger
     */
    protected $_flashMessenger = null;


    public function init()
    {
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
        $this->initView();
    }

    public function myAction()
    {
        /**
         * default method of getting Zend_Controller_Action_Helper_FlashMessenger
         * instance on-demand
         */
        $this->_flashMessenger->addMessage('Record Saved!');
    }

    public function myNextRequestAction()
    {
        $this->view->messages = $this->_flashMessenger->getMessages();
        $this->render();
    }
}
mit $this->_redirector->gotoUrl('/manufacturers/');
leite ich es weiter.
 

tsedeke

New member
Arg liegt an php. Hab PHP 5.2.0 und ist ein Bug. "problem of loading arrays are fixed in php 5.2.1"

Hoffe das hilft allen weiter.
 
Oben