verschiedene rollen, verschiedene Anmeldungen
am 21.05.2008 - 22:21 Uhr in
Hallo,
mich beschäftigt sehr intensiv eine Lösung um 2 verschiedene Regestrierungformulare zu kreieren.
Folgend soll demonstrieren was gemeint ist:
es gibt Benutzerolle: A und Benutzerolle: B
beide sollen sich durch den Regestrieren-Button automatisch regestrieren können, jedoch
soll Benutzer A nur 4 Felder der Regestrierungseingaben eingeben und sehen, Benutzer B dafür aber 7.
Im Klartext, es sollen 2 verschiedene Formulare für die Regestrierung erstellt werden, diese mit jeweils einer zugewiesenen Rolle.
Ich habe bisher über das profile-Modul ein Gesamtfeld zur Regestrierung ( Name, telefon, Unternehmen) angelegt, hierbei kannn der neue User eine Rolle durch das "Apply for role Modul" sprich: a oder b auswählen. Das ist aber nicht die wirkliche Lösung.
Wie erwähnt es soll möglich sein zu sagen, ich möchte mich für Rolle A oder B regestrieren, wenn A gewählt kommt ein Formular, dass direkt in diese rolle abspeichert mit 4 feldern. Bei B speichert es den User für die Rolle B ab, hier sind dann 7 Felder zu befüllen.
Hoffe das war nicht zu unverständlich..
- Anmelden oder Registrieren um Kommentare zu schreiben
Wie ist dieser Ansatz: Du
am 22.05.2008 - 01:08 Uhr
Wie ist dieser Ansatz:
Du erstellst ein Profil-Feld zum auswählen der Rolle bei Registrierung.
Mit einem eigenen Modul fragst du dieses Feld ab und änderst das Formular entsprechend, blendest die zusätzlichen Felder ein...
der ansatz ist gut, leider
am 22.05.2008 - 12:25 Uhr
der ansatz ist gut, leider weiss ich nicht wie ich das angehen soll.
Hier ein wenig Code ..
am 22.05.2008 - 13:57 Uhr
.. für eine eigene Registrierung. Hierbei war die Schwierigkeit das die Daten auf einer externen Datenbank liegen die entsprechend eingebunden werden musste. Es gibt zwei Rollen "Standard" und "Premium". Schau einfach mal in die Funktion abc_registrierung_form(), hier habe ich ein Beispiel mit '#access' => ($premium == 3)? TRUE : FALSE, eingebunden.
Der Code ist natürlich verfremdet, sollte dir aber weiter helfen.
<?php
// $ID$
/**
* @file
* In diesem Script werden die Anpassungen gemacht
*/
/**
* Das Menüsystem
*/
function abc_menu($may_chache)
{
// Holen des User-Objektes
global $user;
$items = array();
// nur für angemeldete User
if(!$may_chache && ($user -> uid > 0))
{
// Zugriff auf das Registrierungsformular für Standard-Mitgliedschaft für NichtMitglieder
$items[] = array(
'path' => 'abc/registerstandard',
'title' => t('Antrag auf kostenlose Registrierung'),
'callback' => 'abc_registerablehnung',
'access' => TRUE,
'type' => MENU_CALLBACK
);
// Zugriff auf das Registrierungsformular für Premium-Mitgliedschaft für Nichtmitglieder
$items[] = array(
'path' => 'abc/registerpremium',
'title' => t('Antrag auf Premium Registrierung'),
'callback' => 'abc_registerablehnung',
'access' => TRUE,
'type' => MENU_CALLBACK
);
}
// nur für nicht angemeldete User
else
{
// Zugriff auf das Registrierungsformular für Standard-Mitgliedschaft für NichtMitglieder
$items[] = array(
'path' => 'abc/registerstandard',
'title' => t('Antrag auf kostenlose Registrierung'),
'callback' => 'abc_registerstandard',
'access' => TRUE,
'type' => MENU_CALLBACK
);
// Zugriff auf das Registrierungsformular für Premium-Mitgliedschaft für Nichtmitglieder
$items[] = array(
'path' => 'abc/registerpremium',
'title' => t('Antrag auf Premium Registrierung'),
'callback' => 'abc_registerpremium',
'access' => TRUE,
'type' => MENU_CALLBACK
);
}
// Nur für angemeldete User die abc-Mitglieder sind und sich auf der Seite registriert haben
if (($uid = $user -> uid) && is_numeric($uid))
{
if ($user->uid and $user -> abc_member_id > 0)
{
$access = true;
$acc = $user;
}
if ($access)
{
$items[] = array('path' => 'user/'.$uid.'/abc_profil',
'title' => t('Mein Profil'),
'access' => TRUE,
'callback' => 'abc_user_page',
'callback arguments' => array($acc),
'type' => MENU_LOCAL_TASK,
'weight' => 0,
);
}
}
return $items;
} // END abc_menu()
/**
* Registrierung einer Standard-Mitgliedschaft
*/
function abc_registerstandard()
{
$uebergabe = '';
$uebergabe .= drupal_get_form('abc_registrierung_form');
return $uebergabe;
} // END abc_registerstandard()
/**
* Registrierung einer Premium-Mitgliedschaft
*/
function abc_registerpremium()
{
$uebergabe = '';
//$values = array('abc_registrierung_form' => 2);
$uebergabe .= drupal_get_form('abc_registrierung_form', $uid, $values, 3);
return $uebergabe;
} // END abc_registerpremium()
/**
* Ablehnung für registrierte Mitglieder
*/
function abc_registerablehnung()
{
$uebergabe = 'Sie sind schon Mitglied der abc<br />Zur Änderung der Mitgliedschaft senden Sie uns eine Mail oder benutzen Sie das Mitgliedsprofil.<br /><br />Ihr abc-Team';
return $uebergabe;
} // END abc_registerablehnung()
/**
* Funktion zur Registrierung der Daten einer Registrierung
*
* @param $uid - Integer :: Die System-UID der abc-Datenbank
* @param $values - Array :: Kann alle Werte zur Übergabe enthalten
* @param $premium - Integer :: steht auf 2 wenn eine Premium-Mitgliedschaft angefordert wird
*
* @return $form - Array :: enthält alle benötigten Formularelement nach Drupal-Syntax
*/
function abc_registrierung_form($uid = 0, $values = array(), $premium = 0)
{
// Div-Container für CSS-Layout
$form = array(
'#prefix' => '<div class="reg_form">',
'#suffix' => '</div>'
);
// Setzen des Multipart um das hochladen eine Photos zu ermöglichen
$form['#attributes']['enctype'] = 'multipart/form-data';
// Das erste Fieldset mit den Basisdaten
$form['basisdaten'] = array(
'#title' => t('Die Basisdaten'),
'#type' => 'fieldset',
'#description' => t('Alle Daten die mit einem * gekennzeichnet sind, sind Pflichtangaben. Wir gehen mit Ihren Daten selbstverständlich vertraulich um.'),
'#prefix' => '<div class="reg_form_basisdaten">',
'#suffix' => '</div>'
);
$form['basisdaten']['benutzername'] = array(
'#title' => t('Benutzername'),
'#type' => 'textfield',
'#description' => t('mindestens vier Buchstaben'),
'#maxlength' => 50,
'#size' => 50,
'#required' => true,
'#default_value' => ((array_key_exists('benutzername', $values))?$values['benutzername']:''),
'#disabled' => ((array_key_exists('benutzername', $values) and $values['benutzername'] != '')?true:false),
); //
$form['basisdaten']['f_name'] = array(
'#title' => t('Vorname'),
'#type' => 'textfield',
'#maxlength' => 50,
'#size' => 50,
'#required' => true,
'#default_value' => ((array_key_exists('f_name', $values))?$values['f_name']:''),
'#access' => ($premium == 3)? TRUE : FALSE,
);
$form['basisdaten']['l_name'] = array(
'#title' => t('Nachname'),
'#type' => 'textfield',
'#maxlength' => 50,
'#size' => 50,
'#required' => true,
'#default_value' => ((array_key_exists('l_name', $values))?$values['l_name']:''),
'#access' => ($premium == 3)? TRUE : FALSE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Senden'),
'#prefix' => '<div class="reg_form_submit">',
'#suffix' => '</div>'
);
return $form;
} // END abc_registrierung_form
/**
* Validierung der Formulareingaben aus der Registrierung
*/
function abc_registrierung_form_validate($form_id, $form_values)
{
// benutzername - Benutzername
// Prüfen auf Mindestlänge
if(strlen($form_values['benutzername']) < 4)
{
form_set_error('benutzername', t('Der Benutzername ist zu kurz'));
}
// Prüfen ob der Benutzername oder die Email schon vorhanden ist
else
{
// prüfen ob der Benutzername schon im Drupalsystem ist
// Abfrage auf die Tabelle {users}, ggf. Ermitteln des Status und des Anlegedatums
$query_drupal = 'SELECT created, status, name, mail, init FROM {users} WHERE name = LOWER("%s") OR mail = LOWER("%s") OR init = LOWER("%s")';
$ergDB_drupal = db_query($query_drupal, $form_values['benutzername'], $form_values['email'],$form_values['email']);
// prüfen ob Ergebnisse gefunden wurden
if(db_num_rows($ergDB_drupal) > 0)
{
// holen der Benutzer-Daten
while($erg_drupal = db_fetch_array($ergDB_drupal))
$benutzer_drupal[] = $erg_drupal;
// das darf nie passieren - sonst ist etwas schief gelaufen
if(count($benutzer_drupal) > 1)
{
drupal_set_message('Es ist zu einem scherwiegenden Fehler gekommen. Bitte wenden Sie sich an den Administrator; Fehler k78lv.');
drupal_goto('./');
}
// es ist nur ein Nutzer gefunden
elseif(count($benutzer_drupal) == 1)
{
// Der benutzer wurde gesperrt - aus dem Formular schießen
if(!$benutzer_drupal[0]['status'])
{
drupal_set_message('Sie wurden gesperrt, bitte wenden Sie sich an den Administrator; Fehler k78ls.');
drupal_goto('./');
}
// prüfen ob der Benutzername übereinstimmt
elseif(strcasecmp($form_values['benutzername'], $benutzer_drupal[0]['name']) == 0)
{
// prüfen ob die Email-Adressen übereinstimmen
if(strcasecmp($form_values['email'], $benutzer_drupal[0]['mail']) == 0 OR strcasecmp($form_values['email'], $benutzer_drupal[0]['init']) == 0)
form_set_error('benutzername', t('Der Benutzername %benutzername und die Email-Adresse %email sind schon vergeben. Sie können sich an die Mitgliederbetreuung wenden - <a href="@link">zur Mitgliederbetreuung</a> ',
array(
'%benutzername' => $form_values['benutzername'],
'%email' => $form_values['email'],
'@link' => url('contact')
)));
// es stimmt nur der Benutzername überein
else
form_set_error('benutzername', t('Der Benutzername %benutzername ist schon vergeben.', array('%benutzername' => $form_values['benutzername'])));
}
// nur die Email-Adresse ist schon registriert
else
form_set_error('email', t('Die Email-Adresse %email ist schon vergeben.', array('%email' => $form_values['email'])));
}
}
// Wenn in den Drupal-Usern kein Ergebnis vorlag - schauen wir in der abc-Datenbank nach
elseif($form_values['abc_uid'] == 0)
{
// Drupal db auf die abc-Datenbank umstellen
db_set_active('abc_db_member');
// Prüfen ob ein Mitglied schon mit dem Benutzernamen oder der Email existiert
$query_abc = 'SELECT m.idabc_member, m.benutzername AS name, a.email FROM abc_member AS m, abc_member_adress AS a WHERE (m.benutzername = LOWER("%s") OR a.email = LOWER("%s")) AND m.idabc_member = a.abc_member_id';
$ergDB_abc = db_query($query_abc, $form_values['benutzername'], $form_values['email']);
// Wenn Ergebniss auf der abc-Datenbank gefunden werden
if(db_num_rows($ergDB_abc) > 0)
{
// holen der Benutzer-Daten
while($erg_abc = db_fetch_array($ergDB_abc))
$benutzer_abc[] = $erg_abc;
// Die Datenbank wieder auf Default-Wert setzen
db_set_active('default');
// das darf nie passieren - sonst ist etwas schief gelaufen
if(count($benutzer_abc) > 1)
{
drupal_set_message('Es ist zu einem scherwiegenden Fehler gekommen. Bitte wenden Sie sich an den Administrator; Fehler g78lv.');
// Auf Startseite leiten
drupal_goto('./');
}
// es ist nur ein Nutzer gefunden
elseif(count($benutzer_abc) == 1)
{
// prüfen ob der Benutzername übereinstimmt
if(strcasecmp($form_values['benutzername'], $benutzer_abc[0]['name']) == 0)
{
// prüfen ob die Email-Adressen übereinstimmen
if(strcasecmp($form_values['email'], $benutzer_abc[0]['email']) == 0)
form_set_error('benutzername', t('Der Benutzername %benutzername und die Email-Adresse %email sind schon vergeben. Sie können sich an die Mitgliederbetreuung wenden - <a href="@link">zur Mitgliederbetreuung</a> ',
array(
'%benutzername' => $form_values['benutzername'],
'%email' => $form_values['email'],
'@link' => url('contact')
)));
// es stimmt nur der Benutzername überein
else
form_set_error('benutzername', t('Der Benutzername %benutzername ist schon vergeben.', array('%benutzername' => $form_values['benutzername'])));
}
// nur die Email-Adresse ist schon registriert
else
form_set_error('email', t('Die Email-Adresse %email ist schon vergeben.', array('%email' => $form_values['email'])));
}
}// END if - abc Datenbank
// Die Datenbank wieder auf Default-Wert setzen
db_set_active('default');
} // END else abc-DB überprüfen
} // END else Benutzernamen überprüfen
} // END abc_registrierung_validate()
/**
* Ergebnisse nach der Validierung erfassen
*/
function abc_registrierung_form_submit($form_id, $form_values)
{
// Wenn keine abc_id gesetzt ist = Neuregistrierung
if($form_values['abc_uid'] == 0)
{
// mach was mit den Daten
} // END if($form_values['abc_id'] == 0)
// ab hier werden updates gemacht
else
{
global $user;
if($aenderungen_gemacht)
drupal_set_message(t('Ihre Daten wurden geändert.'));
return 'user/'.$user -> uid.'/abc_profil';
}
// Die Registrierung ist abgeschlossen und der User muss über weiteres Vorgehen informiert werden
return 'dankeregister';
} // END abc_registrierung_fom_validaten()
Ich hoffe das hilft ein wenig. Denk daran die User auch im Drupal-System anzumelden (userr_save()), falls du das über eine eigene Datenbank machst.
Gruß
UwBach