Benutzerverwaltung integrieren

Hier dreht sich alles um die auf der Webseite veröffentlichten Tutorials. // This forum is all about the APF tutorials.
Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Benutzerverwaltung integrieren

Beitrag von dr.e. » 23.03.2010, 10:51:26

Hallo Andreas,

ich habe eine gute und eine schlechte Nachricht. Das Verhalten ist kein Bug des APF, sondern ein Bug in deinem Controller. Da ich offensichtlich ebenso blind war wie du, hat mich das 1h gekostet um herauszufinden, was wirklich die Ursache ist. :D

Da du im DOM immer mit Referenzen arbeitest, erzeugt ein

Code: Alles auswählen

$form = &$this->__getForm('login') ;
...
$user = &$form->getFormElementByName('login-form-email');
...
$user = $umgt->loadUserByUsernameAndPassword(
   $user->getAttribute('value'),
   $pass->getAttribute('value')
);
natürlich eine Null-Referenz, was den beschriebenen Null-Pointer zur Folge hat. Das kann ich leider mit keinem Mittel der Welt unterbinden, denn sowas kann immer passieren. In JAVA könnte man höchstens mit einer immutable map arbeiten, was in PHP leider (oder besser so? ;)) nicht funktioniert.

Änderst du die "erste" Variable z.B. auf $email - also so:

Code: Alles auswählen

$form = &$this->__getForm('login') ;
...
$email = &$form->getFormElementByName('login-form-email');
...
$user = $umgt->loadUserByUsernameAndPassword(
   $email->getAttribute('value'),
   $pass->getAttribute('value')
);
- funktioniert das.
Viele Grüße,
Christian

Avedo

Re: Benutzerverwaltung integrieren

Beitrag von Avedo » 23.03.2010, 12:25:47

Guten Morgen!

Das ist mir jetzt schon ein bisschen peinlich... Solche Fehler sind der Tot. Danke für deine Hilfe. Es funktioniert hervorragend.

Nun da das Formular zumindest in Ansätzen funktioniert stellt sich mir gleich das nächste Problem. Ich würde gerne in meinem Haupttemplate ein Platzhalter einbauen, der durch eine tagLib gefüllt wird, die ihre Daten von allen möglichen Seiten beziehen kann. In diesem Kästchen sollen Fehler beim Login, Bestätigungen beim Eintrag eines neuen Artikels und solche Dinge angezeigt werden. Ich habe mir deshalb überlegt, dass es doch ganz praktisch wäre, in diesem Fall auf eine statische tagLib-Klasse zurück zu greifen. Diese könnte ungefähr so aussehen.

Code: Alles auswählen

<?php

/**
 * @namespace sites::avedo_projects::pres::taglib
 *
 * TagLib implementation to display messages from
 * different application layers.<br />
 *
 * @author Andreas Wilhelm
 * @version
 * Version 0.1, 23.03.2010<br />
 */
class curr_taglib_message extends Document {

  private static _messages = array();

	/**
	 * The default constructor that does 
	 * pretty nothing.
	 */
	public curr_taglib_message() {
		// do nothing
	}

	/**
	 * @public
	 *
	 * Adds a message to the message stack.<br />
	 *
	 * @author Andreas Wilhelm
	 * @version
	 * Version 0.1, 23.03.2010<br />
	 */
	public static function addMessage($msg) {
		array_push($this->_messages, $msg);
	}

	/**
	 * @public
	 *
	 * Implements the Document's transform() method. 
	 * Returns the message stack.<br />
	 *
	 * @author Andreas Wilhelm
	 * @version
	 * Version 0.1, 23.03.2010<br />
	 */
	public function transform() {
		$result = '';
    
		foreach($this->_messages as $msg) {
			$result .= $msg . '<br />';
		}
     
		return $result;
	}
}

?>
Wäre das eine sinnvolle Möglichkeit?

Liebe Grüße,

Andreas

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Benutzerverwaltung integrieren

Beitrag von dr.e. » 23.03.2010, 14:17:39

Hallo Andreas,

das Thema "peinlich" können wir uns ruhig teilen, ich hätte das auch eher sehen können. ;)
Ich habe mir deshalb überlegt, dass es doch ganz praktisch wäre, in diesem Fall auf eine statische tagLib-Klasse zurück zu greifen. Diese könnte ungefähr so aussehen.
Das kannst du gerne so lösen, du musst nur aufpassen, dass du das Timing beachtest. Eine Taglib wird gemäß dem Timing-Modell dann transformiert, wenn auch ihr Vater transformiert wird. Das bedeutet, dass du auf jeden Fall Messages aus der gleichen Hirarchie-Ebene (=gleiche Ebene von Baum-Zweigen) aufnehmen kannst, sofern du aber zeitlich "zu spät" dran bist, werden die Informationen nicht ausgegeben. Daher empfiehlt es sich, das erst mal so zu versuchen und wenn es nicht klappt noch eine andere Idee umzusetzen. Das können wir dann aber zu gegebener Zeit diskutieren.
Viele Grüße,
Christian

Avedo

Re: Benutzerverwaltung integrieren

Beitrag von Avedo » 02.04.2010, 14:33:30

