• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • 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

Auf Daten zugreifen, wenn der Request kein Post ist

Frau Bauer

New member
Hallo,

ich stehe wieder einmal vor einem kleinen Problem:

Ich möchte den User mit seinem Namen (in der View) begrüßen. Dazu hole ich mir nach dem Post den Usernamen aus dem Formular.

Die klappt soweit auch nach dem ersten Absenden.

Wenn der User jedoch bereits angemeldet ist und zurückkehrt, findet ja kein Post mehr statt und der Username ist leer.

Hier mal meine indexAction:

PHP:
public function indexAction() {
   $form = $this->getLoginForm();

   $superUser = new SuperUser();
   $user      = new User();

   $viewModel = new ViewModel();
   $viewModel->setVariable( 'form', $form );

   $request = $this->getRequest();
   if ( $request->isPost() ) {
      $form->setData( $request->getPost() );
      if ( $form->isValid() ) {
         try {
            $accountName             = strtolower( $form->get( 'AccountName' )->getValue() );
            $superUser->_accountName = $accountName;
            $user->_superAccountName = $accountName;
            $superUser               = $this->getSuperUserTable()->getUser( $superUser );
            $viewModel->setVariable( 'superUser', $superUser ); // Auf das Superuser Objekt möchte ich in der View zugreifen. Auch nach einem Request, der kein Post ist! Wie stelle ich das am besten an?
         } catch ( \Exception $e ) {
            $viewModel->setVariable( 'message', 'Anmeldedaten falsch!' );

            return $viewModel;
         }

         if ( ! $this->authenticate( $this->getHash( $form ), $form )->isValid() ) {
            $viewModel->setVariable( 'message', 'Anmeldedaten falsch!' );
         }
      }
   }

   $flashmessenger = $this->flashMessenger();
   if ($flashmessenger->hasInfoMessages()) {
      $return = array();
      $return['messages'] = $flashmessenger->getInfoMessages();
      $viewModel->setVariable('successMessages', $return['messages']);
   }

   return $viewModel;

}
 

Frau Bauer

New member
Habs jetzt mal mit einer Variable probiert, die ich beim Post setze. Irgendwie funktioniert es aber trotzdem nicht:

PHP:
public function indexAction() {
   $form = $this->getLoginForm();

   $viewModel = new ViewModel();
   $viewModel->setVariable( 'form', $form );

   $request = $this->getRequest();
   if ( $request->isPost() ) {
      $form->setData( $request->getPost() );
      if ( $form->isValid() ) {
         $superUser = new SuperUser();
         $user      = new User();
         
         try {
            $accountName             = strtolower( $form->get( 'AccountName' )->getValue() );
            $superUser->_accountName = $accountName;
            $user->_superAccountName = $accountName;
            $superUser               = $this->getSuperUserTable()->getUser( $superUser );
            $this->setSuperUser($superUser);
         } catch ( \Exception $e ) {
            $viewModel->setVariable( 'message', 'Anmeldedaten falsch!' );

            return $viewModel;
         }

         if ( ! $this->authenticate( $this->getHash( $form ), $form )->isValid() ) {
            $viewModel->setVariable( 'message', 'Anmeldedaten falsch!' );
         }
      }
   }

   $flashmessenger = $this->flashMessenger();
   if ($flashmessenger->hasInfoMessages()) {
      $return = array();
      $return['messages'] = $flashmessenger->getInfoMessages();
      $viewModel->setVariable('successMessages', $return['messages']);
   }

   $viewModel->setVariable( 'superUser', $this->getSuperUser() );

   return $viewModel;

}
 

Kaiuwe

Super-Moderator
Wenn der User jedoch bereits angemeldet ist und zurückkehrt, findet ja kein Post mehr statt und der Username ist leer.
Ich entnehme deinem Beitrag, es geht um angemeldete Benutzer. Und genau dann hast du doch alle Daten! Wozu nochmals alles aus einem „Request“ lesen? Verwende einfach die hinterlegten Benutzerdaten!
Nachdem der Benutzer angemeldet ist, Umleitung auf gewünschte Seite setzen und dort im View-Skript per „Identity“-View-Helfer die Benutzerdaten holen.

Nichts mit Request oder POST, die Thematik ist bereits abgeschlossen und nur für den eigentlichen Anmeldeprozess notwendig.
 

Frau Bauer

