Browse Source

[svn r14811] Added select and select multiple fields management

Yannick Warnier 17 years ago
parent
commit
1cc674c668
4 changed files with 123 additions and 24 deletions
  1. 5 1
      main/admin/user_fields.php
  2. 7 2
      main/admin/user_fields_add.php
  3. 33 2
      main/auth/profile.php
  4. 78 19
      main/inc/lib/usermanager.lib.php

+ 5 - 1
main/admin/user_fields.php

@@ -136,7 +136,11 @@ if(1)
 
 	// Create a sortable table with user-data
 	$parameters['sec_token'] = Security::get_token();
-	$table = new SortableTable('extra_fields', 'get_number_of_extra_fields', 'get_extra_fields',5);
+	$column_show = array(1,1,1,1,1,1,1,1,0);
+	$column_order = array(0,1,2,3,4,5,6,7,8);
+	$extra_fields = get_extra_fields(0,50,5,'ASC');
+ 
+	$table = new SortableTableFromArrayConfig($extra_fields, 5, 50, '', $column_show, $column_order, 'ASC');
 	$table->set_additional_parameters($parameters);
 	$table->set_header(0, '', false);
 	$table->set_header(1, get_lang('FieldLabel'));

+ 7 - 2
main/admin/user_fields_add.php

@@ -65,7 +65,7 @@ $types = array();
 $types[USER_FIELD_TYPE_TEXT]  = get_lang('FieldTypeText');
 $types[USER_FIELD_TYPE_TEXTAREA] = get_lang('FieldTypeTextarea');
 //$types[USER_FIELD_TYPE_RADIO] = get_lang('FieldTypeRadio');
-//$types[USER_FIELD_TYPE_SELECT] = get_lang('FieldTypeSelect');
+$types[USER_FIELD_TYPE_SELECT] = get_lang('FieldTypeSelect');
 //$types[USER_FIELD_TYPE_SELECT_MULTIPLE] = get_lang('FieldTypeSelectMultiple');
 $types[USER_FIELD_TYPE_DATE] = get_lang('FieldTypeDate');
 $types[USER_FIELD_TYPE_DATETIME] = get_lang('FieldTypeDatetime');
@@ -76,8 +76,12 @@ $form->addElement('text','fieldtitle',get_lang('FieldTitle'));
 $form->applyFilter('fieldtitle','html_filter');
 $form->applyFilter('fieldtitle','trim');
 $form->addRule('fieldtitle', get_lang('ThisFieldIsRequired'), 'required');
+// Field options
+$form->addElement('text','fieldoptions',get_lang('FieldOptions'));
+$form->applyFilter('fieldoptions','trim');
 // Field default value
 $form->addElement('text','fielddefaultvalue',get_lang('FieldDefaultValue'));
+$form->applyFilter('fielddefaultvalue','trim');
 
 // Set default values
 $defaults = array();
@@ -95,8 +99,9 @@ if( $form->validate())
 		$fieldtype = $field['fieldtype'];
 		$fieldtitle = $field['fieldtitle'];
 		$fielddefault = $field['fielddefaultvalue'];
+		$fieldoptions = $field['fieldoptions']; //comma-separated list of options
 	
-		$field_id = UserManager::create_extra_field($fieldlabel,$fieldtype,$fieldtitle,$fielddefault);
+		$field_id = UserManager::create_extra_field($fieldlabel,$fieldtype,$fieldtitle,$fielddefault,$fieldoptions);
 		Security::clear_token();
 		header('Location: user_fields.php?action=show_message&message='.urlencode(get_lang('FieldAdded')));
 		exit ();

+ 33 - 2
main/auth/profile.php

@@ -1,4 +1,4 @@
-<?php // $Id: profile.php 14807 2008-04-09 15:29:12Z yannoo $
+<?php // $Id: profile.php 14811 2008-04-09 18:50:44Z yannoo $
 /*
 ==============================================================================
 	Dokeos - elearning and course management software
@@ -271,7 +271,7 @@ if (is_profile_editable() && api_get_setting('profile', 'password') == 'true')
 }
 
 // EXTRA FIELDS
-$extra = UserManager::get_extra_fields();
+$extra = UserManager::get_extra_fields(0,50,5,'ASC');
 foreach($extra as $id => $field_details)
 {
 	if($field_details[6] == 0)
@@ -294,10 +294,41 @@ foreach($extra as $id => $field_details)
 			if ($field_details[7] == 0)	$form->freeze('extra_'.$field_details[1]);
 			break;
 		case USER_FIELD_TYPE_RADIO:
+			/*
+			$group = array();
+			$auth_sources = 0; //make available wider as we need it in case of form reset (see below)
+			if(count($extAuthSource) > 0)
+			{
+				$group[] =& HTML_QuickForm::createElement('radio','password_auto',null,get_lang('ExternalAuthentication').' ',2);
+				$auth_sources = array();
+				foreach($extAuthSource as $key => $info)
+				{
+					$auth_sources[$key] = $key;
+				}
+				$group[] =& HTML_QuickForm::createElement('select','auth_source',null,$auth_sources);
+				$group[] =& HTML_QuickForm::createElement('static','','','<br />');
+			}
+			$group[] =& HTML_QuickForm::createElement('radio','password_auto',get_lang('Password'),get_lang('AutoGeneratePassword').'<br />',1);
+			$group[] =& HTML_QuickForm::createElement('radio', 'password_auto','id="radio_user_password"',null,0);
+			$group[] =& HTML_QuickForm::createElement('password', 'password',null,'onkeydown=password_switch_radio_button(document.user_add,"password[password_auto]")');
+			$form->addGroup($group, 'password', get_lang('Password'), '');
+			*/
 			break;
 		case USER_FIELD_TYPE_SELECT:
