Ciao a tutti,
sto realizzando un sito nel quale gli utenti possono ricoprire 2 ruoli: aziende o comuni.
A ogni ruolo corrisponde un profilo differente con diversi campi da compilare.
L'utente in fase di registrazione può scegliere quale ruolo ricoprire e, in base a questo, gli sarà chiesto di compilare i campi che appartengono al suo profilo.
Questa soluzione è implementabile grazie ai moduli rolesignup e nodeprofile.
La procedura è spiegata dettagliatamente quì.
Per un po tutto ha funzionato a dovere ma, all'improvviso, mi si è presentato un problema: durante la registrazione i campi da compilare che appaiono all'utente sono sempre gli stessi indipendentemente dal ruolo che sceglie.
C'è qualcono che ha sperimentato lo stesso problema e ha trovato una soluzione?
Io ho fatto qualche cosa simile usando un modulo che si chiama... non ricordo, spè che vado a cercare.. inline_registration, che però non viene più mantenuto e ho dovuto farci un pò di modifiche (alcune delle quali sono pubblicate sulle issue del modulo).
Ciao
Marco
--
My blog
Working at @agavee
Ti ringrazio per la segnalazione ma purtroppo il modulo inline_registration ha alcune mancanze per l'uso che ne voglio fare:
Spulciando il forum di drupal.org ho trovato anche questa soluzione.
Per ogni ruolo si può creare una pagina di registrazione diversa e la procedura sembra funzionare.
Ma anche in questa maniera mi si è presentato un problema, cioè la funzione user_save non riesce ad assegnare il ruolo prescelto al nuovo utente creato.
Qualche consiglio?
Per questo problema c'è un modulo che ti permette di settare appunto la quantità dei nodi inseribili per ogni ruolo..Lo provai in passato ma nn ricordo il nome... prova a vedere su D.org
Ma hai guardato nelle impostazioni menu se puoi disattivarlo ?..Se nn puoi con il Navigation menu di default,puoi sempre creare un'altro menu e spostare i link che ti servono,lasciando gli altri in un menu "invisibile"...
Dovrebbe essere nodefamily, grazie per la dritta.
Ok, posso nascondere il collegamento nel menu Navigazione e creare un nodo di presentazione/spiegazione dal quale accedere alle diverse pagine di registrazione.
Rimane comunque il problema di assegnare automaticamente il rispettivo ruolo ai nuovi utenti.
Possibili soluzioni?
@gatsu980: da una passata esperienza con i due moduli ti posso confermare che nelle ultime release i due moduli erano diventati incompatibili per via del non corretto riconoscimento, da parte di nodeprofile, del ruolo selezionato tramite rolesignup. So che Freso e Michelle (li trovi su Drupal.org) e altri dev avevano discusso su come gestire e riallineare i due moduli.. di più non so dirti.
ciao
Grazie anche a te per l'aiuto.
Controllerò se mi è sfuggita qualche patch per rolesignup o nodeprofile.
Edit: ho ricontrollato e non ho trovato alcuna patch per questo specifico problema.
@gatsu890: hemm.. vero, l'avevo aggiunta nel mio modulo che era derivato da inline :P
Ciao
Marco
--
My blog
Working at @agavee
E che non hai pubblicato? :'(
@gatsu890: avevo inviato un pò di patch ma non erano state prese minimamente in considerazione ed erano state lasciate fini a se stesse, quindi alla fine non mandavo più.. cmq appena riesco mando patch con cose da aggiornare :)
Ciao
Marco
--
My blog
Working at @agavee
Finalmente penso di aver risolto il mio problema. La soluzione che ho adotttato è questa.
La spiegazione non è molto chiara e ho dovuto faticare un pò per capire come funzionasse il tutto e come fare le modifiche che mi servivano.
Di seguito spiego il procedimento che ho seguito sperando che possa essere di aiuto per qualche utente.
Passo 1
Apri un qualsiasi editor testuale e copia/incolla il seguente codice:
<?php
if(isset($_SESSION['fillFields'])){
foreach($_SESSION['fillFields'] as $key=>$value){
$fieldValues[$key] .= "value="$value"";
}
}
if(isset($_SESSION['errorFields']['fields'])){
foreach($_SESSION['errorFields']['fields'] as $key=>$value){
$fieldValues[$key] .= " class="form-text error" ";
}
}
//print_r($_SESSION['fillFields']);
if(isset($_SESSION['errorFields'])){
echo '<div id="message"><div class="messages error">';
echo 'Si sono verificati i seguenti errori in fase di registrazione:';
echo '<ul>';
echo "<li>Uno o più campi richiesti non sono stati compilati correttamente</li>";
}
if(isset($_SESSION['errorFields']['email'])){
$fieldValues['email'] .= " value="".$_SESSION['fillFields']['email'].""class="form-text error" ";
echo "<li>".$_SESSION['errorFields']['email']."</li>";
}
if(isset($_SESSION['errorFields']['password'])){
$fieldValues['password'] .= " class="form-text error" ";
echo "<li>".$_SESSION['errorFields']['password']."</li>";
}
if(isset($_SESSION['errorFields']['acconsento'])){
$fieldValues['profile_acconsento'] .= " class="form-text error" ";
echo "<li>".$_SESSION['errorFields']['acconsento']."</li>";
}
if(isset($_SESSION['errorFields'])){
echo '</ul></div></div>';
}
?>
Salva il file di testo come formrly.inc nella cartella principale di Drupal.
Passo 2
Crea un nuovo nodo e copia/incolla il seguente codice
<?php
if(isset($_POST['email'])){
function is_valid_email($email) {
$result = TRUE;
if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $email)) {
$result = FALSE;
}
return $result;
}
function random_password($length = 10) {
// This variable contains the list of allowable characters for the
// password. Note that the number 0 and the letter 'O' have been
// removed to avoid confusion between the two. The same is true
// of 'I', 1, and l.
$allowable_characters = 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789';
// Zero-based count of characters in the allowable list:
$len = strlen($allowable_characters) - 1;
// Declare the password as a blank string.
$pass = '';
// Loop the number of times specified by $length.
for ($i = 0; $i < $length; $i++) {
// Each iteration, pick a random character from the
// allowable string and append it to the password:
$pass .= $allowable_characters[mt_rand(0, $len)];
}
return $pass;
}
function validate_pass($pass,$pass2) {
if ($pass != $pass2) return t('Le password devono coincidere.');
if (!strlen($pass)) return t('Devi inserire una password.');
if (ereg(' ', $pass)) return t('La password non può contenere spazi.');
if (ereg("[^\x80-\xF7[:graph:]]", $pass)) return t('La password contiene un carattere non consentito.');
if (preg_match('/[\x{80}-\x{A0}'. // Non-printable ISO-8859-1 + NBSP
'\x{AD}'. // Soft-hyphen
'\x{2000}-\x{200F}'. // Various space characters
'\x{2028}-\x{202F}'. // Bidirectional text overrides
'\x{205F}-\x{206F}'. // Various text hinting characters
'\x{FEFF}'. // Byte order mark
'\x{FF01}-\x{FF60}'. // Full-width latin
'\x{FFF9}-\x{FFFD}]/u', // Replacement characters
$pass)) {
return t('La password contiene dei caratteri non consentiti.');
}
if (strlen($pass) > 30) return t('La password è troppo lunga: deve contenere meno di 30 caratteri.');
$min_pass_length = variable_get('toboggan_min_pass_length', 0);
if ($min_pass_length && strlen($pass) < $min_pass_length) return t("La password è troppo corta: deve contenere almeno $min_pass_length caratteri.");
return 1;
}
//email processing
$email = $_POST['email'];
unset($_POST['email']);
//see if email address is valid
if(is_valid_email($email)){
$query = "select uid from users where name='".$email."'";
$emailSearch = db_fetch_object(db_query($query));
//If the email address exists then set the UID, otherwise set 0
if(is_object($emailSearch)){
//$userID = user_load(array($emailSearch->uid));
$errors['email'] = 'L\'indirizzo e-mail è già stato usato';
}
else{
$userID = 0;
}
}
//The email address is not valid
else{
$errors['email'] = 'L\'indirizzo e-mail non è valido';
}
//Password processing
if(isset($_POST['password1'])){
$valid_pass = validate_pass($_POST['password1'],$_POST['password2']);
if($valid_pass == 1){
$password = $_POST['password1'];
}
else{
$errors['password'] = $valid_pass;
}
}
else{
$password = random_password();
}
//verifica che la casella acconsento sia stata barrata
if(($_POST['profile_acconsento']) == 1){
$acconsento = $_POST['profile_acconsento'];
unset($_POST['profile_acconsento']);
}
else{
$errors['acconsento'] = 'Devi barrare la casella Acconsento';
}
//determine emails to be sent
if(isset($_POST['emailToIX'])){
$emailToIX = $_POST['emailToIX'];
unset($_POST['emailToIX']);
}
if(isset($_POST['emailToUser'])){
$emailToUser = $_POST['emailToUser'];
unset($_POST['emailToUser']);
}
//return for errors
if(isset($_POST['returnNode'])){
$returnNode = $_POST['returnNode'];
unset($_POST['returnNode']);
}
//set roles
if(isset($_POST['roles'])){
$roles = $_POST['roles'];
unset($_POST['roles']);
}
unset($_POST['submit']);
//Check if required & add variables
foreach($_POST as $key => $value){
if(substr($key, 0,9) == "required-"){
if(!is_array($value) && $value == ""){
$errors['fields'][substr($key, 9)] = $key;
}
$data[substr($key, 9)] = $value;
}
else{
$data[$key] = $value;
}
}
if(isset($errors)){
//There are errors so don't create the account yet. Instead, return the user to the form and show error messages
$_SESSION['errorFields'] = $errors;
$_SESSION['fillFields'] = $data;
$_SESSION['fillFields']['email'] = $email;
drupal_goto($returnNode);
}
else{
//Create the new user!
if($userID == 0){
$data['pass'] = $password;
$data['name'] = $email;
$data['mail'] = $email;
$data['profile_acconsento'] = $acconsento;
//add roles
$data['roles'] = $roles;
$data['status'] = isset($_POST['status']) ? $_POST['status'] : 1;
//create the account
$account = user_save($userID, $data);
//send user the mail
$variables = array('!username' => $email, '!site' => variable_get('site_name', 'Drupal'), '!password' => $password, '!uri' => $base_url, '!uri_brief' => substr($base_url, strlen('http://')), '!mailto' => $mail, '!date' => format_date(time()), '!login_uri' => url('user', NULL, NULL, TRUE), '!edit_uri' => url('user/'. $account->uid .'/edit', NULL, NULL, TRUE), '!login_url' => user_pass_reset_url($account));
$from = variable_get('site_mail', ini_get('sendmail_from'));
$subject = _user_mail_text('welcome_subject', $variables);
$body = _user_mail_text('welcome_body', $variables);
drupal_mail('user-register-welcome', $email, $subject, $body, $from);
drupal_set_message(t('Future istruzioni saranno spedite al tuo indirizzo e-mail.'));
//If the user is not already logged in then log them in as the new account
//global $user;
//if($user->uid == 0){
// user_authenticate($email, trim($password));
//}
//drupal_goto();
}
//send out all mail
if(isset($emailToIX)){
foreach($data as $key=>$value){
$mailMessage .= "$key: $value \n";
}
drupal_mail('New Website Registration', $emailToIX, 'New Website Registration', $mailMessage, '<a href="mailto:[email protected]" rel="nofollow">[email protected]</a>');
}
}
}
?>
Assegna il titolo Registrazione completata, il formato di input Php code e prendi nota del nid.
Passo 3
Crea un nodo diverso per ogni ruolo che vuoi assegnare in fase di registrazione.
Avrai così pagine di registrazione diverse per ogni ruolo
Per ogni ruolo modifica il codice sottostante alla bisogna e copia/incollalo nel nodo.
<?php
include("formrly.inc");
?>
Compilate tutti i campi obbligatori contraddistinti dall'asterisco (<span class="form-required" title="Questo campo è obbligatorio.">*</span>) e schiacciate il pulsante <em>Invia</em> alla fine della pagina per completare la procedura di registrazione.
<form id="form1" name="form1" method="post" action="/node/1">
<!-- "/node/1" è l'indirizzo della pagina Registrazione completata -->
<input type="hidden" name="status" value="0" />
<!-- "0" è il valore di status assegnato affinchè i nuovi utenti siano bloccati
Perchè gli utenti siano attivi cambia il valore in "1" -->
<input type="hidden" name="returnNode" value="node/2" />
<!-- "node/2" è il'indirizzo di questa pagina -->
<input type="hidden" name="roles[3]" value="3" />
<!-- "3" e "roles[3]" è il role id del ruolo che assegneremo ai nuovi utenti -->
<input type="hidden" name="emailToIX" value="[email protected]" />
<input type="hidden" name="emailToUser" value="1" />
<fieldset><legend>Informazioni di registrazione</legend><div class="form-item">
<label for="edit-name">E-mail: <span class="form-required" title="Questo campo è obbligatorio.">*</span></label>
<input type="text" maxlength="60" name="email" id="email" size="60" <?php echo $fieldValues['email']; ?> />
<div class="description">La punteggiatura non è consentita eccetto per i punti, i trattini e i trattini bassi.</div>
</div>
<div class="form-item">
<label for="edit-pass-pass1">Password: </label>
<input type="password" name="password1" id="password" size="25" <?php echo $fieldValues['password1']; ?> />
</div>
<div class="form-item">
<label for="edit-pass-pass2">Digita di nuovo la password: </label>
<input type="password" name="password2" id="password" size="25" <?php echo $fieldValues['password2']; ?> />
</div>
</fieldset>
<fieldset><legend>Informazioni personali</legend><div class="form-item">
<label for="edit-profile-nome">Nome: <span class="form-required" title="Questo campo è obbligatorio.">*</span></label>
<input type="text" maxlength="255" name="required-profile_nome" id="profile_nome" size="60" <?php echo $fieldValues['profile_nome']; ?> />
<div class="description"> </div>
</div>
<div class="form-item">
<label for="edit-profile-cognome">Cognome: <span class="form-required" title="Questo campo è obbligatorio.">*</span></label>
<input type="text" maxlength="255" name="required-profile_cognome" id="profile_cognome" size="60" <?php echo $fieldValues['profile_cognome']; ?> />
<div class="description"> </div>
</div>
<div class="form-item">
<label for="edit-profile-posizione">Posizione: </label>
<input type="text" maxlength="255" name="profile_posizione" id="profile_posizione" size="60" <?php echo $fieldValues['profile_posizione']; ?> />
<div class="description"> </div>
</div>
<div class="form-item">
<label for="edit-profile-tel-personale">Telefono: <span class="form-required" title="Questo campo è obbligatorio.">*</span></label>
<input type="text" maxlength="255" name="required-profile_tel_personale" id="profile_tel_personale" size="60" <?php echo $fieldValues['profile_tel_personale']; ?> />
<div class="description"> </div>
</div>
</fieldset>
<fieldset>
<legend>Informativa per il trattamento dei dati personali: </legend>
<div class="form-item">
<textarea rows="10" cols="60" readonly="readonly">
Informativa ex art. 13 d.lgs del 196/03
XXXXXXXXXX
</textarea>
</div>
Ai sensi dell'art. 23 del d.lgs 196/03, l'utente dichiara di avere preso visione dell'informativa ex art. 13 d.lgs del 196/03 e presta espressamente il suo consenso al trattamento dei suoi dati per le seguenti finalità: invio tramite e-mail, o a mezzo contatto telefonico, di materiale inerente i prodotti e/o i servizi di XXX Srl.
<div class="form-item">
<label><input type="checkbox" name="profile_acconsento" id="profile_acconsento" value="1" <?php echo $fieldValues['profile_acconsento']; ?> /> Acconsento al trattamento dei miei dati personali <span class="form-required" title="Questo campo è obbligatorio.">*</span></label>
<div class="description"></div>
</div>
</fieldset>
<p>
<input type="submit" name="Submit" value="Invia" />
<label>Shiaccia il pulsante per completare la registrazione</label>
</p>
</form>
Salva il nodo con il titolo Registrazione quellochevuoitu e il formato di input Php code.
Passo 4
Abilita il modulo Profile.
Vai in Amministra>Gestione Utente>Profili.
Crea dei nuovi campi per ogni campo aggiunto nelle pagine di registrazione, in questo caso:
FINE
PS: non sono molto pratico di php quindi non garantisco che questa soluzione funzioni per tutti.
Qualcuno con più dimestichezza di me dovrebbe dare un occhiata al codice per garantirne la correttezza/sicurezza.
@gatsu890: non prendertela, ma è una soluzione raccapricciante... avevi un modulo in mail da giorni :P
Ciao
Marco
--
My blog
Working at @agavee
Scusa se ti rispondo solo adesso ma considerando il mio problema praticamente risolto era da un po che non controllavo questa discussione.
Non me la prendo non ti preoccupare.
Piuttosto perchè consideri questa soluzione "raccapricciante"?
La realizazione è un casino, è vero, ma dal lato utente mi sembra abbastanza "pulita".
Oppure esiste qualche problema di sicurezza/compatibilità che ignoro?
Ho controllato e ricontrollato ma purtroppo non mi è arrivato nulla.
E ti garantisco preferirei utilizzare un modulo piuttosto che implementare una soluzione così complicata.
Contrordine, si torna a Rolesignup + Nodeprofile.
Preoccupato dalle parole di Mavimo sono tornato alla prima soluzione che avevo provato e poi abbandonato perchè il modulo Rolesignup si impallava dopo un breve utilizzo, non permettendo più all'utente di selezionare il ruolo desiderato.
Il problema si risolve abilitando i clean url.