New member
Danke KaiUwe. Durch dich habe ich schon so viel gelernt.

Ich habe es jetzt wie untenstehend realisiert. Leider ist mein AuthStorage nach dem Redirect leer, obwohl ich vorher die Daten reingeschrieben habe.
Vielleicht hast du noch den entscheidenden Tipp.

PHP:
public function indexAction() {
   $form = $this->getLoginForm();

   $viewModel = new ViewModel();
   $viewModel->setVariable( 'form', $form );

   $request = $this->getRequest();
   if ( $request->isPost() ) {
      $form->setData( $request->getPost() );
      if ( $form->isValid() ) {

         if ( ! $this->authenticate( $this->getHash( $form ), $form )->isValid() ) {
            $viewModel->setVariable( 'message', 'Anmeldedaten falsch!' );
         } else {
            $storage = $this->getAuth()->getStorage();
            $storage->write($this->getAuthAdapter()->getResultRowObject());
            $this->redirect()->toRoute('success');
         }
      }
   }

   return $viewModel;

}

public function successAction() {
   if (! $this->getAuth()->hasIdentity()) {
      return $this->redirect()->toRoute('home');
   } else {
      $viewModel = new ViewModel();

      $flashmessenger = $this->flashMessenger();
      if ( $flashmessenger->hasInfoMessages() ) {
         $return             = array();
         $return['messages'] = $flashmessenger->getInfoMessages();
         $viewModel->setVariable( 'successMessages', $return['messages'] );
      }

      var_dump($this->getAuth()->getStorage()); //hier sind keine Daten der Anmeldung drin!?
   }
 

Kaiuwe

Super-Moderator
PHP:
var_dump($this->getAuth()->getStorage()); //hier sind keine Daten der Anmeldung drin!?
Komplett leer dürfte es nicht sein, denn dann würde die vorherige Abfrage mit „hasIdentity“ schon anschlagen.

Somit würde ich mal einen Schritt davor schauen, was denn überhaupt als Inhalt geschrieben wird. Also hier:
PHP:
$storage->write($this->getAuthAdapter()->getResultRowObject());
 

Frau Bauer

New member
Somit würde ich mal einen Schritt davor schauen, was denn überhaupt als Inhalt geschrieben wird. Also hier:
PHP:
var_dump($this->getAuthAdapter()->getResultRowObject());die;
Liefert:
Code:
object(stdClass)#516 (3) {   ["AccountName"]=>   string(16) "info@example.com"   ["SuperAccountName"]=>   string(2) "tt"   ["AccountPasswd"]=>   string(44) "0f01a00abxxxxxxxxxx651c23b4ea16028a5b19afeae" }
 

Kaiuwe

Super-Moderator
Liefert:
Code:
object(stdClass)#516 (3) {   ["AccountName"]=>   string(16) "info@example.com"   ["SuperAccountName"]=>   string(2) "tt"   ["AccountPasswd"]=>   string(44) "0f01a00abxxxxxxxxxx651c23b4ea16028a5b19afeae" }
Dann stimmt dies soweit.

Leider doch nicht ganz, denn ein Passwort und selbst wenn es nur ein Hash ist, gehört da nicht rein! Daher:

PHP:
$resultRow = $adapter->getResultRowObject(
    [
        'AccountName',
        'SuperAccountName',
    ]
);

$user = new User($resultRow->AccountName); // Beispiel

$storage->write($user);
(„AccountName“ und „SuperAccountName“ sind für einen Außenstehenden – also mich – total verwirrend.)

Nach der Umleitung oder irgendwann später einfach:
PHP:
public function successAction()
{
    /** @var User $user */
    if ($user = $this->identity()) {
        // Benutzerdaten abfragen
        $user->getName();
    }
}
Oder im View-Skript:

PHP:
<?php
/** @var User $user */
$user = $this->identity();
?>
<p>Hallo <?= $user->getName() ?></p>
Mit „Bordmitteln“ ist dies also schnell gelöst! :D
 

Kaiuwe

Super-Moderator
PHP:
public function successAction() {
   if (! $this->getAuth()->hasIdentity()) {

   } else {
      $viewModel = new ViewModel();

      $flashmessenger = $this->flashMessenger();
      if ( $flashmessenger->hasInfoMessages() ) {
         $return             = array();
         $return['messages'] = $flashmessenger->getInfoMessages();
         $viewModel->setVariable( 'successMessages', $return['messages'] );
      }

   }
Der „FlashMessenger“-Kram kann hier ebenfalls komplett weg!


Einfach:
PHP:
public function loginAction()
{
    // Anmeldeprozess

    $this->flashMessenger()->addSuccessMessage(
        'Deine Anmeldung war erfolgreich'
    );

    // Umleitung
}
Im View-Skript dann nur:
PHP:
<h3>Willkommen</h3>

<?php
// Erfolgsmeldung mit entsprechenden Klassen für CSS
echo $this->flashMessenger()->render(
    Zend\Mvc\Plugin\FlashMessenger\FlashMessenger::NAMESPACE_SUCCESS,
    [
        'alert-box',
        'success',
    ]
);
?>
 

Frau Bauer

New member
Hallo KaiUwe. Wow. Danke für deine Tipps.
Zur Erläuterung:
AccountName -> ist der Anmeldename des Accounts.
SuperAccountName -> ist der Name der Person zur persönlichen Begrüßung.
Namen wurden so vorgegeben.

Aber du hattest wohl doch Recht: Beim Speichern in den Storage geht wohl etwas schief.

Meine Anmelde-Funktion sieht derzeit so aus:

PHP:
public function indexAction() {
   $form = $this->getLoginForm();

   $viewModel = new ViewModel();
   $viewModel->setVariable( 'form', $form );

   $request = $this->getRequest();
   if ( $request->isPost() ) {
      $form->setData( $request->getPost() );
      if ( $form->isValid() ) {

         if ( ! $this->authenticate( $this->getHash( $form ), $form )->isValid() ) {
            $viewModel->setVariable( 'message', 'Anmeldedaten falsch!' );
         } else {
            $storage = $this->getAuth()->getStorage();
            $adapter = $this->getAuthAdapter();
            $resultRow = $adapter->getResultRowObject(array(
               'AccountName',
               'SuperAccountName'
            ));
            $superUser = new SuperUser();
            $superUser->setAccountName($resultRow->AccountName);
            $superUser->setSuperAccountName($resultRow->SuperAccountName);
            $storage->write($superUser);
            var_dump($superUser);die; // hierin befinden sich AccountName und SuperAccountName aus dem ResultRow Objekt.
            var_dump($storage);;die; // hierin befindet sich u.a. folgendes:
            // object(ZendSkeletonModule\Model\SuperUser)#448 (3) { ["_accountName"]=> NULL ["_superAccountName"]=> NULL ["_accountPasswd"]=> NULL }
            // das SuperUser Objekt müsste doch eigentlich die obigen Daten enthalten!?
            $this->redirect()->toRoute('success');
         }
      }

   }

   return $viewModel;

}
Vielleicht kannst du mir hier weiterhelfen. Wenn du noch Infos brauchst, sag mir einfach welche und ich liefere sie.

Herzlichen Dank
 

Kaiuwe

Super-Moderator
Aber du hattest wohl doch Recht: Beim Speichern in den Storage geht wohl etwas schief.
Schau dir mal direkt die Superglobale „$_SESSION“ an und nicht „$storage“:

PHP:
var_dump($_SESSION);

// und genauer hier
var_dump($_SESSION['Zend_Auth']);
Denn dies ist das endgültige Ziel, wo die Daten hingeschrieben werden. (außer man hat eine andere Speicherung angegeben)
 
Zuletzt bearbeitet:

Frau Bauer

New member
Danke. In $_SESSION['Zend_Auth'] steht alles korrekt drin.

Wie nutze ich das jetzt mit dem Framework. Mit $_SESSION zu hantieren ist ja nicht sehr elegant.
 

Kaiuwe

Super-Moderator
Wie nutze ich das jetzt mit dem Framework. Mit $_SESSION zu hantieren ist ja nicht sehr elegant.
Wir haben nur geprüft, ob alles an der richtigen Stelle eingetragen wurde.

Den Rest findest du bereits oben in meinem Beitrag mit den „Identity“-View-Helfer und -Plugin.

Hier noch ein anderer Beitrag zu dem Thema: http://www.zfforum.de/zf3-allgemein/13201-wie-kann-ich-die-default-db-local-php-mit-den-authentification-prozess-durchfuehren.html
 
Zuletzt bearbeitet:
Oben