+			$options = array();
+			foreach($field_details[8] as $option_id => $option_details)
+			{
+				$options[$option_details[1]] = $option_details[2];
+			}
+			$form->addElement('select','extra_'.$field_details[1],$field_details[3],$options,'');			
 			break;
 		case USER_FIELD_TYPE_SELECT_MULTIPLE:
+			$options = array();
+			foreach($field_details[8] as $option_id => $option_details)
+			{
+				$options[$option_details[1]] = $option_details[2];
+			}
+			$form->addElement('select','extra_'.$field_details[1],$field_details[3],$options,array('multiple' => 'multiple'));
 			break;
 		case USER_FIELD_TYPE_DATE:
 			$form->addElement('datepickerdate', 'extra_'.$field_details[1], $field_details[3]);

+ 78 - 19
main/inc/lib/usermanager.lib.php

@@ -1,9 +1,9 @@
-<?php // $Id: usermanager.lib.php 14797 2008-04-08 23:17:58Z yannoo $
+<?php // $Id: usermanager.lib.php 14811 2008-04-09 18:50:44Z yannoo $
 /*
 ==============================================================================
 	Dokeos - elearning and course management software
 
-	Copyright (c) 2004-2008 Dokeos S.A.
+	Copyright (c) 2004-2008 Dokeos SPRL
 	Copyright (c) 2003 Ghent University (UGent)
 	Copyright (c) 2001 Universite catholique de Louvain (UCL)
 	Copyright (c) various contributors
@@ -36,6 +36,8 @@ define('USER_FIELD_TYPE_TEXTAREA',2);
 define('USER_FIELD_TYPE_RADIO',3);
 define('USER_FIELD_TYPE_SELECT',4);
 define('USER_FIELD_TYPE_SELECT_MULTIPLE',5);
+define('USER_FIELD_TYPE_DATE',6);
+define('USER_FIELD_TYPE_DATETIME',7);
 
 class UserManager
 {
@@ -109,7 +111,6 @@ class UserManager
 				                    expiration_date = '".Database::escape_string($expiration_date)."',
 									hr_dept_id = '".Database::escape_string($hr_dept_id)."',
 									active = '".Database::escape_string($active)."'";
-		error_log($sql);
 		$result = api_sql_query($sql);
 		if ($result)
 		{
@@ -722,7 +723,22 @@ class UserManager
 		$t_ufo = Database::get_main_table(TABLE_MAIN_USER_FIELD_OPTIONS);
 		$t_ufv = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES);
 		$fname = Database::escape_string($fname);
-		$fvalue = Database::escape_string($fvalue);
+		$fvalues = '';
+		if(is_array($fvalue))
+		{
+			foreach($fvalue as $val)
+			{
+				$fvalues .= Database::escape_string($val).';';
+			}
+			if(!empty($fvalues))
+			{
+				$fvalues = substr($fvalues,0,-1);
+			}
+		}
+		else
+		{
+			$fvalues = Database::escape_string($fvalue);
+		}
 		$sqluf = "SELECT * FROM $t_uf WHERE field_variable='$fname'";
 		$resuf = api_sql_query($sqluf,__FILE__,__LINE__);
 		if(Database::num_rows($resuf)==1)
@@ -736,12 +752,13 @@ class UserManager
 				case 5:
 					$sqluo = "SELECT * FROM $t_ufo WHERE field_id = ".$rowuf['id'];
 					$resuo = api_sql_query($sqluo,__FILE__,__LINE__);
+					$values = split(';',$fvalues);
 					if(Database::num_rows($resuo)>0)
 					{
 						$check = false;
 						while($rowuo = Database::fetch_array($resuo))
 						{
-							if($rowuo['field_value'] == $fvalue)
+							if(in_array($rowuo['option_value'],$values))
 							{
 								$check = true;
 								break;
@@ -778,25 +795,33 @@ class UserManager
 						$n--;
 					}
 					$rowufv = Database::fetch_array($resufv);
-					$sqlu = "UPDATE $t_ufv SET field_value = '$fvalue', tms = $tms WHERE id = ".$rowufv['id'];
-					$resu = api_sql_query($sqlu,__FILE__,__LINE__);
-					return($resu?true:false);					
-				}		
+					if($rowufv['field_value'] != $fvalues)
+					{ 
+						$sqlu = "UPDATE $t_ufv SET field_value = '$fvalues', tms = FROM_UNIXTIME($tms) WHERE id = ".$rowufv['id'];
+						$resu = api_sql_query($sqlu,__FILE__,__LINE__);
+						return($resu?true:false);					
+					}
+					return true;
+				}
 			}
 			elseif($n==1)
 			{
 				//we need to update the current record
 				$rowufv = Database::fetch_array($resufv);
-				$sqlu = "UPDATE $t_ufv SET field_value = '$fvalue', tms = $tms WHERE id = ".$rowufv['id'];
-				error_log('UM::update_extra_field_value: '.$sqlu);
-				$resu = api_sql_query($sqlu,__FILE__,__LINE__);
-				return($resu?true:false);
+				if($rowufv['field_value'] != $fvalues)
+				{
+					$sqlu = "UPDATE $t_ufv SET field_value = '$fvalues', tms = FROM_UNIXTIME($tms) WHERE id = ".$rowufv['id'];
+					//error_log('UM::update_extra_field_value: '.$sqlu);
+					$resu = api_sql_query($sqlu,__FILE__,__LINE__);
+					return($resu?true:false);
+				}
+				return true;
 			}
 			else
 			{
 				$sqli = "INSERT INTO $t_ufv (user_id,field_id,field_value,tms) " .
-					"VALUES ($user_id,".$rowuf['id'].",'$fvalue',$tms)";
-				error_log('UM::update_extra_field_value: '.$sqli);
+					"VALUES ($user_id,".$rowuf['id'].",'$fvalues',FROM_UNIXTIME($tms))";
+				//error_log('UM::update_extra_field_value: '.$sqli);
 				$resi = api_sql_query($sqli,__FILE__,__LINE__);
 				return($resi?true:false);
 			}
@@ -850,7 +875,7 @@ class UserManager
 						$fields[$rowf['id']][8][$rowo['id']] = array(
 							0=>$rowo['id'],
 							1=>$rowo['option_value'],
-							2=>$rowo['option_display_text'],
+							2=>(empty($rowo['option_display_text'])?'':get_lang($rowo['option_display_text'])),
 							3=>$rowo['option_order']
 						);
 					}	
@@ -876,12 +901,14 @@ class UserManager
 	  * @param	int		Field's type
 	  * @param	string	Field's language var name
 	  * @param	string	Field's default value
+	  * @param	string	Optional comma-separated list of options to provide for select and radio
 	  * @return int     new user id - if the new user creation succeeds, false otherwise
 	  */