Guten Morgen!

Ich habe mir den Controller nochmals angesehen und mir sind noch ein paar Fehler aufgefallen. Zum Beispiel wurde die Navigation immer nur direkt nach dem Absenden des Formulars angezeigt, sonst nicht. Deshalb habe ich nun eine Überprüfung auf die Session an den Anfang gebaut. Außerdem wurde der Benutzer noch beim Benutzernamen und Passwort geladen, obwohl ich nach der Email-Adresse frage. Diese Fehler wurden nun behoben.

Allerdings gibt es noch ein kleines Problem. Die Navigation wird nicht angezeigt und ich würde jetzt gerne wissen, wo ich sie ablegen muss, denn es wird in der Fehlermeldung kein Namespace angegeben. Dabei betrifft das diese Zeile.

Code: Alles auswählen

$menu = &$this->__getTemplate('menu');
$menu->transformOnPlace();
Liebe Grüße,

Andreas

Anhang:

Code: Alles auswählen

<?php

	import('tools::link','FrontcontrollerLinkHandler');
	import('modules::usermanagement::biz','umgtManager');
	import('core::session','SessionManager');

	/**
	 * @package modules::usermanagement::pres::documentcontroller
	 * @class login_controller
	 *
	 * Document controller for the login view of the usermanagement module.
	 * If a user is just a guest it will show the loginform and if a user is logged
	 * in it will show a administration menu in the left sidebar.
	 *
	 * @author Andreas Wilhelm
	 * @version
	 * Version 0.1, 19.03.2010<br />
	 */
	class login_controller extends base_controller {

		public function login_controller(){
		}

		/**
		 * @public
		 *
		 * Displays the form or the administration menu 
		 * and handles the user input.
		 *
		 * @author Andreas Wilhelm
		 * @version
		 * Version 0.1, 19.03.2010<br />
		 */
		function transformContent() {

			// Create an instance of the session manager, ...
			$sm = new SessionManager('modules::usermanagement::pres::documentcontroller::login_controller');

			// ... load all data and check if a session exists.
			if( $sm->loadSessionData('user') != null ) {
   				// Load the menu template ...
					$menu = &$this->__getTemplate('menu');

					// ... and dump it.
					$menu->transformOnPlace();

					return;
			}

			// Load the login form, ...
			$form = &$this->__getForm('login') ;

			// ... generate a generic action url, ...
			$action = FrontcontrollerLinkHandler::generateLink($_SERVER['REQUEST_URI'],$_REQUEST);
			
			// ... assign it to the form tag ...
			$form->setAction($action);
			
			// ... and check if it was submitted.
			if( $form->isSent() && $form->isValid() ) {
				// Get the submitted email address ...
				$email = &$form->getFormElementByName('login-form-email');
				
				// ... and the password.
				$pass = &$form->getFormElementByName('login-form-password');
				
				// Get the business object, ... 
				$umgt = &$this->__getAndInitServiceObject('modules::usermanagement::biz','umgtManager','Default'); 

				// ... load the user with this email and password ...
				$user = $umgt->loadUserByEmailAndPassword(
					$email->getAttribute('value'),
					$pass->getAttribute('value')
				);

				// ... and check if he exists.
				if( $user == null ) {
					// Dump the form.
					$form->transformOnPlace();
				} 
				
				else {
					// User does exist so create a new user session ...
					$sm->saveSessionData('user', $user);
   
   				        // ... and show the administration menu
					$menu = &$this->__getTemplate('menu');
					$menu->transformOnPlace();
				}
			}
			
			// The form was not submitted or not valid.
			else {
				// Load the language configuration, ...
				$config = &$this->__getConfiguration('modules::usermanagement','language');
				
				// ... label the submit button, ...
				$button = &$form->getFormElementByName('login-form-send');
				$button->setAttribute('value',$config->getValue($this->__Language,'form.button'));

				// ... fill listeners with the language dependent values ...
				$addrError = &$form->getFormElementByID('addr-error');
				$addrError->setPlaceHolder(
					'content', 
					$config->getValue($this->__Language,'form.email.error')
				);
				
				$passError = &$form->getFormElementByID('pass-error');
				$passError->setPlaceHolder(
					'content', 
					$config->getValue($this->__Language,'form.pass.error')
				);

				// ... and dump the form.
				$form->transformOnPlace();
			}
		}
	}
?>

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Benutzerverwaltung integrieren

Beitrag von Screeze » 02.04.2010, 15:00:57

Hi,
ich versuch dir mal weitestgehend zu helfen.

Erstmal:
Zeig mal bitte die .html datei, welche zu dem controller gehört.

DIe müsste theoretisch so in der art aussehen:

Code: Alles auswählen

<@controller  namespace="namespace hier"  file="login_controller" class="login_controller" @> 
<html:template  name="menu"> 
// der menücode hier 
</html:template> 

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Benutzerverwaltung integrieren

Beitrag von dr.e. » 05.04.2010, 19:30:49

Hallo Andreas,

ich tippe - wie Ralf auch - auf einen Fehler im Template. Der Controller-Code ist eigentlich für den beschriebenen Zweck korrekt.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast