1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-05 06:07:32 +02:00

EONE-19 (bug/improvement): Start of restructuring of EUF handling to fix bugs and cache more information

This commit is contained in:
e107steved
2010-04-25 20:14:45 +00:00
parent 78e85fb0ed
commit 574f6fb1ba

View File

@@ -1,43 +1,54 @@
<?php <?php
/* /*
+ ----------------------------------------------------------------------------+ * e107 website system
| e107 website system *
| * Copyright (C) 2008-2010 e107 Inc (e107.org)
| Copyright (C) 2008-2009 e107 Inc (e107.org) * Released under the terms and conditions of the
| http://e107.org * GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
| *
| * Extended user field handler
| Released under the terms and conditions of the *
| GNU General Public License (http://gnu.org). * $URL$
| * $Id$
| $Source: /cvs_backup/e107_0.8/e107_handlers/user_extended_class.php,v $ *
| $Revision$
| $Date$
| $Author$
+----------------------------------------------------------------------------+
*/ */
if (!defined('e107_INIT')) { exit; } if (!defined('e107_INIT')) { exit; }
/* /**
* @package e107
* @subpackage e107_handlers
* @version $Id$;
*
* Extended user field handler
*
* @todo: - change some routines to access the cached variables rather than DB
* @todo: Remove setting up of _FIELD_TYPES array (may be necessary, since UEF data structure not fixed)
* @todo: Consider changing field type constants to class constants
* @todo - cache field structure (already done in a different way in get_user_data() in class2.php line 1387 or so)
* @todo - class variables - confirm whether public/protected assignments are correct
* @todo - consider whether to split system and non-system fields
Code uses two tables: Code uses two tables:
user_extended_struct - individual field definitions, one record per field user_extended_struct - individual field definitions, one record per field
user_extended - actual field data, one record per user user_extended - actual field data, one record per user
//TODO: Should user_extended_validate_entry() ckech DB for DB-type fields? @todo: Should user_extended_validate_entry() check DB for DB-type fields?
*/ */
include_lan(e_LANGUAGEDIR.e_LANGUAGE.'/lan_user_extended.php'); include_lan(e_LANGUAGEDIR.e_LANGUAGE.'/lan_user_extended.php');
class e107_user_extended class e107_user_extended
{ {
var $user_extended_types; // Text description corresponding to each field type public $user_extended_types; // Text description corresponding to each field type
var $extended_xml; private $extended_xml = FALSE;
var $typeArray; // Cross-reference between names of field types, and numeric ID private $typeArray; // Cross-reference between names of field types, and numeric ID
var $reserved_names; // List of field names used in main user DB - not allowed in extended DB private $reserved_names; // List of field names used in main user DB - not allowed in extended DB
var $fieldDefinitions; // Array initialised from DB by constructor - currently non-system fields only public $fieldDefinitions; // Array initialised from DB by constructor - currently all fields
var $nameIndex; // Array for field name lookup - initialised by constructor public $catDefinitions; // Categories
private $nameIndex; // Array for field name lookup - initialised by constructor
public $systemCount = 0; // Count of system fields - always zero ATM public $systemCount = 0; // Count of system fields - always zero ATM
public $userCount = 0; // Count of non-system fields public $userCount = 0; // Count of non-system fields
@@ -91,15 +102,29 @@ class e107_user_extended
'xup' 'xup'
); );
// At present we only load non-system fields - may want to change this $sql = e107::getDB();
$this->fieldDefinitions = $this->user_extended_get_fieldList(); // Assume that we'll need these if an object has been instantiated
$this->nameIndex = array(); // Read in all the field and category fields
// At present we load all fields into common array - may want to split system and non-system
$this ->catDefinitions = array(); // Categories array
$this->fieldDefinitions = array(); // Field definitions array
$this->nameIndex = array(); // Index of names => field IDs
$this->systemCount = 0; $this->systemCount = 0;
$this->userCount = 0; $this->userCount = 0;
foreach ($this->fieldDefinitions as $k => $v)
if($sql->db_Select('user_extended_struct', '*', "user_extended_struct_text != '_system_' ORDER BY user_extended_struct_order ASC"))
{ {
$this->nameIndex['user_'.$v['user_extended_struct_name']] = $k; // Create name to ID index while($row = $sql->db_Fetch(MYSQL_ASSOC))
if ($v['user_extended_struct_text'] == '_system_') {
if ($row['user_extended_struct_type'] == 0)
{ // Its a category
$this->catDefinitions[$row['user_extended_struct_id']] = $row;
}
else
{ // Its a field definition
$this->fieldDefinitions[$row['user_extended_struct_id']] = $row;
$this->nameIndex['user_'.$row['user_extended_struct_name']] = $row['user_extended_struct_id']; // Create name to ID index
if ($row['user_extended_struct_text'] == '_system_')
{ {
$this->systemCount++; $this->systemCount++;
} }
@@ -109,13 +134,26 @@ class e107_user_extended
} }
} }
} }
}
}
function user_extended_reserved($name)
/**
* Check for reserved field names.
* (Names which clash with the 'normal' user table aren't allowed)
*
* @param string $name - name of field bweing checked (no 'user_' prefix)
*
* @return boolean TRUE if disallowed name
*/
public function user_extended_reserved($name)
{ {
return (in_array($name, $this->reserved_names)); return (in_array($name, $this->reserved_names));
} }
// Adds the _FIELD_TYPES array to the data, ready for saving in the DB. // Adds the _FIELD_TYPES array to the data, ready for saving in the DB.
function addFieldTypes(&$target) function addFieldTypes(&$target)
{ {
@@ -146,15 +184,20 @@ class e107_user_extended
} }
// For all UEFs not in the target array, adds the default value
// Also updates the _FIELD_TYPES array, so call this last thing before writing to the DB /**
function addDefaultFields(&$target) * For all UEFs not in the target array, adds the default value
* Also updates the _FIELD_TYPES array, so call this last thing before writing to the DB
*
* @param $target - pointer to data array
*/
public function addDefaultFields(&$target)
{ {
$target['_FIELD_TYPES'] = array(); // We should always want to recreate the array, even if it exists //$target['_FIELD_TYPES'] = array(); // We should always want to recreate the array, even if it exists
foreach ($this->fieldDefinitions as $k => $defs) foreach ($this->fieldDefinitions as $k => $defs)
{ {
$f = 'user_'.$defs['user_extended_struct_name']; $f = 'user_'.$defs['user_extended_struct_name'];
if (!isset($target['data'][$f])) if (!isset($target['data'][$f]) && $this->fieldDefinitions[$k]['user_extended_struct_default'])
{ {
switch ($this->fieldDefinitions[$k]['user_extended_struct_type']) switch ($this->fieldDefinitions[$k]['user_extended_struct_type'])
{ {
@@ -212,19 +255,36 @@ class e107_user_extended
} }
// Validate all user-modifable extended user fields which are presented.
// $inArray is the input data (usually from $_POST or $_POST['ue'], although doesn't have to be) - may have 'surplus' values /**
// $hideArray is a set of possible 'hide' flags * Validate all user-modifable extended user fields which are presented.
// $isSignup TRUE causes required fields to be specifically checked, else only data passed is checked * Primarily intended to validate data entered by a user or admin
function userExtendedValidateAll($inArray, $hideArray, $isSignup=FALSE) *
* @param array $inArray is the input data (usually from $_POST or $_POST['ue'], although doesn't have to be) - may have 'surplus' values
* @param array $hideArray is a set of possible 'hide' flags
* @param boolean $isSignup TRUE causes required fields to be specifically checked, else only data passed is checked
*
* @return array with three potential subkeys:
* 'data' - valid data values (key is field name)
* ['data']['user_hidden_fields'] is the hidden fields
* 'errors' - data values in error
* 'errortext' - error message corresponding to erroneous value
*
* @todo - does $hidden_fields need to be merged with values for fields not processed? (Probably not - should only relate to fields current user can see)
* @todo - make sure admin can edit fields of other users
*/
public function userExtendedValidateAll($inArray, $hideArray, $isSignup=FALSE)
{ {
global $tp; global $tp;
$eufVals = array(); // 'Answer' array $eufVals = array(); // 'Answer' array
$hideFlags = array(); $hideFlags = array();
foreach ($this->fieldDefinitions as $k => $defs) foreach ($this->fieldDefinitions as $k => $defs)
{ {
if ($defs['user_extended_struct_applicable'] != e_UC_NOBODY) $category = $defs['user_extended_struct_parent'];
{ if (($category == 0) || (check_class($this->catDefinitions[$category]['user_extended_struct_applicable']) && check_class($this->catDefinitions[$category]['user_extended_struct_write'])))
{ // Category applicable to user
if (check_class($defs['user_extended_struct_applicable']) && check_class($defs['user_extended_struct_write']))
{ // User can also update field
$f = 'user_'.$defs['user_extended_struct_name']; $f = 'user_'.$defs['user_extended_struct_name'];
if (isset($inArray[$f]) || ($isSignup && ($defs['user_extended_struct_required'] == 1))) if (isset($inArray[$f]) || ($isSignup && ($defs['user_extended_struct_required'] == 1)))
{ // Only allow valid keys { // Only allow valid keys
@@ -251,10 +311,11 @@ class e107_user_extended
} }
} }
} }
$hidden_fields = implode("^", $hideFlags); }
if ($hidden_fields != "") $hidden_fields = implode('^', $hideFlags);
if ($hidden_fields != '')
{ {
$hidden_fields = "^".$hidden_fields."^"; $hidden_fields = '^'.$hidden_fields.'^';
} }
$eufVals['data']['user_hidden_fields'] = $hidden_fields; $eufVals['data']['user_hidden_fields'] = $hidden_fields;
@@ -262,6 +323,8 @@ class e107_user_extended
} }
function user_extended_get_categories($byID = TRUE) function user_extended_get_categories($byID = TRUE)
{ {
$ret = array(); $ret = array();