[ Index ]

PHP Cross Reference of phpBB 3.0 Beta 3

title

Body

[close]

/includes/acp/ -> acp_profile.php (source)

   1  <?php
   2  /** 
   3  *
   4  * @package acp
   5  * @version $Id: acp_profile.php,v 1.40 2006/11/02 15:23:15 acydburn Exp $
   6  * @copyright (c) 2005 phpBB Group 
   7  * @license http://opensource.org/licenses/gpl-license.php GNU Public License 
   8  *
   9  */
  10  
  11  /**
  12  * @package acp
  13  */
  14  class acp_profile
  15  {
  16      var $u_action;
  17  
  18  	function main($id, $mode)
  19      {
  20          global $config, $db, $user, $auth, $template, $cache;
  21          global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
  22  
  23          include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
  24          include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
  25          include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
  26  
  27          $user->add_lang(array('ucp', 'acp/profile'));
  28          $this->tpl_name = 'acp_profile';
  29          $this->page_title = 'ACP_CUSTOM_PROFILE_FIELDS';
  30  
  31          $action = (isset($_POST['create'])) ? 'create' : request_var('action', '');
  32  
  33          $error = array();
  34          $s_hidden_fields = '';
  35  
  36          // Define some default values for each field type
  37          $default_values = array(
  38              FIELD_STRING    => array('field_length' => 10, 'field_minlen' => 0, 'field_maxlen' => 20, 'field_validation' => '.*', 'field_novalue' => '', 'field_default_value' => ''),
  39              FIELD_TEXT        => array('field_length' => '5|80', 'field_minlen' => 0, 'field_maxlen' => 1000, 'field_validation' => '.*', 'field_novalue' => '', 'field_default_value' => ''),
  40              FIELD_INT        => array('field_length' => 5, 'field_minlen' => 0, 'field_maxlen' => 100, 'field_validation' => '', 'field_novalue' => 0, 'field_default_value' => 0),
  41              FIELD_DATE        => array('field_length' => 10, 'field_minlen' => 10, 'field_maxlen' => 10, 'field_validation' => '', 'field_novalue' => ' 0- 0-   0', 'field_default_value' => ' 0- 0-   0'),
  42              FIELD_BOOL        => array('field_length' => 1, 'field_minlen' => 0, 'field_maxlen' => 0, 'field_validation' => '', 'field_novalue' => 0, 'field_default_value' => 0),
  43              FIELD_DROPDOWN    => array('field_length' => 0, 'field_minlen' => 0, 'field_maxlen' => 5, 'field_validation' => '', 'field_novalue' => 0, 'field_default_value' => 0),
  44          );
  45  
  46          $cp = new custom_profile_admin();
  47  
  48          // Build Language array
  49          // Based on this, we decide which elements need to be edited later and which language items are missing
  50          $lang_defs = array();
  51  
  52          $sql = 'SELECT lang_id, lang_iso
  53              FROM ' . LANG_TABLE . '
  54              ORDER BY lang_english_name';
  55          $result = $db->sql_query($sql);
  56  
  57          while ($row = $db->sql_fetchrow($result))
  58          {
  59              // Make some arrays with all available languages
  60              $lang_defs['id'][] = $row['lang_id'];
  61              $lang_defs['iso'][$row['lang_iso']] = $row['lang_id'];
  62          }
  63          $db->sql_freeresult($result);
  64  
  65          $sql = 'SELECT field_id, lang_id
  66              FROM ' . PROFILE_LANG_TABLE . '
  67              ORDER BY lang_id';
  68          $result = $db->sql_query($sql);
  69      
  70          while ($row = $db->sql_fetchrow($result))
  71          {
  72              // Which languages are available for each item
  73              $lang_defs['entry'][$row['field_id']][] = $row['lang_id'];
  74          }
  75          $db->sql_freeresult($result);
  76  
  77          // Have some fields been defined?
  78          if (isset($lang_defs['entry']))
  79          {
  80              foreach ($lang_defs['entry'] as $field_id => $field_ary)
  81              {
  82                  // Fill an array with the languages that are missing for each field
  83                  $lang_defs['diff'][$field_id] = array_diff($lang_defs['id'], $field_ary);
  84              }
  85          }
  86  
  87          switch ($action)
  88          {
  89              case 'delete':
  90                  $field_id = request_var('field_id', 0);
  91  
  92                  if (!$field_id)
  93                  {
  94                      trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
  95                  }
  96  
  97                  if (confirm_box(true))
  98                  {
  99                      $sql = 'SELECT field_ident 
 100                          FROM ' . PROFILE_FIELDS_TABLE . " 
 101                          WHERE field_id = $field_id";
 102                      $result = $db->sql_query($sql);
 103                      $field_ident = (string) $db->sql_fetchfield('field_ident');
 104                      $db->sql_freeresult($result);
 105  
 106                      $db->sql_query('DELETE FROM ' . PROFILE_FIELDS_TABLE . " WHERE field_id = $field_id");
 107                      $db->sql_query('DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " WHERE field_id = $field_id");
 108                      $db->sql_query('DELETE FROM ' . PROFILE_LANG_TABLE . " WHERE field_id = $field_id");
 109  
 110                      switch ($db->sql_layer)
 111                      {
 112                          case 'sqlite':
 113                              $sql = "SELECT sql
 114                                  FROM sqlite_master 
 115                                  WHERE type = 'table' 
 116                                      AND name = '" . PROFILE_FIELDS_DATA_TABLE . "'
 117                                  ORDER BY type DESC, name;";
 118                              $result = $db->sql_query($sql);
 119                              $row = $db->sql_fetchrow($result);
 120                              $db->sql_freeresult($result);
 121  
 122                              $db->sql_transaction('begin');
 123  
 124                              // Create a temp table and populate it, destroy the existing one
 125                              $db->sql_query(preg_replace('#CREATE\s+TABLE\s+"?' . PROFILE_FIELDS_DATA_TABLE . '"?#i', 'CREATE TEMPORARY TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp', $row['sql']));
 126                              $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . '_temp SELECT * FROM ' . PROFILE_FIELDS_DATA_TABLE);
 127                              $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE);
 128  
 129                              preg_match('#\((.*)\)#s', $row['sql'], $matches);
 130  
 131                              $new_table_cols = trim($matches[1]);
 132                              $old_table_cols = preg_split('/,(?=[\\sa-z])/im', $new_table_cols);
 133                              $column_list = array();
 134  
 135                              foreach ($old_table_cols as $declaration)
 136                              {
 137                                  $entities = preg_split('#\s+#', trim($declaration));
 138                                  if ($entities[0] !== 'pf_' . $field_ident)
 139                                  {
 140                                      $column_list[] = $entities[0];
 141                                  }
 142                              }
 143  
 144                              $columns = implode(',', $column_list);
 145  
 146                              $new_table_cols = preg_replace('/' . 'pf_' . $field_ident . '[^,]+,/', '', $new_table_cols);
 147  
 148                              // create a new table and fill it up. destroy the temp one
 149                              $db->sql_query('CREATE TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $new_table_cols . ');');
 150                              $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . PROFILE_FIELDS_DATA_TABLE . '_temp;');
 151                              $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp');
 152  
 153                              $db->sql_transaction('commit');
 154                          break;
 155  
 156                          default:
 157                              $db->sql_query('ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " DROP pf_$field_ident");
 158                      }
 159  
 160                      $order = 0;
 161  
 162                      $sql = 'SELECT *
 163                          FROM ' . PROFILE_FIELDS_TABLE . '
 164                          ORDER BY field_order';
 165                      $result = $db->sql_query($sql);
 166  
 167                      while ($row = $db->sql_fetchrow($result))
 168                      {
 169                          $order++;
 170                          if ($row['field_order'] != $order)
 171                          {
 172                              $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . " 
 173                                  SET field_order = $order 
 174                                  WHERE field_id = {$row['field_id']}";
 175                              $db->sql_query($sql);
 176                          }
 177                      }
 178                      $db->sql_freeresult($result);
 179  
 180                      add_log('admin', 'LOG_PROFILE_FIELD_REMOVED', $field_ident);
 181                      trigger_error($user->lang['REMOVED_PROFILE_FIELD'] . adm_back_link($this->u_action));
 182                  }
 183                  else
 184                  {
 185                      confirm_box(false, 'DELETE_PROFILE_FIELD', build_hidden_fields(array(
 186                          'i'            => $id,
 187                          'mode'        => $mode,
 188                          'action'    => $action,
 189                          'field_id'    => $field_id,
 190                      )));
 191                  }
 192      
 193              break;
 194  
 195              case 'activate':
 196                  $field_id = request_var('field_id', 0);
 197  
 198                  if (!$field_id)
 199                  {
 200                      trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
 201                  }
 202      
 203                  $sql = 'SELECT lang_id 
 204                      FROM ' . LANG_TABLE . " 
 205                      WHERE lang_iso = '" . $db->sql_escape($config['default_lang']) . "'";
 206                  $result = $db->sql_query($sql);
 207                  $default_lang_id = (int) $db->sql_fetchfield('lang_id');
 208                  $db->sql_freeresult($result);
 209  
 210                  if (!in_array($default_lang_id, $lang_defs['entry'][$field_id]))
 211                  {
 212                      trigger_error($user->lang['DEFAULT_LANGUAGE_NOT_FILLED'] . adm_back_link($this->u_action), E_USER_WARNING);
 213                  }
 214  
 215                  $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . " 
 216                      SET field_active = 1 
 217                      WHERE field_id = $field_id";
 218                  $db->sql_query($sql);
 219  
 220                  $sql = 'SELECT field_ident 
 221                      FROM ' . PROFILE_FIELDS_TABLE . " 
 222                      WHERE field_id = $field_id";
 223                  $result = $db->sql_query($sql);
 224                  $field_ident = (string) $db->sql_fetchfield('field_ident');
 225                  $db->sql_freeresult($result);
 226  
 227                  add_log('admin', 'LOG_PROFILE_FIELD_ACTIVATE', $field_ident);
 228                  trigger_error($user->lang['PROFILE_FIELD_ACTIVATED'] . adm_back_link($this->u_action));
 229  
 230              break;
 231  
 232              case 'deactivate':
 233                  $field_id = request_var('field_id', 0);
 234  
 235                  if (!$field_id)
 236                  {
 237                      trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
 238                  }
 239      
 240                  $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
 241                      SET field_active = 0 
 242                      WHERE field_id = $field_id";
 243                  $db->sql_query($sql);
 244  
 245                  $sql = 'SELECT field_ident 
 246                      FROM ' . PROFILE_FIELDS_TABLE . " 
 247                      WHERE field_id = $field_id";
 248                  $result = $db->sql_query($sql);
 249                  $field_ident = (string) $db->sql_fetchfield('field_ident');
 250                  $db->sql_freeresult($result);
 251  
 252                  add_log('admin', 'LOG_PROFILE_FIELD_DEACTIVATE', $field_ident);
 253                  trigger_error($user->lang['PROFILE_FIELD_DEACTIVATED'] . adm_back_link($this->u_action));
 254  
 255              break;
 256  
 257              case 'move_up':
 258              case 'move_down':
 259                  $field_order = request_var('order', 0);
 260                  $order_total = $field_order * 2 + (($action == 'move_up') ? -1 : 1);
 261  
 262                  $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
 263                      SET field_order = $order_total - field_order
 264                      WHERE field_order IN ($field_order, " . (($action == 'move_up') ? $field_order - 1 : $field_order + 1) . ')';
 265                  $db->sql_query($sql);
 266  
 267              break;
 268  
 269              case 'create':
 270              case 'edit':
 271          
 272                  $field_id = request_var('field_id', 0);
 273                  $step = request_var('step', 1);
 274  
 275                  $submit = (isset($_REQUEST['next']) || isset($_REQUEST['prev'])) ? true : false;
 276                  $save = (isset($_REQUEST['save'])) ? true : false;
 277  
 278                  // We are editing... we need to grab basic things
 279                  if ($action == 'edit')
 280                  {
 281                      if (!$field_id)
 282                      {
 283                          trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
 284                      }
 285  
 286                      $sql = 'SELECT l.*, f.*
 287                          FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f 
 288                          WHERE l.lang_id = ' . $lang_defs['iso'][$config['default_lang']] . "
 289                              AND f.field_id = $field_id
 290                              AND l.field_id = f.field_id";
 291                      $result = $db->sql_query($sql);
 292                      $field_row = $db->sql_fetchrow($result);
 293                      $db->sql_freeresult($result);
 294  
 295                      if (!$field_row)
 296                      {
 297                          trigger_error($user->lang['FIELD_NOT_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
 298                      }
 299                      $field_type = $field_row['field_type'];
 300  
 301                      // Get language entries
 302                      $sql = 'SELECT *
 303                          FROM ' . PROFILE_FIELDS_LANG_TABLE . ' 
 304                          WHERE lang_id = ' . $lang_defs['iso'][$config['default_lang']] . "
 305                              AND field_id = $field_id
 306                          ORDER BY option_id ASC";
 307                      $result = $db->sql_query($sql);
 308  
 309                      $lang_options = array();
 310                      while ($row = $db->sql_fetchrow($result))
 311                      {
 312                          $lang_options[$row['option_id']] = $row['lang_value'];
 313                      }
 314                      $db->sql_freeresult($result);
 315  
 316                      $s_hidden_fields = '<input type="hidden" name="field_id" value="' . $field_id . '" />';
 317                  }
 318                  else
 319                  {
 320                      // We are adding a new field, define basic params
 321                      $lang_options = $field_row = array();
 322          
 323                      $field_type = request_var('field_type', 0);
 324              
 325                      if (!$field_type)
 326                      {
 327                          trigger_error($user->lang['NO_FIELD_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
 328                      }
 329  
 330                      $field_row = array_merge($default_values[$field_type], array(
 331                          'field_ident'        => request_var('field_ident', ''),
 332                          'field_required'    => 0,
 333                          'field_hide'        => 0,
 334                          'field_no_view'        => 0,
 335                          'field_show_on_reg'    => 0,
 336                          'lang_name'            => '',
 337                          'lang_explain'        => '',
 338                          'lang_default_value'=> '')
 339                      );
 340  
 341                      $s_hidden_fields = '<input type="hidden" name="field_type" value="' . $field_type . '" />';
 342                  }
 343  
 344                  // $exclude contains the data we gather in each step
 345                  $exclude = array(
 346                      1    => array('field_ident', 'lang_name', 'lang_explain', 'field_option', 'field_no_view'),
 347                      2    => array('field_length', 'field_maxlen', 'field_minlen', 'field_validation', 'field_novalue', 'field_default_value'),
 348                      3    => array('l_lang_name', 'l_lang_explain', 'l_lang_default_value', 'l_lang_options')
 349                  );
 350  
 351                  // Text-based fields require the lang_default_value to be excluded
 352                  if ($field_type == FIELD_STRING || $field_type == FIELD_TEXT)
 353                  {
 354                      $exclude[1][] = 'lang_default_value';
 355                  }
 356  
 357                  // option-specific fields require lang_options to be excluded
 358                  if ($field_type == FIELD_BOOL || $field_type == FIELD_DROPDOWN)
 359                  {
 360                      $exclude[1][] = 'lang_options';
 361                  }
 362  
 363                  $cp->vars['field_ident']        = request_var('field_ident', $field_row['field_ident']);
 364                  $cp->vars['lang_name']            = request_var('lang_name', $field_row['lang_name'], true);
 365                  $cp->vars['lang_explain']        = request_var('lang_explain', $field_row['lang_explain'], true);
 366                  $cp->vars['lang_default_value']    = request_var('lang_default_value', $field_row['lang_default_value'], true);
 367  
 368                  // Field option...
 369                  if (isset($_REQUEST['field_option']))
 370                  {
 371                      $field_option = request_var('field_option', '');
 372  
 373                      $cp->vars['field_required'] = ($field_option == 'field_required') ? 1 : 0;
 374                      $cp->vars['field_show_on_reg'] = ($field_option == 'field_show_on_reg') ? 1 : 0;
 375                      $cp->vars['field_hide'] = ($field_option == 'field_hide') ? 1 : 0;
 376                  }
 377                  else
 378                  {
 379                      $cp->vars['field_required'] = $field_row['field_required'];
 380                      $cp->vars['field_show_on_reg'] = $field_row['field_show_on_reg'];
 381                      $cp->vars['field_hide'] = $field_row['field_hide'];
 382  
 383                      $field_option = ($field_row['field_required']) ? 'field_required' : (($field_row['field_show_on_reg']) ? 'field_show_on_reg' : (($field_row['field_hide']) ? 'field_hide' : ''));
 384                  }
 385  
 386                  $cp->vars['field_no_view'] = request_var('field_no_view', $field_row['field_no_view']);
 387  
 388                  // A boolean field expects an array as the lang options
 389                  if ($field_type == FIELD_BOOL)
 390                  {
 391                      $options = request_var('lang_options', array(''), true);
 392                  }
 393                  else
 394                  {
 395                      $options = request_var('lang_options', '', true);
 396                  }
 397  
 398                  // If the user has submitted a form with options (i.e. dropdown field)
 399                  if ($options)
 400                  {
 401                      $exploded_options = (is_array($options)) ? $options : explode("\n", $options);
 402  
 403                      if (sizeof($exploded_options) == sizeof($lang_options) || $action == 'create')
 404                      {
 405                          // The number of options in the field is equal to the number of options already in the database
 406                          // Or we are creating a new dropdown list.
 407                          $cp->vars['lang_options']    = $exploded_options;
 408                      }
 409                      else if ($action == 'edit')
 410                      {
 411                          // Changing the number of options? (We remove and re-create the option fields)
 412                          $cp->vars['lang_options']    = $exploded_options;
 413                      }
 414                  }
 415                  else
 416                  {
 417                      $cp->vars['lang_options']    = $lang_options;
 418                  }
 419  
 420                  // step 2
 421                  foreach ($exclude[2] as $key)
 422                  {
 423                      $var = request_var($key, $field_row[$key], true);
 424  
 425                      // Manipulate the intended variables a little bit if needed
 426                      if ($field_type == FIELD_DROPDOWN && $key == 'field_maxlen')
 427                      {
 428                          // Get the number of options if this key is 'field_maxlen'
 429                          $var = sizeof(explode("\n", request_var('lang_options', '', true)));
 430                      }
 431  
 432                      if ($field_type == FIELD_TEXT && $key == 'field_length')
 433                      {
 434                          if (isset($_REQUEST['rows']))
 435                          {
 436                              $cp->vars['rows'] = request_var('rows', 0);
 437                              $cp->vars['columns'] = request_var('columns', 0);
 438                              $var = $cp->vars['rows'] . '|' . $cp->vars['columns'];
 439                          }
 440                          else
 441                          {
 442                              $row_col = explode('|', $var);
 443                              $cp->vars['rows'] = $row_col[0];
 444                              $cp->vars['columns'] = $row_col[1];
 445                          }
 446                      }
 447  
 448                      if ($field_type == FIELD_DATE && $key == 'field_default_value')
 449                      {
 450                          $always_now = request_var('always_now', 0);
 451  
 452                          if ($always_now || $var == 'now')
 453                          {
 454                              $now = getdate();
 455  
 456                              $cp->vars['field_default_value_day'] = $now['mday'];
 457                              $cp->vars['field_default_value_month'] = $now['mon'];
 458                              $cp->vars['field_default_value_year'] = $now['year'];
 459                              $var = $_POST['field_default_value'] = 'now';
 460                          }
 461                          else
 462                          {
 463                              if (isset($_REQUEST['field_default_value_day']))
 464                              {
 465                                  $cp->vars['field_default_value_day'] = request_var('field_default_value_day', 0);
 466                                  $cp->vars['field_default_value_month'] = request_var('field_default_value_month', 0);
 467                                  $cp->vars['field_default_value_year'] = request_var('field_default_value_year', 0);
 468                                  $var = $_POST['field_default_value'] = sprintf('%2d-%2d-%4d', $cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']);
 469                              }
 470                              else
 471                              {
 472                                  list($cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']) = explode('-', $var);
 473                              }
 474                          }    
 475                      }
 476  
 477                      $cp->vars[$key] = $var;
 478                  }
 479  
 480                  // step 3 - all arrays
 481                  if ($action == 'edit')
 482                  {
 483                      // Get language entries
 484                      $sql = 'SELECT *
 485                          FROM ' . PROFILE_FIELDS_LANG_TABLE . ' 
 486                          WHERE lang_id <> ' . $lang_defs['iso'][$config['default_lang']] . "
 487                              AND field_id = $field_id
 488                          ORDER BY option_id ASC";
 489                      $result = $db->sql_query($sql);
 490  
 491                      $l_lang_options = array();
 492                      while ($row = $db->sql_fetchrow($result))
 493                      {
 494                          $l_lang_options[$row['lang_id']][$row['option_id']] = $row['lang_value'];
 495                      }
 496                      $db->sql_freeresult($result);
 497  
 498          
 499                      $sql = 'SELECT lang_id, lang_name, lang_explain, lang_default_value
 500                          FROM ' . PROFILE_LANG_TABLE . ' 
 501                          WHERE lang_id <> ' . $lang_defs['iso'][$config['default_lang']] . "
 502                              AND field_id = $field_id
 503                          ORDER BY lang_id ASC";
 504                      $result = $db->sql_query($sql);
 505  
 506                      $l_lang_name = $l_lang_explain = $l_lang_default_value = array();
 507                      while ($row = $db->sql_fetchrow($result))
 508                      {
 509                          $l_lang_name[$row['lang_id']] = $row['lang_name'];
 510                          $l_lang_explain[$row['lang_id']] = $row['lang_explain'];
 511                          $l_lang_default_value[$row['lang_id']] = $row['lang_default_value'];
 512                      }
 513                      $db->sql_freeresult($result);
 514                  }
 515          
 516                  foreach ($exclude[3] as $key)
 517                  {
 518                      $cp->vars[$key] = request_var($key, array(0 => ''), true);
 519  
 520                      if (!$cp->vars[$key] && $action == 'edit')
 521                      {
 522                          $cp->vars[$key] = $$key;
 523                      }
 524                      else if ($key == 'l_lang_options' && sizeof($cp->vars[$key]) > 1)
 525                      {
 526                          foreach ($cp->vars[$key] as $lang_id => $options)
 527                          {
 528                              $cp->vars[$key][$lang_id] = explode("\n", $options);
 529                          }
 530                      }
 531                  }
 532  
 533                  // Check for general issues in every step
 534                  if ($submit) //  && $step == 1
 535                  {
 536                      // Check values for step 1
 537                      if ($cp->vars['field_ident'] == '')
 538                      {
 539                          $error[] = $user->lang['EMPTY_FIELD_IDENT'];
 540                      }
 541  
 542                      if (!preg_match('/^[a-z_]+$/', $cp->vars['field_ident']))
 543                      {
 544                          $error[] = $user->lang['INVALID_CHARS_FIELD_IDENT'];
 545                      }
 546  
 547                      if (strlen($cp->vars['field_ident']) > 17)
 548                      {
 549                          $error[] = $user->lang['INVALID_FIELD_IDENT_LEN'];
 550                      }
 551  
 552                      if ($cp->vars['lang_name'] == '')
 553                      {
 554                          $error[] = $user->lang['EMPTY_USER_FIELD_NAME'];
 555                      }
 556  
 557                      if ($field_type == FIELD_DROPDOWN && !sizeof($cp->vars['lang_options']))
 558                      {
 559                          $error[] = $user->lang['NO_FIELD_ENTRIES'];
 560                      }
 561  
 562                      if ($field_type == FIELD_BOOL && (empty($cp->vars['lang_options'][0]) || empty($cp->vars['lang_options'][1])))
 563                      {
 564                          $error[] = $user->lang['NO_FIELD_ENTRIES'];
 565                      }
 566  
 567                      // Check for already existing field ident
 568                      if ($action != 'edit')
 569                      {
 570                          $sql = 'SELECT field_ident 
 571                              FROM ' . PROFILE_FIELDS_TABLE . " 
 572                              WHERE field_ident = '" . $db->sql_escape($cp->vars['field_ident']) . "'";
 573                          $result = $db->sql_query($sql);
 574                          $row = $db->sql_fetchrow($result);
 575                          $db->sql_freeresult($result);
 576  
 577                          if ($row)
 578                          {
 579                              $error[] = $user->lang['FIELD_IDENT_ALREADY_EXIST'];
 580                          }
 581                      }
 582                  }
 583  
 584                  $step = (isset($_REQUEST['next'])) ? $step + 1 : ((isset($_REQUEST['prev'])) ? $step - 1 : $step);
 585  
 586                  if (sizeof($error))
 587                  {
 588                      $step--;
 589                      $submit = false;
 590                  }
 591  
 592                  // Build up the specific hidden fields
 593                  foreach ($exclude as $num => $key_ary)
 594                  {
 595                      if ($num == $step)
 596                      {
 597                          continue;
 598                      }
 599  
 600                      $_new_key_ary = array();
 601  
 602                      foreach ($key_ary as $key)
 603                      {
 604                          if (!isset($_REQUEST[$key]))
 605                          {
 606                              $var = false;
 607                          }
 608                          else
 609                          {
 610                              $_new_key_ary[$key] = (is_array($_REQUEST[$key])) ? request_var($key, array(''), true) : request_var($key, '', true);
 611                          }
 612                      }
 613  
 614                      $s_hidden_fields .= build_hidden_fields($_new_key_ary);
 615                  }
 616  
 617                  if (!sizeof($error))
 618                  {
 619                      if ($step == 3 && (sizeof($lang_defs['iso']) == 1 || $save))
 620                      {
 621                          $this->save_profile_field($cp, $field_type, $lang_defs, $action);
 622                      }
 623                      else if ($action == 'edit' && $save)
 624                      {
 625                          $this->save_profile_field($cp, $field_type, $lang_defs, $action);
 626                      }
 627                  }
 628  
 629                  $template->assign_vars(array(
 630                      'S_EDIT'            => true,
 631                      'S_EDIT_MODE'        => ($action == 'edit') ? true : false,
 632                      'ERROR_MSG'            => (sizeof($error)) ? implode('<br />', $error) : '',
 633  
 634                      'L_TITLE'            => $user->lang['STEP_' . $step . '_TITLE_' . strtoupper($action)],
 635                      'L_EXPLAIN'            => $user->lang['STEP_' . $step . '_EXPLAIN_' . strtoupper($action)],
 636                      
 637                      'U_ACTION'            => $this->u_action . "&amp;action=$action&amp;step=$step",
 638                      'U_BACK'            => $this->u_action)
 639                  );
 640  
 641                  // Now go through the steps
 642                  switch ($step)
 643                  {
 644                      // Create basic options - only small differences between field types
 645                      case 1: 
 646      
 647                          // Build common create options
 648                          $template->assign_vars(array(
 649                              'S_STEP_ONE'        => true,
 650                              'S_FIELD_REQUIRED'    => ($cp->vars['field_required']) ? true : false,
 651                              'S_SHOW_ON_REG'        => ($cp->vars['field_show_on_reg']) ? true : false,
 652                              'S_FIELD_HIDE'        => ($cp->vars['field_hide']) ? true : false,
 653                              'S_FIELD_NO_VIEW'    => ($cp->vars['field_no_view']) ? true : false,
 654  
 655                              'L_LANG_SPECIFIC'    => sprintf($user->lang['LANG_SPECIFIC_OPTIONS'], $config['default_lang']),
 656                              'FIELD_TYPE'        => $user->lang['FIELD_' . strtoupper($cp->profile_types[$field_type])],
 657                              'FIELD_IDENT'        => $cp->vars['field_ident'],
 658                              'LANG_NAME'            => $cp->vars['lang_name'],
 659                              'LANG_EXPLAIN'        => $cp->vars['lang_explain'])
 660                          );
 661  
 662                          // String and Text needs to set default values here...
 663                          if ($field_type == FIELD_STRING || $field_type == FIELD_TEXT)
 664                          {
 665                              $template->assign_vars(array(
 666                                  'S_TEXT'        => ($field_type == FIELD_TEXT) ? true : false,
 667                                  'S_STRING'        => ($field_type == FIELD_STRING) ? true : false,
 668  
 669                                  'L_DEFAULT_VALUE_EXPLAIN'    => $user->lang[strtoupper($cp->profile_types[$field_type]) . '_DEFAULT_VALUE_EXPLAIN'],
 670                                  'LANG_DEFAULT_VALUE'        => $cp->vars['lang_default_value'])
 671                              );
 672                          }
 673              
 674                          if ($field_type == FIELD_BOOL || $field_type == FIELD_DROPDOWN)
 675                          {
 676                              // Initialize these array elements if we are creating a new field
 677                              if (!sizeof($cp->vars['lang_options']))
 678                              {
 679                                  if ($field_type == FIELD_BOOL)
 680                                  {
 681                                      // No options have been defined for a boolean field.
 682                                      $cp->vars['lang_options'][0] = '';
 683                                      $cp->vars['lang_options'][1] = '';
 684                                  }
 685                                  else
 686                                  {
 687                                      // No options have been defined for the dropdown menu
 688                                      $cp->vars['lang_options'] = array();
 689                                  }
 690                              }
 691  
 692                              $template->assign_vars(array(
 693                                  'S_BOOL'        => ($field_type == FIELD_BOOL) ? true : false,
 694                                  'S_DROPDOWN'    => ($field_type == FIELD_DROPDOWN) ? true : false,
 695  
 696                                  'L_LANG_OPTIONS_EXPLAIN'    => $user->lang[strtoupper($cp->profile_types[$field_type]) . '_ENTRIES_EXPLAIN'],
 697                                  'LANG_OPTIONS'                => ($field_type == FIELD_DROPDOWN) ? implode("\n", $cp->vars['lang_options']) : '',
 698                                  'FIRST_LANG_OPTION'            => ($field_type == FIELD_BOOL) ? $cp->vars['lang_options'][0] : '',
 699                                  'SECOND_LANG_OPTION'        => ($field_type == FIELD_BOOL) ? $cp->vars['lang_options'][1] : '')
 700                              );
 701                          }
 702                      
 703                      break;
 704  
 705                      case 2:
 706                          
 707                          $template->assign_vars(array(
 708                              'S_STEP_TWO'        => true,
 709                              'L_NEXT'            => (sizeof($lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS'])
 710                          );
 711  
 712                          // Build options based on profile type
 713                          $function = 'get_' . $cp->profile_types[$field_type] . '_options';
 714                          $options = $cp->$function();
 715  
 716                          foreach ($options as $num => $option_ary)
 717                          {
 718                              $template->assign_block_vars('option', $option_ary);
 719                          }
 720  
 721                      break;
 722  
 723                      // Define remaining language variables
 724                      case 3: 
 725  
 726                          $template->assign_var('S_STEP_THREE', true);
 727                          $options = $this->build_language_options($cp, $field_type, $action);
 728  
 729                          foreach ($options as $lang_id => $lang_ary)
 730                          {
 731                              $template->assign_block_vars('options', array(
 732                                  'LANGUAGE'        => ($lang_ary['lang_iso'] == $config['default_lang']) ? sprintf($user->lang['DEFAULT_ISO_LANGUAGE'], $config['default_lang']) : sprintf($user->lang['ISO_LANGUAGE'], $lang_ary['lang_iso']))
 733                              );
 734  
 735                              foreach ($lang_ary['fields'] as $field_ident => $field_ary)
 736                              {
 737                                  $template->assign_block_vars('options.field', array(
 738                                      'L_TITLE'        => $field_ary['TITLE'],
 739                                      'L_EXPLAIN'        => (isset($field_ary['EXPLAIN'])) ? $field_ary['EXPLAIN'] : '',
 740                                      'FIELD'            => $field_ary['FIELD'])
 741                                  );
 742                              }
 743                          }
 744          
 745                      break;
 746                  }
 747  
 748                  $template->assign_vars(array(
 749                      'S_HIDDEN_FIELDS'    => $s_hidden_fields)
 750                  );
 751  
 752                  return;
 753  
 754              break;
 755          }
 756          
 757          $sql = 'SELECT *
 758              FROM ' . PROFILE_FIELDS_TABLE . '
 759              ORDER BY field_order';
 760          $result = $db->sql_query($sql);
 761  
 762          $s_one_need_edit = false;
 763          while ($row = $db->sql_fetchrow($result))
 764          {
 765              $active_lang = (!$row['field_active']) ? 'ACTIVATE' : 'DEACTIVATE';
 766              $active_value = (!$row['field_active']) ? 'activate' : 'deactivate';
 767              $id = $row['field_id'];
 768  
 769              $s_need_edit = (sizeof($lang_defs['diff'][$row['field_id']])) ? true : false;
 770  
 771              if ($s_need_edit)
 772              {
 773                  $s_one_need_edit = true;
 774              }
 775  
 776              $template->assign_block_vars('fields', array(
 777                  'FIELD_IDENT'        => $row['field_ident'],
 778                  'FIELD_TYPE'        => $user->lang['FIELD_' . strtoupper($cp->profile_types[$row['field_type']])],
 779  
 780                  'L_ACTIVATE_DEACTIVATE'        => $user->lang[$active_lang],
 781                  'U_ACTIVATE_DEACTIVATE'        => $this->u_action . "&amp;action=$active_value&amp;field_id=$id",
 782                  'U_EDIT'                    => $this->u_action . "&amp;action=edit&amp;field_id=$id",
 783                  'U_TRANSLATE'                => $this->u_action . "&amp;action=edit&amp;field_id=$id&amp;step=3",
 784                  'U_DELETE'                    => $this->u_action . "&amp;action=delete&amp;field_id=$id",
 785                  'U_MOVE_UP'                    => $this->u_action . "&amp;action=move_up&amp;order={$row['field_order']}",
 786                  'U_MOVE_DOWN'                => $this->u_action . "&amp;action=move_down&amp;order={$row['field_order']}",
 787  
 788                  'S_NEED_EDIT'                => $s_need_edit)
 789              );
 790          }
 791          $db->sql_freeresult($result);
 792  
 793          // At least one option field needs editing?
 794          if ($s_one_need_edit)
 795          {
 796              $template->assign_var('S_NEED_EDIT', true);
 797          }
 798  
 799          $s_select_type = '';
 800          foreach ($cp->profile_types as $key => $value)
 801          {
 802              $s_select_type .= '<option value="' . $key . '">' . $user->lang['FIELD_' . strtoupper($value)] . '</option>';
 803          }
 804  
 805          $template->assign_vars(array(
 806              'U_ACTION'            => $this->u_action,
 807              'S_TYPE_OPTIONS'    => $s_select_type)
 808          );
 809      }
 810  
 811      /**
 812      * Build all Language specific options
 813      */
 814  	function build_language_options(&$cp, $field_type, $action = 'create')
 815      {
 816          global $user, $config, $db;
 817  
 818          $sql = 'SELECT lang_id, lang_iso 
 819              FROM ' . LANG_TABLE . "
 820              WHERE lang_iso <> '" . $config['default_lang'] . "'
 821              ORDER BY lang_english_name";
 822          $result = $db->sql_query($sql);
 823  
 824          $languages = array();
 825          while ($row = $db->sql_fetchrow($result))
 826          {
 827              $languages[$row['lang_id']] = $row['lang_iso'];
 828          }
 829          $db->sql_freeresult($result);
 830          
 831          $options = array();
 832          $options['lang_name'] = 'string';
 833          if ($cp->vars['lang_explain'])
 834          {
 835              $options['lang_explain'] = 'text';
 836          }
 837      
 838          switch ($field_type)
 839          {
 840              case FIELD_BOOL:
 841                  $options['lang_options'] = 'two_options';
 842              break;
 843  
 844              case FIELD_DROPDOWN:
 845                  $options['lang_options'] = 'optionfield';
 846              break;
 847              
 848              case FIELD_TEXT:
 849              case FIELD_STRING:
 850                  if ($cp->vars['lang_default_value'])
 851                  {
 852                      $options['lang_default_value'] = ($field_type == FIELD_STRING) ? 'string' : 'text';
 853                  }
 854              break;
 855          }
 856      
 857          $lang_options = array();
 858  
 859          foreach ($options as $field => $field_type)
 860          {
 861              $lang_options[1]['lang_iso'] = $config['default_lang'];
 862              $lang_options[1]['fields'][$field] = array(
 863                  'TITLE'        => $user->lang['CP_' . strtoupper($field)],
 864                  'FIELD'        => '<dd>' . ((is_array($cp->vars[$field])) ? implode('<br />', $cp->vars[$field]) : str_replace("\n", '<br />', $cp->vars[$field])) . '</dd>'
 865              );
 866  
 867              if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
 868              {
 869                  $lang_options[1]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
 870              }
 871          }
 872  
 873          foreach ($languages as $lang_id => $lang_iso)
 874          {
 875              $lang_options[$lang_id]['lang_iso'] = $lang_iso;
 876              foreach ($options as $field => $field_type)
 877              {
 878                  $value = ($action == 'create') ? request_var('l_' . $field, array(0 => ''), true) : $cp->vars['l_' . $field];
 879  
 880                  if ($field == 'lang_options')
 881                  {
 882                      $var = ($action == 'create' || !is_array($cp->vars['l_lang_options'][$lang_id])) ? $cp->vars['lang_options'] : $cp->vars['lang_options'][$lang_id];
 883                      
 884                      switch ($field_type)
 885                      {
 886                          case 'two_options':
 887  
 888                              $lang_options[$lang_id]['fields'][$field] = array(
 889                                  'TITLE'        => $user->lang['CP_' . strtoupper($field)],
 890                                  'FIELD'        => '
 891                                              <dd><input class="medium" name="l_' . $field . '[' . $lang_id . '][]" value="' . ((isset($value[$lang_id][0])) ? $value[$lang_id][0] : $var[0]) . '" /> ' . $user->lang['FIRST_OPTION'] . '</dd>
 892                                              <dd><input class="medium" name="l_' . $field . '[' . $lang_id . '][]" value="' . ((isset($value[$lang_id][1])) ? $value[$lang_id][1] : $var[1]) . '" /> ' . $user->lang['SECOND_OPTION'] . '</dd>'
 893                              );
 894                          break;
 895  
 896                          case 'optionfield':
 897  
 898                              $lang_options[$lang_id]['fields'][$field] = array(
 899                                  'TITLE'        => $user->lang['CP_' . strtoupper($field)],
 900                                  'FIELD'        => '<dd><textarea name="l_' . $field . '[' . $lang_id . ']" rows="7" cols="80">' . ((isset($value[$lang_id])) ? implode("\n", $value[$lang_id]) : implode("\n", $var)) . '</textarea></dd>'
 901                              );
 902                          break;
 903                      }
 904                  
 905                      if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
 906                      {
 907                          $lang_options[$lang_id]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
 908                      }
 909                  }
 910                  else
 911                  {
 912                      $var = ($action == 'create' || !is_array($cp->vars[$field])) ? $cp->vars[$field] : $cp->vars[$field][$lang_id];
 913  
 914                      $lang_options[$lang_id]['fields'][$field] = array(
 915                          'TITLE'        => $user->lang['CP_' . strtoupper($field)],
 916                          'FIELD'        => ($field_type == 'string') ? '<dd><input class="medium" type="text" name="l_' . $field . '[' . $lang_id . ']" value="' . ((isset($value[$lang_id])) ? $value[$lang_id] : $var) . '" /></dd>' : '<dd><textarea name="l_' . $field . '[' . $lang_id . ']" rows="3" cols="80">' . ((isset($value[$lang_id])) ? $value[$lang_id] : $var) . '</textarea></dd>'
 917                      );
 918              
 919                      if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
 920                      {
 921                          $lang_options[$lang_id]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
 922                      }
 923                  }
 924              }
 925          }
 926  
 927          return $lang_options;
 928      }
 929  
 930      /**
 931      * Save Profile Field
 932      */
 933  	function save_profile_field(&$cp, $field_type, &$lang_defs, $action = 'create')
 934      {
 935          global $db, $config, $user;
 936  
 937          $field_id = request_var('field_id', 0);
 938  
 939          // Collect all informations, if something is going wrong, abort the operation
 940          $profile_sql = $profile_lang = $empty_lang = $profile_lang_fields = array();
 941  
 942          $default_lang_id = $lang_defs['iso'][$config['default_lang']];
 943  
 944          if ($action == 'create')
 945          {
 946              $sql = 'SELECT MAX(field_order) as max_field_order
 947                  FROM ' . PROFILE_FIELDS_TABLE;
 948              $result = $db->sql_query($sql);
 949              $new_field_order = (int) $db->sql_fetchfield('max_field_order');
 950              $db->sql_freeresult($result);
 951  
 952              $field_ident = $cp->vars['field_ident'];
 953          }
 954  
 955          // Save the field
 956          $profile_fields = array(
 957              'field_length'            => $cp->vars['field_length'],
 958              'field_minlen'            => $cp->vars['field_minlen'],
 959              'field_maxlen'            => $cp->vars['field_maxlen'],
 960              'field_novalue'            => $cp->vars['field_novalue'],
 961              'field_default_value'    => $cp->vars['field_default_value'],
 962              'field_validation'        => $cp->vars['field_validation'],
 963              'field_required'        => $cp->vars['field_required'],
 964              'field_show_on_reg'        => $cp->vars['field_show_on_reg'],
 965              'field_hide'            => $cp->vars['field_hide'],
 966              'field_no_view'            => $cp->vars['field_no_view']
 967          );
 968  
 969          if ($action == 'create')
 970          {
 971              $profile_fields += array(
 972                  'field_type'        => $field_type,
 973                  'field_ident'        => $field_ident,
 974                  'field_name'        => $field_ident,
 975                  'field_order'        => $new_field_order + 1,
 976                  'field_active'        => 1
 977              );
 978  
 979              $sql = 'INSERT INTO ' . PROFILE_FIELDS_TABLE . ' ' . $db->sql_build_array('INSERT', $profile_fields);
 980              $db->sql_query($sql);
 981  
 982              $field_id = $db->sql_nextid();
 983          }
 984          else
 985          {
 986              $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . '
 987                  SET ' . $db->sql_build_array('UPDATE', $profile_fields) . "
 988                  WHERE field_id = $field_id";
 989              $db->sql_query($sql);
 990          }
 991          
 992          if ($action == 'create')
 993          {
 994              $field_ident = 'pf_' . $field_ident;
 995              $profile_sql[] = $this->add_field_ident($field_ident, $field_type);
 996          }
 997  
 998          $sql_ary = array(
 999              'lang_name'                => $cp->vars['lang_name'],
1000              'lang_explain'            => $cp->vars['lang_explain'],
1001              'lang_default_value'    => $cp->vars['lang_default_value']
1002          );
1003  
1004          if ($action == 'create')
1005          {
1006              $sql_ary['field_id'] = $field_id;
1007              $sql_ary['lang_id'] = $default_lang_id;
1008          
1009              $profile_sql[] = 'INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
1010          }
1011          else
1012          {
1013              $this->update_insert(PROFILE_LANG_TABLE, $sql_ary, array('field_id' => $field_id, 'lang_id' => $default_lang_id));
1014          }
1015  
1016          if (is_array($cp->vars['l_lang_name']) && sizeof($cp->vars['l_lang_name']))
1017          {
1018              foreach ($cp->vars['l_lang_name'] as $lang_id => $data)
1019              {
1020                  if (($cp->vars['lang_name'] != '' && $cp->vars['l_lang_name'][$lang_id] == '')
1021                      || ($cp->vars['lang_explain'] != '' && $cp->vars['l_lang_explain'][$lang_id] == '')
1022                      || ($cp->vars['lang_default_value'] != '' && $cp->vars['l_lang_default_value'][$lang_id] == ''))
1023                  {
1024                      $empty_lang[$lang_id] = true;
1025                      break;
1026                  }
1027  
1028                  if (!isset($empty_lang[$lang_id]))
1029                  {
1030                      $profile_lang[] = array(
1031                          'field_id'        => $field_id,
1032                          'lang_id'        => $lang_id,
1033                          'lang_name'        => $cp->vars['l_lang_name'][$lang_id],
1034                          'lang_explain'    => (isset($cp->vars['l_lang_explain'][$lang_id])) ? $cp->vars['l_lang_explain'][$lang_id] : '',
1035                          'lang_default_value'    => (isset($cp->vars['l_lang_default_value'][$lang_id])) ? $cp->vars['l_lang_default_value'][$lang_id] : ''
1036                      );
1037                  }
1038              }
1039  
1040              foreach ($empty_lang as $lang_id => $NULL)
1041              {
1042                  $sql = 'DELETE FROM ' . PROFILE_LANG_TABLE . " 
1043                      WHERE field_id = $field_id
1044                      AND lang_id = " . (int) $lang_id;
1045                  $db->sql_query($sql);
1046              }
1047          }
1048  
1049          // These are always arrays because the key is the language id...
1050          $cp->vars['l_lang_name']            = request_var('l_lang_name', array(0 => ''), true);
1051          $cp->vars['l_lang_explain']            = request_var('l_lang_explain', array(0 => ''), true);
1052          $cp->vars['l_lang_default_value']    = request_var('l_lang_default_value', array(0 => ''), true);
1053          $cp->vars['l_lang_options']            = request_var('l_lang_options', array(0 => ''), true);
1054  
1055          if ($cp->vars['lang_options'])
1056          {
1057              if (!is_array($cp->vars['lang_options']))
1058              {
1059                  $cp->vars['lang_options'] = explode("\n", $cp->vars['lang_options']);
1060              }
1061  
1062              if ($action != 'create')
1063              {
1064                  $sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " 
1065                      WHERE field_id = $field_id
1066                          AND lang_id = " . (int) $default_lang_id;
1067                  $db->sql_query($sql);
1068              }
1069              
1070              foreach ($cp->vars['lang_options'] as $option_id => $value)
1071              {
1072                  $sql_ary = array(
1073                      'field_type'    => (int) $field_type,
1074                      'lang_value'    => $value
1075                  );
1076  
1077                  if ($action == 'create')
1078                  {
1079                      $sql_ary['field_id'] = $field_id;
1080                      $sql_ary['lang_id'] = $default_lang_id;
1081                      $sql_ary['option_id'] = (int) $option_id;
1082  
1083                      $profile_sql[] = 'INSERT INTO ' . PROFILE_FIELDS_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
1084                  }
1085                  else
1086                  {
1087                      $this->update_insert(PROFILE_FIELDS_LANG_TABLE, $sql_ary, array(
1088                          'field_id'    => $field_id,
1089                          'lang_id'    => (int) $default_lang_id,
1090                          'option_id'    => (int) $option_id)
1091                      );
1092                  }
1093              }
1094          }
1095  
1096          if (is_array($cp->vars['l_lang_options']) && sizeof($cp->vars['l_lang_options']))
1097          {
1098              $empty_lang = array();
1099  
1100              foreach ($cp->vars['l_lang_options'] as $lang_id => $lang_ary)
1101              {
1102                  if (!is_array($lang_ary))
1103                  {
1104                      $lang_ary = explode("\n", $lang_ary);
1105                  }
1106  
1107                  if (sizeof($lang_ary) != sizeof($cp->vars['lang_options']))
1108                  {
1109                      $empty_lang[$lang_id] = true;
1110                  }
1111  
1112                  if (!isset($empty_lang[$lang_id]))
1113                  {
1114                      if ($action != 'create')
1115                      {
1116                          $sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " 
1117                              WHERE field_id = $field_id
1118                              AND lang_id = " . (int) $lang_id;
1119                          $db->sql_query($sql);
1120                      }
1121  
1122                      foreach ($lang_ary as $option_id => $value)
1123                      {
1124                          $profile_lang_fields[] = array(
1125                              'field_id'        => (int) $field_id,
1126                              'lang_id'        => (int) $lang_id,
1127                              'option_id'        => (int) $option_id,
1128                              'field_type'    => (int) $field_type,
1129                              'lang_value'    => $value
1130                          );
1131                      }
1132                  }
1133              }
1134  
1135              foreach ($empty_lang as $lang_id => $NULL)
1136              {
1137                  $sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " 
1138                      WHERE field_id = $field_id
1139                      AND lang_id = " . (int) $lang_id;
1140                  $db->sql_query($sql);
1141              }
1142          }
1143  
1144          foreach ($profile_lang as $sql)
1145          {
1146              if ($action == 'create')
1147              {
1148                  $profile_sql[] = 'INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql);
1149              }
1150              else
1151              {
1152                  $lang_id = $sql['lang_id'];
1153                  unset($sql['lang_id'], $sql['field_id']);
1154  
1155                  $this->update_insert(PROFILE_LANG_TABLE, $sql, array('lang_id' => (int) $lang_id, 'field_id' => $field_id));
1156              }
1157          }
1158  
1159          if (sizeof($profile_lang_fields))
1160          {
1161              foreach ($profile_lang_fields as $sql)
1162              {
1163                  if ($action == 'create')
1164                  {
1165                      $profile_sql[] = 'INSERT INTO ' . PROFILE_FIELDS_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql);
1166                  }
1167                  else
1168                  {
1169                      $lang_id = $sql['lang_id'];
1170                      $option_id = $sql['option_id'];
1171                      unset($sql['lang_id'], $sql['field_id'], $sql['option_id']);
1172                      
1173                      $this->update_insert(PROFILE_FIELDS_LANG_TABLE, $sql, array(
1174                          'lang_id'    => $lang_id, 
1175                          'field_id'    => $field_id,
1176                          'option_id'    => $option_id)
1177                      );
1178                  }
1179              }
1180          }
1181  
1182  
1183          $db->sql_transaction('begin');
1184  
1185          if ($action == 'create')
1186          {
1187              foreach ($profile_sql as $sql)
1188              {
1189                  $db->sql_query($sql);
1190              }
1191          }
1192          
1193          $db->sql_transaction('commit');
1194  
1195          if ($action == 'edit')
1196          {
1197              add_log('admin', 'LOG_PROFILE_FIELD_EDIT', $cp->vars['field_ident'] . ':' . $cp->vars['lang_name']);
1198              trigger_error($user->lang['CHANGED_PROFILE_FIELD'] . adm_back_link($this->u_action));
1199          }
1200          else
1201          {
1202              add_log('admin', 'LOG_PROFILE_FIELD_CREATE', substr($field_ident, 3) . ':' . $cp->vars['lang_name']);
1203              trigger_error($user->lang['ADDED_PROFILE_FIELD'] . adm_back_link($this->u_action));
1204          }
1205      }
1206  
1207      /**
1208      * Update, then insert if not successfull
1209      */
1210  	function update_insert($table, $sql_ary, $where_fields)
1211      {
1212          global $db;
1213  
1214          $where_sql = array();
1215          $check_key = '';
1216  
1217          foreach ($where_fields as $key => $value)
1218          {
1219              $check_key = (!$check_key) ? $key : $check_key;
1220              $where_sql[] = $key . ' = ' . ((is_string($value)) ? "'" . $db->sql_escape($value) . "'" : (int) $value);
1221          }
1222  
1223          if (!sizeof($where_sql))
1224          {
1225              return;
1226          }
1227  
1228          $sql = "SELECT $check_key 
1229              FROM $table
1230              WHERE " . implode(' AND ', $where_sql);
1231          $result = $db->sql_query($sql);
1232          $row = $db->sql_fetchrow($result);
1233          $db->sql_freeresult($result);
1234  
1235          if (!$row)
1236          {
1237              $sql_ary = array_merge($where_fields, $sql_ary);
1238              
1239              if (sizeof($sql_ary))
1240              {
1241                  $db->sql_query("INSERT INTO $table " . $db->sql_build_array('INSERT', $sql_ary));
1242              }
1243          }
1244          else
1245          {
1246              if (sizeof($sql_ary))
1247              {
1248                  $sql = "UPDATE $table SET " . $db->sql_build_array('UPDATE', $sql_ary) . ' 
1249                      WHERE ' . implode(' AND ', $where_sql);
1250                  $db->sql_query($sql);
1251              }
1252          }
1253      }
1254  
1255      /**
1256      * Return sql statement for adding a new field ident (profile field) to the profile fields data table
1257      */
1258  	function add_field_ident($field_ident, $field_type)
1259      {
1260          global $db;
1261  
1262          switch ($db->sql_layer)
1263          {
1264              case 'mysql':
1265              case 'mysql4':
1266              case 'mysqli':
1267  
1268                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1269                  $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD `$field_ident` ";
1270  
1271                  switch ($field_type)
1272                  {
1273                      case FIELD_STRING:
1274                          $sql .= ' VARCHAR(255) ';
1275                      break;
1276  
1277                      case FIELD_DATE:
1278                          $sql .= 'VARCHAR(10) ';
1279                      break;
1280  
1281                      case FIELD_TEXT:
1282                          $sql .= "TEXT";
1283          //                        ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
1284          //                        ADD {$field_ident}_bbcode_bitfield INT(11) UNSIGNED";
1285                      break;
1286  
1287                      case FIELD_BOOL:
1288                          $sql .= 'TINYINT(2) ';
1289                      break;
1290                  
1291                      case FIELD_DROPDOWN:
1292                          $sql .= 'MEDIUMINT(8) ';
1293                      break;
1294  
1295                      case FIELD_INT:
1296                          $sql .= 'BIGINT(20) ';
1297                      break;
1298                  }
1299  
1300              break;
1301  
1302              case 'sqlite':
1303  
1304                  switch ($field_type)
1305                  {
1306                      case FIELD_STRING:
1307                          $type = ' VARCHAR(255) ';
1308                      break;
1309  
1310                      case FIELD_DATE:
1311                          $type = 'VARCHAR(10) ';
1312                      break;
1313  
1314                      case FIELD_TEXT:
1315                          $type = "TEXT(65535)";
1316          //                        ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
1317          //                        ADD {$field_ident}_bbcode_bitfield INT(11) UNSIGNED";
1318                      break;
1319  
1320                      case FIELD_BOOL:
1321                          $type = 'TINYINT(2) ';
1322                      break;
1323  
1324                      case FIELD_DROPDOWN:
1325                          $type = 'MEDIUMINT(8) ';
1326                      break;
1327  
1328                      case FIELD_INT:
1329                          $type = 'BIGINT(20) ';
1330                      break;
1331                  }
1332  
1333                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1334                  if (version_compare(sqlite_libversion(), '3.0') == -1)
1335                  {
1336                      $sql = "SELECT sql
1337                          FROM sqlite_master 
1338                          WHERE type = 'table' 
1339                              AND name = '" . PROFILE_FIELDS_DATA_TABLE . "'
1340                          ORDER BY type DESC, name;";
1341                      $result = $db->sql_query($sql);
1342                      $row = $db->sql_fetchrow($result);
1343                      $db->sql_freeresult($result);
1344  
1345                      // Create a temp table and populate it, destroy the existing one
1346                      $db->sql_query(preg_replace('#CREATE\s+TABLE\s+"?' . PROFILE_FIELDS_DATA_TABLE . '"?#i', 'CREATE TEMPORARY TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp', $row['sql']));
1347                      $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . '_temp SELECT * FROM ' . PROFILE_FIELDS_DATA_TABLE);
1348                      $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE);
1349  
1350                      preg_match('#\((.*)\)#s', $row['sql'], $matches);
1351  
1352                      $new_table_cols = trim($matches[1]);
1353                      $old_table_cols = explode(',', $new_table_cols);
1354                      $column_list = array();
1355  
1356                      foreach ($old_table_cols as $declaration)
1357                      {
1358                          $entities = preg_split('#\s+#', trim($declaration));
1359                          if ($entities == 'PRIMARY')
1360                          {
1361                              continue;
1362                          }
1363                          $column_list[] = $entities[0];
1364                      }
1365  
1366                      $columns = implode(',', $column_list);
1367  
1368                      $new_table_cols = $field_ident . ' ' . $type . ',' . $new_table_cols;
1369  
1370                      // create a new table and fill it up. destroy the temp one
1371                      $db->sql_query('CREATE TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $new_table_cols . ');');
1372                      $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . PROFILE_FIELDS_DATA_TABLE . '_temp;');
1373                      $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp');
1374                  }
1375                  else
1376                  {
1377                      $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident [$type]";
1378                  }
1379  
1380              break;
1381  
1382              case 'mssql':
1383              case 'mssql_odbc':
1384  
1385                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1386                  $sql = 'ALTER TABLE [' . PROFILE_FIELDS_DATA_TABLE . "] ADD [$field_ident] ";
1387  
1388                  switch ($field_type)
1389                  {
1390                      case FIELD_STRING:
1391                          $sql .= ' [VARCHAR] (255) ';
1392                      break;
1393  
1394                      case FIELD_DATE:
1395                          $sql .= '[VARCHAR] (10) ';
1396                      break;
1397  
1398                      case FIELD_TEXT:
1399                          $sql .= "[TEXT]";
1400          //                        ADD {$field_ident}_bbcode_uid [VARCHAR] (5) NOT NULL,
1401          //                        ADD {$field_ident}_bbcode_bitfield [INT] UNSIGNED";
1402                      break;
1403  
1404                      case FIELD_BOOL:
1405                      case FIELD_DROPDOWN:
1406                          $sql .= '[INT] ';
1407                      break;
1408  
1409                      case FIELD_INT:
1410                          $sql .= '[FLOAT] ';
1411                      break;
1412                  }
1413  
1414              break;
1415  
1416              case 'postgres':
1417  
1418                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1419                  $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD COLUMN \"$field_ident\" ";
1420  
1421                  switch ($field_type)
1422                  {
1423                      case FIELD_STRING:
1424                          $sql .= ' VARCHAR(255) ';
1425                      break;
1426  
1427                      case FIELD_DATE:
1428                          $sql .= 'VARCHAR(10) ';
1429                      break;
1430  
1431                      case FIELD_TEXT:
1432                          $sql .= "TEXT";
1433          //                        ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
1434          //                        ADD {$field_ident}_bbcode_bitfield INT4 UNSIGNED";
1435                      break;
1436  
1437                      case FIELD_BOOL:
1438                          $sql .= 'INT2 ';
1439                      break;
1440  
1441                      case FIELD_DROPDOWN:
1442                          $sql .= 'INT4 ';
1443                      break;
1444  
1445                      case FIELD_INT:
1446                          $sql .= 'INT8 ';
1447                      break;
1448                  }
1449  
1450              break;
1451  
1452              case 'firebird':
1453  
1454                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1455                  $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD \"$field_ident\" ";
1456  
1457                  switch ($field_type)
1458                  {
1459                      case FIELD_STRING:
1460                          $sql .= ' VARCHAR(255) ';
1461                      break;
1462  
1463                      case FIELD_DATE:
1464                          $sql .= 'VARCHAR(10) ';
1465                      break;
1466  
1467                      case FIELD_TEXT:
1468                          $sql .= "BLOB SUB_TYPE TEXT";
1469          //                        ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
1470          //                        ADD {$field_ident}_bbcode_bitfield INTEGER UNSIGNED";
1471                      break;
1472  
1473                      case FIELD_BOOL:
1474                      case FIELD_DROPDOWN:
1475                          $sql .= 'INTEGER ';
1476                      break;
1477  
1478                      case FIELD_INT:
1479                          $sql .= 'DOUBLE PRECISION ';
1480                      break;
1481                  }
1482  
1483              break;
1484  
1485              case 'oracle':
1486  
1487                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1488                  $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD \"$field_ident\" ";
1489  
1490                  switch ($field_type)
1491                  {
1492                      case FIELD_STRING:
1493                          $sql .= ' VARCHAR2(255) ';
1494                      break;
1495  
1496                      case FIELD_DATE:
1497                          $sql .= 'VARCHAR2(10) ';
1498                      break;
1499  
1500                      case FIELD_TEXT:
1501                          $sql .= "CLOB";
1502          //                        ADD {$field_ident}_bbcode_uid VARCHAR2(5) NOT NULL,
1503          //                        ADD {$field_ident}_bbcode_bitfield NUMBER(11) UNSIGNED";
1504                      break;
1505  
1506                      case FIELD_BOOL:
1507                          $sql .= 'NUMBER(2) ';
1508                      break;
1509  
1510                      case FIELD_DROPDOWN:
1511                          $sql .= 'NUMBER(8) ';
1512                      break;
1513  
1514                      case FIELD_INT:
1515                          $sql .= 'NUMBER(20) ';
1516                      break;
1517                  }
1518  
1519              break;
1520          }
1521  
1522          return $sql;
1523      }
1524  }
1525  
1526  ?>


Generated: Wed Nov 22 00:35:05 2006 Cross-referenced by PHPXref 0.6