-	function create_extra_field($fieldvarname, $fieldtype, $fieldtitle, $fielddefault)
+	function create_extra_field($fieldvarname, $fieldtype, $fieldtitle, $fielddefault, $fieldoptions='')
 	{		
 		// database table definition
-		$table_field 	= Database::get_main_table(TABLE_MAIN_USER_FIELD);
+		$table_field 		= Database::get_main_table(TABLE_MAIN_USER_FIELD);
+		$table_field_options= Database::get_main_table(TABLE_MAIN_USER_FIELD_OPTIONS);
 		
 		// First check wether the login already exists
 		if (! UserManager::is_extra_field_available($fieldvarname))
@@ -911,7 +938,39 @@ class UserManager
 		else
 		{
 			//echo "false - failed" ;
-			$return=false;
+			return false;
+		}
+		if(!empty($fieldoptions) && in_array($fieldtype,array(USER_FIELD_TYPE_RADIO,USER_FIELD_TYPE_SELECT,USER_FIELD_TYPE_SELECT_MULTIPLE)))
+		{
+			$list = split(';',$fieldoptions);
+			foreach($list as $option)
+			{
+				$option = Database::escape_string($option);
+				$sql = "SELECT * FROM $table_field_options WHERE field_id = $return AND option_value = '".$option."'";
+				$res = api_sql_query($sql,__FILE__,__LINE__);
+				if(Database::num_rows($res)>0)
+				{
+					//the option already exists, do nothing
+				}
+				else
+				{
+					$sql = "SELECT MAX(option_order) FROM $table_field_options WHERE field_id = $return";
+					$res = api_sql_query($sql,__FILE__,__LINE__);
+					$max = 1;
+					if(Database::num_rows($res)>0)
+					{
+						$row = Database::fetch_array($res);
+						$max = $row[0]+1;
+					}
+					$time = time();
+					$sql = "INSERT INTO $table_field_options (field_id,option_value,option_display_text,option_order,tms) VALUES ($return,'$option','$option',$max,FROM_UNIXTIME($time))";
+					$res = api_sql_query($sql,__FILE__,__LINE__);
+					if($res === false)
+					{
+						$return = false;
+					}
+				}
+			}
 		}
 		return $return;
 	}