Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

acp_profile.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 49.26 KiB


0001  <?php
0002  /**
0003  *
0004  * @package acp
0005  * @version $Id$
0006  * @copyright (c) 2005 phpBB Group
0007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
0008  *
0009  */
0010   
0011  /**
0012  * @ignore
0013  */
0014  if (!defined('IN_PHPBB'))
0015  {
0016      exit;
0017  }
0018   
0019  /**
0020  * @package acp
0021  */
0022  class acp_profile
0023  {
0024      var $u_action;
0025   
0026      var $edit_lang_id;
0027      var $lang_defs;
0028   
0029      function main($id, $mode)
0030      {
0031          global $config, $db, $user, $auth, $template, $cache;
0032          global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
0033   
0034          include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
0035          include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
0036          include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
0037   
0038          $user->add_lang(array('ucp', 'acp/profile'));
0039          $this->tpl_name = 'acp_profile';
0040          $this->page_title = 'ACP_CUSTOM_PROFILE_FIELDS';
0041   
0042          $action = (isset($_POST['create'])) ? 'create' : request_var('action', '');
0043   
0044          $error = array();
0045          $s_hidden_fields = '';
0046   
0047          // Define some default values for each field type
0048          $default_values = array(
0049              FIELD_STRING    => array('field_length' => 10, 'field_minlen' => 0, 'field_maxlen' => 20, 'field_validation' => '.*', 'field_novalue' => '', 'field_default_value' => ''),
0050              FIELD_TEXT        => array('field_length' => '5|80', 'field_minlen' => 0, 'field_maxlen' => 1000, 'field_validation' => '.*', 'field_novalue' => '', 'field_default_value' => ''),
0051              FIELD_INT        => array('field_length' => 5, 'field_minlen' => 0, 'field_maxlen' => 100, 'field_validation' => '', 'field_novalue' => 0, 'field_default_value' => 0),
0052              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'),
0053              FIELD_BOOL        => array('field_length' => 1, 'field_minlen' => 0, 'field_maxlen' => 0, 'field_validation' => '', 'field_novalue' => 0, 'field_default_value' => 0),
0054              FIELD_DROPDOWN    => array('field_length' => 0, 'field_minlen' => 0, 'field_maxlen' => 5, 'field_validation' => '', 'field_novalue' => 0, 'field_default_value' => 0),
0055          );
0056   
0057          $cp = new custom_profile_admin();
0058   
0059          // Build Language array
0060          // Based on this, we decide which elements need to be edited later and which language items are missing
0061          $this->lang_defs = array();
0062   
0063          $sql = 'SELECT lang_id, lang_iso
0064              FROM ' . LANG_TABLE . '
0065              ORDER BY lang_english_name';
0066          $result = $db->sql_query($sql);
0067   
0068          while ($row = $db->sql_fetchrow($result))
0069          {
0070              // Make some arrays with all available languages
0071              $this->lang_defs['id'][$row['lang_id']] = $row['lang_iso'];
0072              $this->lang_defs['iso'][$row['lang_iso']] = $row['lang_id'];
0073          }
0074          $db->sql_freeresult($result);
0075   
0076          $sql = 'SELECT field_id, lang_id
0077              FROM ' . PROFILE_LANG_TABLE . '
0078              ORDER BY lang_id';
0079          $result = $db->sql_query($sql);
0080      
0081          while ($row = $db->sql_fetchrow($result))
0082          {
0083              // Which languages are available for each item
0084              $this->lang_defs['entry'][$row['field_id']][] = $row['lang_id'];
0085          }
0086          $db->sql_freeresult($result);
0087   
0088          // Have some fields been defined?
0089          if (isset($this->lang_defs['entry']))
0090          {
0091              foreach ($this->lang_defs['entry'] as $field_id => $field_ary)
0092              {
0093                  // Fill an array with the languages that are missing for each field
0094                  $this->lang_defs['diff'][$field_id] = array_diff(array_values($this->lang_defs['iso']), $field_ary);
0095              }
0096          }
0097   
0098          switch ($action)
0099          {
0100              case 'delete':
0101                  $field_id = request_var('field_id', 0);
0102   
0103                  if (!$field_id)
0104                  {
0105                      trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
0106                  }
0107   
0108                  if (confirm_box(true))
0109                  {
0110                      $sql = 'SELECT field_ident
0111                          FROM ' . PROFILE_FIELDS_TABLE . "
0112                          WHERE field_id = $field_id";
0113                      $result = $db->sql_query($sql);
0114                      $field_ident = (string) $db->sql_fetchfield('field_ident');
0115                      $db->sql_freeresult($result);
0116   
0117                      $db->sql_transaction('begin');
0118   
0119                      $db->sql_query('DELETE FROM ' . PROFILE_FIELDS_TABLE . " WHERE field_id = $field_id");
0120                      $db->sql_query('DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " WHERE field_id = $field_id");
0121                      $db->sql_query('DELETE FROM ' . PROFILE_LANG_TABLE . " WHERE field_id = $field_id");
0122   
0123                      switch ($db->sql_layer)
0124                      {
0125                          case 'sqlite':
0126                              $sql = "SELECT sql
0127                                  FROM sqlite_master
0128                                  WHERE type = 'table'
0129                                      AND name = '" . PROFILE_FIELDS_DATA_TABLE . "'
0130                                  ORDER BY type DESC, name;";
0131                              $result = $db->sql_query($sql);
0132                              $row = $db->sql_fetchrow($result);
0133                              $db->sql_freeresult($result);
0134   
0135                              // Create a temp table and populate it, destroy the existing one
0136                              $db->sql_query(preg_replace('#CREATE\s+TABLE\s+"?' . PROFILE_FIELDS_DATA_TABLE . '"?#i', 'CREATE TEMPORARY TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp', $row['sql']));
0137                              $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . '_temp SELECT * FROM ' . PROFILE_FIELDS_DATA_TABLE);
0138                              $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE);
0139   
0140                              preg_match('#\((.*)\)#s', $row['sql'], $matches);
0141   
0142                              $new_table_cols = trim($matches[1]);
0143                              $old_table_cols = preg_split('/,(?=[\\sa-z])/im', $new_table_cols);
0144                              $column_list = array();
0145   
0146                              foreach ($old_table_cols as $declaration)
0147                              {
0148                                  $entities = preg_split('#\s+#', trim($declaration));
0149   
0150                                  if ($entities[0] == 'PRIMARY')
0151                                  {
0152                                      continue;
0153                                  }
0154   
0155                                  if ($entities[0] !== 'pf_' . $field_ident)
0156                                  {
0157                                      $column_list[] = $entities[0];
0158                                  }
0159                              }
0160   
0161                              $columns = implode(',', $column_list);
0162   
0163                              $new_table_cols = preg_replace('/' . 'pf_' . $field_ident . '[^,]+,/', '', $new_table_cols);
0164   
0165                              // create a new table and fill it up. destroy the temp one
0166                              $db->sql_query('CREATE TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $new_table_cols . ');');
0167                              $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . PROFILE_FIELDS_DATA_TABLE . '_temp;');
0168                              $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp');
0169                          break;
0170   
0171                          default:
0172                              $db->sql_query('ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " DROP COLUMN pf_$field_ident");
0173                      }
0174   
0175                      $order = 0;
0176   
0177                      $sql = 'SELECT *
0178                          FROM ' . PROFILE_FIELDS_TABLE . '
0179                          ORDER BY field_order';
0180                      $result = $db->sql_query($sql);
0181   
0182                      while ($row = $db->sql_fetchrow($result))
0183                      {
0184                          $order++;
0185                          if ($row['field_order'] != $order)
0186                          {
0187                              $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
0188                                  SET field_order = $order
0189                                  WHERE field_id = {$row['field_id']}";
0190                              $db->sql_query($sql);
0191                          }
0192                      }
0193                      $db->sql_freeresult($result);
0194   
0195                      $db->sql_transaction('commit');
0196   
0197                      add_log('admin', 'LOG_PROFILE_FIELD_REMOVED', $field_ident);
0198                      trigger_error($user->lang['REMOVED_PROFILE_FIELD'] . adm_back_link($this->u_action));
0199                  }
0200                  else
0201                  {
0202                      confirm_box(false, 'DELETE_PROFILE_FIELD', build_hidden_fields(array(
0203                          'i'            => $id,
0204                          'mode'        => $mode,
0205                          'action'    => $action,
0206                          'field_id'    => $field_id,
0207                      )));
0208                  }
0209      
0210              break;
0211   
0212              case 'activate':
0213                  $field_id = request_var('field_id', 0);
0214   
0215                  if (!$field_id)
0216                  {
0217                      trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
0218                  }
0219      
0220                  $sql = 'SELECT lang_id
0221                      FROM ' . LANG_TABLE . "
0222                      WHERE lang_iso = '" . $db->sql_escape($config['default_lang']) . "'";
0223                  $result = $db->sql_query($sql);
0224                  $default_lang_id = (int) $db->sql_fetchfield('lang_id');
0225                  $db->sql_freeresult($result);
0226   
0227                  if (!in_array($default_lang_id, $this->lang_defs['entry'][$field_id]))
0228                  {
0229                      trigger_error($user->lang['DEFAULT_LANGUAGE_NOT_FILLED'] . adm_back_link($this->u_action), E_USER_WARNING);
0230                  }
0231   
0232                  $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
0233                      SET field_active = 1
0234                      WHERE field_id = $field_id";
0235                  $db->sql_query($sql);
0236   
0237                  $sql = 'SELECT field_ident
0238                      FROM ' . PROFILE_FIELDS_TABLE . "
0239                      WHERE field_id = $field_id";
0240                  $result = $db->sql_query($sql);
0241                  $field_ident = (string) $db->sql_fetchfield('field_ident');
0242                  $db->sql_freeresult($result);
0243   
0244                  add_log('admin', 'LOG_PROFILE_FIELD_ACTIVATE', $field_ident);
0245                  trigger_error($user->lang['PROFILE_FIELD_ACTIVATED'] . adm_back_link($this->u_action));
0246   
0247              break;
0248   
0249              case 'deactivate':
0250                  $field_id = request_var('field_id', 0);
0251   
0252                  if (!$field_id)
0253                  {
0254                      trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
0255                  }
0256      
0257                  $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
0258                      SET field_active = 0
0259                      WHERE field_id = $field_id";
0260                  $db->sql_query($sql);
0261   
0262                  $sql = 'SELECT field_ident
0263                      FROM ' . PROFILE_FIELDS_TABLE . "
0264                      WHERE field_id = $field_id";
0265                  $result = $db->sql_query($sql);
0266                  $field_ident = (string) $db->sql_fetchfield('field_ident');
0267                  $db->sql_freeresult($result);
0268   
0269                  add_log('admin', 'LOG_PROFILE_FIELD_DEACTIVATE', $field_ident);
0270                  trigger_error($user->lang['PROFILE_FIELD_DEACTIVATED'] . adm_back_link($this->u_action));
0271   
0272              break;
0273   
0274              case 'move_up':
0275              case 'move_down':
0276                  $field_order = request_var('order', 0);
0277                  $order_total = $field_order * 2 + (($action == 'move_up') ? -1 : 1);
0278   
0279                  $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
0280                      SET field_order = $order_total - field_order
0281                      WHERE field_order IN ($field_order" . (($action == 'move_up') ? $field_order - 1 : $field_order + 1) . ')';
0282                  $db->sql_query($sql);
0283   
0284              break;
0285   
0286              case 'create':
0287              case 'edit':
0288          
0289                  $field_id = request_var('field_id', 0);
0290                  $step = request_var('step', 1);
0291   
0292                  $submit = (isset($_REQUEST['next']) || isset($_REQUEST['prev'])) ? true : false;
0293                  $save = (isset($_REQUEST['save'])) ? true : false;
0294   
0295                  // The language id of default language
0296                  $this->edit_lang_id = $this->lang_defs['iso'][$config['default_lang']];
0297   
0298                  // We are editing... we need to grab basic things
0299                  if ($action == 'edit')
0300                  {
0301                      if (!$field_id)
0302                      {
0303                          trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
0304                      }
0305   
0306                      $sql = 'SELECT l.*, f.*
0307                          FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f
0308                          WHERE l.lang_id = ' . $this->edit_lang_id . "
0309                              AND f.field_id = $field_id
0310                              AND l.field_id = f.field_id";
0311                      $result = $db->sql_query($sql);
0312                      $field_row = $db->sql_fetchrow($result);
0313                      $db->sql_freeresult($result);
0314   
0315                      if (!$field_row)
0316                      {
0317                          // Some admin changed the default language?
0318                          $sql = 'SELECT l.*, f.*
0319                              FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f
0320                              WHERE l.lang_id <> ' . $this->edit_lang_id . "
0321                              AND f.field_id = $field_id
0322                              AND l.field_id = f.field_id";
0323                          $result = $db->sql_query($sql);
0324                          $field_row = $db->sql_fetchrow($result);
0325                          $db->sql_freeresult($result);
0326   
0327                          if (!$field_row)
0328                          {
0329                              trigger_error($user->lang['FIELD_NOT_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
0330                          }
0331   
0332                          $this->edit_lang_id = $field_row['lang_id'];
0333                      }
0334                      $field_type = $field_row['field_type'];
0335   
0336                      // Get language entries
0337                      $sql = 'SELECT *
0338                          FROM ' . PROFILE_FIELDS_LANG_TABLE . '
0339                          WHERE lang_id = ' . $this->edit_lang_id . "
0340                              AND field_id = $field_id
0341                          ORDER BY option_id ASC";
0342                      $result = $db->sql_query($sql);
0343   
0344                      $lang_options = array();
0345                      while ($row = $db->sql_fetchrow($result))
0346                      {
0347                          $lang_options[$row['option_id']] = $row['lang_value'];
0348                      }
0349                      $db->sql_freeresult($result);
0350   
0351                      $s_hidden_fields = '<input type="hidden" name="field_id" value="' . $field_id . '" />';
0352                  }
0353                  else
0354                  {
0355                      // We are adding a new field, define basic params
0356                      $lang_options = $field_row = array();
0357          
0358                      $field_type = request_var('field_type', 0);
0359              
0360                      if (!$field_type)
0361                      {
0362                          trigger_error($user->lang['NO_FIELD_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
0363                      }
0364   
0365                      $field_row = array_merge($default_values[$field_type], array(
0366                          'field_ident'        => utf8_clean_string(request_var('field_ident', '', true)),
0367                          'field_required'    => 0,
0368                          'field_hide'        => 0,
0369                          'field_no_view'        => 0,
0370                          'field_show_on_reg'    => 0,
0371                          'lang_name'            => utf8_normalize_nfc(request_var('field_ident', '', true)),
0372                          'lang_explain'        => '',
0373                          'lang_default_value'=> '')
0374                      );
0375   
0376                      $s_hidden_fields = '<input type="hidden" name="field_type" value="' . $field_type . '" />';
0377                  }
0378   
0379                  // $exclude contains the data we gather in each step
0380                  $exclude = array(
0381                      1    => array('field_ident', 'lang_name', 'lang_explain', 'field_option', 'field_no_view'),
0382                      2    => array('field_length', 'field_maxlen', 'field_minlen', 'field_validation', 'field_novalue', 'field_default_value'),
0383                      3    => array('l_lang_name', 'l_lang_explain', 'l_lang_default_value', 'l_lang_options')
0384                  );
0385   
0386                  // Text-based fields require the lang_default_value to be excluded
0387                  if ($field_type == FIELD_STRING || $field_type == FIELD_TEXT)
0388                  {
0389                      $exclude[1][] = 'lang_default_value';
0390                  }
0391   
0392                  // option-specific fields require lang_options to be excluded
0393                  if ($field_type == FIELD_BOOL || $field_type == FIELD_DROPDOWN)
0394                  {
0395                      $exclude[1][] = 'lang_options';
0396                  }
0397   
0398                  $cp->vars['field_ident']        = ($action == 'create' && $step == 1) ? utf8_clean_string(request_var('field_ident', $field_row['field_ident'], true)) : request_var('field_ident', $field_row['field_ident']);
0399                  $cp->vars['lang_name']            = utf8_normalize_nfc(request_var('lang_name', $field_row['lang_name'], true));
0400                  $cp->vars['lang_explain']        = utf8_normalize_nfc(request_var('lang_explain', $field_row['lang_explain'], true));
0401                  $cp->vars['lang_default_value']    = utf8_normalize_nfc(request_var('lang_default_value', $field_row['lang_default_value'], true));
0402   
0403                  // Field option...
0404                  if (isset($_REQUEST['field_option']))
0405                  {
0406                      $field_option = request_var('field_option', '');
0407   
0408                      $cp->vars['field_required'] = ($field_option == 'field_required') ? 1 : 0;
0409                      $cp->vars['field_show_on_reg'] = ($field_option == 'field_show_on_reg') ? 1 : 0;
0410                      $cp->vars['field_hide'] = ($field_option == 'field_hide') ? 1 : 0;
0411                  }
0412                  else
0413                  {
0414                      $cp->vars['field_required'] = $field_row['field_required'];
0415                      $cp->vars['field_show_on_reg'] = $field_row['field_show_on_reg'];
0416                      $cp->vars['field_hide'] = $field_row['field_hide'];
0417   
0418                      $field_option = ($field_row['field_required']) ? 'field_required' : (($field_row['field_show_on_reg']) ? 'field_show_on_reg' : (($field_row['field_hide']) ? 'field_hide' : ''));
0419                  }
0420   
0421                  $cp->vars['field_no_view'] = request_var('field_no_view', $field_row['field_no_view']);
0422   
0423                  // A boolean field expects an array as the lang options
0424                  if ($field_type == FIELD_BOOL)
0425                  {
0426                      $options = utf8_normalize_nfc(request_var('lang_options', array(''), true));
0427                  }
0428                  else
0429                  {
0430                      $options = utf8_normalize_nfc(request_var('lang_options', '', true));
0431                  }
0432   
0433                  // If the user has submitted a form with options (i.e. dropdown field)
0434                  if ($options)
0435                  {
0436                      $exploded_options = (is_array($options)) ? $options : explode("\n", $options);
0437   
0438                      if (sizeof($exploded_options) == sizeof($lang_options) || $action == 'create')
0439                      {
0440                          // The number of options in the field is equal to the number of options already in the database
0441                          // Or we are creating a new dropdown list.
0442                          $cp->vars['lang_options'] = $exploded_options;
0443                      }
0444                      else if ($action == 'edit')
0445                      {
0446                          // Changing the number of options? (We remove and re-create the option fields)
0447                          $cp->vars['lang_options'] = $exploded_options;
0448                      }
0449                  }
0450                  else
0451                  {
0452                      $cp->vars['lang_options'] = $lang_options;
0453                  }
0454   
0455                  // step 2
0456                  foreach ($exclude[2] as $key)
0457                  {
0458                      $var = utf8_normalize_nfc(request_var($key, $field_row[$key], true));
0459   
0460                      // Manipulate the intended variables a little bit if needed
0461                      if ($field_type == FIELD_DROPDOWN && $key == 'field_maxlen')
0462                      {
0463                          // Get the number of options if this key is 'field_maxlen'
0464                          $var = sizeof(explode("\n", utf8_normalize_nfc(request_var('lang_options', '', true))));
0465                      }
0466                      else if ($field_type == FIELD_TEXT && $key == 'field_length')
0467                      {
0468                          if (isset($_REQUEST['rows']))
0469                          {
0470                              $cp->vars['rows'] = request_var('rows', 0);
0471                              $cp->vars['columns'] = request_var('columns', 0);
0472                              $var = $cp->vars['rows'] . '|' . $cp->vars['columns'];
0473                          }
0474                          else
0475                          {
0476                              $row_col = explode('|', $var);
0477                              $cp->vars['rows'] = $row_col[0];
0478                              $cp->vars['columns'] = $row_col[1];
0479                          }
0480                      }
0481                      else if ($field_type == FIELD_DATE && $key == 'field_default_value')
0482                      {
0483                          $always_now = request_var('always_now', -1);
0484                          
0485                          if ($always_now == 1 || ($always_now === -1 && $var == 'now'))
0486                          {
0487                              $now = getdate();
0488   
0489                              $cp->vars['field_default_value_day'] = $now['mday'];
0490                              $cp->vars['field_default_value_month'] = $now['mon'];
0491                              $cp->vars['field_default_value_year'] = $now['year'];
0492                              $var = $_POST['field_default_value'] = 'now';
0493                          }
0494                          else
0495                          {
0496                              if (isset($_REQUEST['field_default_value_day']))
0497                              {
0498                                  $cp->vars['field_default_value_day'] = request_var('field_default_value_day', 0);
0499                                  $cp->vars['field_default_value_month'] = request_var('field_default_value_month', 0);
0500                                  $cp->vars['field_default_value_year'] = request_var('field_default_value_year', 0);
0501                                  $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']);
0502                              }
0503                              else
0504                              {
0505                                  list($cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']) = explode('-', $var);
0506                              }
0507                          }    
0508                      }
0509                      /* else if ($field_type == FIELD_BOOL && $key == 'field_default_value')
0510                      {
0511                          // Get the number of options if this key is 'field_maxlen'
0512                          $var = request_var('field_default_value', 0);
0513                      }*/
0514   
0515                      $cp->vars[$key] = $var;
0516                  }
0517   
0518                  // step 3 - all arrays
0519                  if ($action == 'edit')
0520                  {
0521                      // Get language entries
0522                      $sql = 'SELECT *
0523                          FROM ' . PROFILE_FIELDS_LANG_TABLE . '
0524                          WHERE lang_id <> ' . $this->edit_lang_id . "
0525                              AND field_id = $field_id
0526                          ORDER BY option_id ASC";
0527                      $result = $db->sql_query($sql);
0528   
0529                      $l_lang_options = array();
0530                      while ($row = $db->sql_fetchrow($result))
0531                      {
0532                          $l_lang_options[$row['lang_id']][$row['option_id']] = $row['lang_value'];
0533                      }
0534                      $db->sql_freeresult($result);
0535   
0536          
0537                      $sql = 'SELECT lang_id, lang_name, lang_explain, lang_default_value
0538                          FROM ' . PROFILE_LANG_TABLE . '
0539                          WHERE lang_id <> ' . $this->edit_lang_id . "
0540                              AND field_id = $field_id
0541                          ORDER BY lang_id ASC";
0542                      $result = $db->sql_query($sql);
0543   
0544                      $l_lang_name = $l_lang_explain = $l_lang_default_value = array();
0545                      while ($row = $db->sql_fetchrow($result))
0546                      {
0547                          $l_lang_name[$row['lang_id']] = $row['lang_name'];
0548                          $l_lang_explain[$row['lang_id']] = $row['lang_explain'];
0549                          $l_lang_default_value[$row['lang_id']] = $row['lang_default_value'];
0550                      }
0551                      $db->sql_freeresult($result);
0552                  }
0553          
0554                  foreach ($exclude[3] as $key)
0555                  {
0556                      $cp->vars[$key] = utf8_normalize_nfc(request_var($key, array(0 => ''), true));
0557   
0558                      if (!$cp->vars[$key] && $action == 'edit')
0559                      {
0560                          $cp->vars[$key] = $$key;
0561                      }
0562                      else if ($key == 'l_lang_options' && $field_type == FIELD_BOOL)
0563                      {
0564                          $cp->vars[$key] = utf8_normalize_nfc(request_var($key, array(0 => array('')), true));
0565                      }
0566                      else if ($key == 'l_lang_options' && is_array($cp->vars[$key]))
0567                      {
0568                          foreach ($cp->vars[$key] as $lang_id => $options)
0569                          {
0570                              $cp->vars[$key][$lang_id] = explode("\n", $options);
0571                          }
0572                          
0573                      }
0574                  }
0575   
0576                  // Check for general issues in every step
0577                  if ($submit) //  && $step == 1
0578                  {
0579                      // Check values for step 1
0580                      if ($cp->vars['field_ident'] == '')
0581                      {
0582                          $error[] = $user->lang['EMPTY_FIELD_IDENT'];
0583                      }
0584   
0585                      if (!preg_match('/^[a-z_]+$/', $cp->vars['field_ident']))
0586                      {
0587                          $error[] = $user->lang['INVALID_CHARS_FIELD_IDENT'];
0588                      }
0589   
0590                      if (strlen($cp->vars['field_ident']) > 17)
0591                      {
0592                          $error[] = $user->lang['INVALID_FIELD_IDENT_LEN'];
0593                      }
0594   
0595                      if ($cp->vars['lang_name'] == '')
0596                      {
0597                          $error[] = $user->lang['EMPTY_USER_FIELD_NAME'];
0598                      }
0599   
0600                      if ($field_type == FIELD_DROPDOWN && !sizeof($cp->vars['lang_options']))
0601                      {
0602                          $error[] = $user->lang['NO_FIELD_ENTRIES'];
0603                      }
0604   
0605                      if ($field_type == FIELD_BOOL && (empty($cp->vars['lang_options'][0]) || empty($cp->vars['lang_options'][1])))
0606                      {
0607                          $error[] = $user->lang['NO_FIELD_ENTRIES'];
0608                      }
0609   
0610                      // Check for already existing field ident
0611                      if ($action != 'edit')
0612                      {
0613                          $sql = 'SELECT field_ident
0614                              FROM ' . PROFILE_FIELDS_TABLE . "
0615                              WHERE field_ident = '" . $db->sql_escape($cp->vars['field_ident']) . "'";
0616                          $result = $db->sql_query($sql);
0617                          $row = $db->sql_fetchrow($result);
0618                          $db->sql_freeresult($result);
0619   
0620                          if ($row)
0621                          {
0622                              $error[] = $user->lang['FIELD_IDENT_ALREADY_EXIST'];
0623                          }
0624                      }
0625                  }
0626   
0627                  $step = (isset($_REQUEST['next'])) ? $step + 1 : ((isset($_REQUEST['prev'])) ? $step - 1 : $step);
0628   
0629                  if (sizeof($error))
0630                  {
0631                      $step--;
0632                      $submit = false;
0633                  }
0634   
0635                  // Build up the specific hidden fields
0636                  foreach ($exclude as $num => $key_ary)
0637                  {
0638                      if ($num == $step)
0639                      {
0640                          continue;
0641                      }
0642   
0643                      $_new_key_ary = array();
0644   
0645                      foreach ($key_ary as $key)
0646                      {
0647                          if ($field_type == FIELD_TEXT && $key == 'field_length' && isset($_REQUEST['rows']))
0648                          {
0649                              $cp->vars['rows'] = request_var('rows', 0);
0650                              $cp->vars['columns'] = request_var('columns', 0);
0651                              $_new_key_ary[$key] = $cp->vars['rows'] . '|' . $cp->vars['columns'];
0652                          }
0653                          else if ($field_type == FIELD_DATE && $key == 'field_default_value')
0654                          {
0655                              $always_now = request_var('always_now', 0);
0656   
0657                              if ($always_now)
0658                              {
0659                                  $_new_key_ary[$key] = 'now';
0660                              }
0661                              else if (isset($_REQUEST['field_default_value_day']))
0662                              {
0663                                  $cp->vars['field_default_value_day'] = request_var('field_default_value_day', 0);
0664                                  $cp->vars['field_default_value_month'] = request_var('field_default_value_month', 0);
0665                                  $cp->vars['field_default_value_year'] = request_var('field_default_value_year', 0);
0666                                  $_new_key_ary[$key]  = sprintf('%2d-%2d-%4d', $cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']);
0667                              }
0668                          }
0669                          else if ($field_type == FIELD_BOOL && $key == 'l_lang_options' && isset($_REQUEST['l_lang_options']))
0670                          {
0671                              $_new_key_ary[$key] = utf8_normalize_nfc(request_var($key, array(array('')), true));
0672                          }
0673                          else
0674                          {
0675                              if (!isset($_REQUEST[$key]))
0676                              {
0677                                  $var = false;
0678                              }
0679                              else if ($key == 'field_ident' && isset($cp->vars[$key]))
0680                              {
0681                                  $_new_key_ary[$key]= $cp->vars[$key];
0682                              }
0683                              else
0684                              {
0685                                  $_new_key_ary[$key] = (is_array($_REQUEST[$key])) ? utf8_normalize_nfc(request_var($key, array(''), true)) : utf8_normalize_nfc(request_var($key, '', true));
0686                              }
0687                          }
0688                      }
0689   
0690                      $s_hidden_fields .= build_hidden_fields($_new_key_ary);
0691                  }
0692   
0693                  if (!sizeof($error))
0694                  {
0695                      if ($step == 3 && (sizeof($this->lang_defs['iso']) == 1 || $save))
0696                      {
0697                          $this->save_profile_field($cp, $field_type, $action);
0698                      }
0699                      else if ($action == 'edit' && $save)
0700                      {
0701                          $this->save_profile_field($cp, $field_type, $action);
0702                      }
0703                  }
0704   
0705                  $template->assign_vars(array(
0706                      'S_EDIT'            => true,
0707                      'S_EDIT_MODE'        => ($action == 'edit') ? true : false,
0708                      'ERROR_MSG'            => (sizeof($error)) ? implode('<br />', $error) : '',
0709   
0710                      'L_TITLE'            => $user->lang['STEP_' . $step . '_TITLE_' . strtoupper($action)],
0711                      'L_EXPLAIN'            => $user->lang['STEP_' . $step . '_EXPLAIN_' . strtoupper($action)],
0712                      
0713                      'U_ACTION'            => $this->u_action . "&amp;action=$action&amp;step=$step",
0714                      'U_BACK'            => $this->u_action)
0715                  );
0716   
0717                  // Now go through the steps
0718                  switch ($step)
0719                  {
0720                      // Create basic options - only small differences between field types
0721                      case 1:
0722      
0723                          // Build common create options
0724                          $template->assign_vars(array(
0725                              'S_STEP_ONE'        => true,
0726                              'S_FIELD_REQUIRED'    => ($cp->vars['field_required']) ? true : false,
0727                              'S_SHOW_ON_REG'        => ($cp->vars['field_show_on_reg']) ? true : false,
0728                              'S_FIELD_HIDE'        => ($cp->vars['field_hide']) ? true : false,
0729                              'S_FIELD_NO_VIEW'    => ($cp->vars['field_no_view']) ? true : false,
0730   
0731                              'L_LANG_SPECIFIC'    => sprintf($user->lang['LANG_SPECIFIC_OPTIONS'], $config['default_lang']),
0732                              'FIELD_TYPE'        => $user->lang['FIELD_' . strtoupper($cp->profile_types[$field_type])],
0733                              'FIELD_IDENT'        => $cp->vars['field_ident'],
0734                              'LANG_NAME'            => $cp->vars['lang_name'],
0735                              'LANG_EXPLAIN'        => $cp->vars['lang_explain'])
0736                          );
0737   
0738                          // String and Text needs to set default values here...
0739                          if ($field_type == FIELD_STRING || $field_type == FIELD_TEXT)
0740                          {
0741                              $template->assign_vars(array(
0742                                  'S_TEXT'        => ($field_type == FIELD_TEXT) ? true : false,
0743                                  'S_STRING'        => ($field_type == FIELD_STRING) ? true : false,
0744   
0745                                  'L_DEFAULT_VALUE_EXPLAIN'    => $user->lang[strtoupper($cp->profile_types[$field_type]) . '_DEFAULT_VALUE_EXPLAIN'],
0746                                  'LANG_DEFAULT_VALUE'        => $cp->vars['lang_default_value'])
0747                              );
0748                          }
0749              
0750                          if ($field_type == FIELD_BOOL || $field_type == FIELD_DROPDOWN)
0751                          {
0752                              // Initialize these array elements if we are creating a new field
0753                              if (!sizeof($cp->vars['lang_options']))
0754                              {
0755                                  if ($field_type == FIELD_BOOL)
0756                                  {
0757                                      // No options have been defined for a boolean field.
0758                                      $cp->vars['lang_options'][0] = '';
0759                                      $cp->vars['lang_options'][1] = '';
0760                                  }
0761                                  else
0762                                  {
0763                                      // No options have been defined for the dropdown menu
0764                                      $cp->vars['lang_options'] = array();
0765                                  }
0766                              }
0767   
0768                              $template->assign_vars(array(
0769                                  'S_BOOL'        => ($field_type == FIELD_BOOL) ? true : false,
0770                                  'S_DROPDOWN'    => ($field_type == FIELD_DROPDOWN) ? true : false,
0771   
0772                                  'L_LANG_OPTIONS_EXPLAIN'    => $user->lang[strtoupper($cp->profile_types[$field_type]) . '_ENTRIES_EXPLAIN'],
0773                                  'LANG_OPTIONS'                => ($field_type == FIELD_DROPDOWN) ? implode("\n", $cp->vars['lang_options']) : '',
0774                                  'FIRST_LANG_OPTION'            => ($field_type == FIELD_BOOL) ? $cp->vars['lang_options'][0] : '',
0775                                  'SECOND_LANG_OPTION'        => ($field_type == FIELD_BOOL) ? $cp->vars['lang_options'][1] : '')
0776                              );
0777                          }
0778                      
0779                      break;
0780   
0781                      case 2:
0782                          
0783                          $template->assign_vars(array(
0784                              'S_STEP_TWO'        => true,
0785                              'L_NEXT_STEP'            => (sizeof($this->lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS'])
0786                          );
0787   
0788                          // Build options based on profile type
0789                          $function = 'get_' . $cp->profile_types[$field_type] . '_options';
0790                          $options = $cp->$function();
0791   
0792                          foreach ($options as $num => $option_ary)
0793                          {
0794                              $template->assign_block_vars('option', $option_ary);
0795                          }
0796   
0797                      break;
0798   
0799                      // Define remaining language variables
0800                      case 3:
0801   
0802                          $template->assign_var('S_STEP_THREE', true);
0803                          $options = $this->build_language_options($cp, $field_type, $action);
0804   
0805                          foreach ($options as $lang_id => $lang_ary)
0806                          {
0807                              $template->assign_block_vars('options', array(
0808                                  'LANGUAGE'        => sprintf($user->lang[(($lang_id == $this->edit_lang_id) ? 'DEFAULT_' : '') . 'ISO_LANGUAGE'], $lang_ary['lang_iso']))
0809                              );
0810   
0811                              foreach ($lang_ary['fields'] as $field_ident => $field_ary)
0812                              {
0813                                  $template->assign_block_vars('options.field', array(
0814                                      'L_TITLE'        => $field_ary['TITLE'],
0815                                      'L_EXPLAIN'        => (isset($field_ary['EXPLAIN'])) ? $field_ary['EXPLAIN'] : '',
0816                                      'FIELD'            => $field_ary['FIELD'])
0817                                  );
0818                              }
0819                          }
0820          
0821                      break;
0822                  }
0823   
0824                  $template->assign_vars(array(
0825                      'S_HIDDEN_FIELDS'    => $s_hidden_fields)
0826                  );
0827   
0828                  return;
0829   
0830              break;
0831          }
0832          
0833          $sql = 'SELECT *
0834              FROM ' . PROFILE_FIELDS_TABLE . '
0835              ORDER BY field_order';
0836          $result = $db->sql_query($sql);
0837   
0838          $s_one_need_edit = false;
0839          while ($row = $db->sql_fetchrow($result))
0840          {
0841              $active_lang = (!$row['field_active']) ? 'ACTIVATE' : 'DEACTIVATE';
0842              $active_value = (!$row['field_active']) ? 'activate' : 'deactivate';
0843              $id = $row['field_id'];
0844   
0845              $s_need_edit = (sizeof($this->lang_defs['diff'][$row['field_id']])) ? true : false;
0846   
0847              if ($s_need_edit)
0848              {
0849                  $s_one_need_edit = true;
0850              }
0851   
0852              $template->assign_block_vars('fields', array(
0853                  'FIELD_IDENT'        => $row['field_ident'],
0854                  'FIELD_TYPE'        => $user->lang['FIELD_' . strtoupper($cp->profile_types[$row['field_type']])],
0855   
0856                  'L_ACTIVATE_DEACTIVATE'        => $user->lang[$active_lang],
0857                  'U_ACTIVATE_DEACTIVATE'        => $this->u_action . "&amp;action=$active_value&amp;field_id=$id",
0858                  'U_EDIT'                    => $this->u_action . "&amp;action=edit&amp;field_id=$id",
0859                  'U_TRANSLATE'                => $this->u_action . "&amp;action=edit&amp;field_id=$id&amp;step=3",
0860                  'U_DELETE'                    => $this->u_action . "&amp;action=delete&amp;field_id=$id",
0861                  'U_MOVE_UP'                    => $this->u_action . "&amp;action=move_up&amp;order={$row['field_order']}",
0862                  'U_MOVE_DOWN'                => $this->u_action . "&amp;action=move_down&amp;order={$row['field_order']}",
0863   
0864                  'S_NEED_EDIT'                => $s_need_edit)
0865              );
0866          }
0867          $db->sql_freeresult($result);
0868   
0869          // At least one option field needs editing?
0870          if ($s_one_need_edit)
0871          {
0872              $template->assign_var('S_NEED_EDIT', true);
0873          }
0874   
0875          $s_select_type = '';
0876          foreach ($cp->profile_types as $key => $value)
0877          {
0878              $s_select_type .= '<option value="' . $key . '">' . $user->lang['FIELD_' . strtoupper($value)] . '</option>';
0879          }
0880   
0881          $template->assign_vars(array(
0882              'U_ACTION'            => $this->u_action,
0883              'S_TYPE_OPTIONS'    => $s_select_type)
0884          );
0885      }
0886   
0887      /**
0888      * Build all Language specific options
0889      */
0890      function build_language_options(&$cp, $field_type, $action = 'create')
0891      {
0892          global $user, $config, $db;
0893   
0894          $default_lang_id = (!empty($this->edit_lang_id)) ? $this->edit_lang_id : $this->lang_defs['iso'][$config['default_lang']];
0895   
0896          $sql = 'SELECT lang_id, lang_iso
0897              FROM ' . LANG_TABLE . '
0898              WHERE lang_id <> ' . (int) $default_lang_id . '
0899              ORDER BY lang_english_name';
0900          $result = $db->sql_query($sql);
0901   
0902          $languages = array();
0903          while ($row = $db->sql_fetchrow($result))
0904          {
0905              $languages[$row['lang_id']] = $row['lang_iso'];
0906          }
0907          $db->sql_freeresult($result);
0908          
0909          $options = array();
0910          $options['lang_name'] = 'string';
0911          if ($cp->vars['lang_explain'])
0912          {
0913              $options['lang_explain'] = 'text';
0914          }
0915      
0916          switch ($field_type)
0917          {
0918              case FIELD_BOOL:
0919                  $options['lang_options'] = 'two_options';
0920              break;
0921   
0922              case FIELD_DROPDOWN:
0923                  $options['lang_options'] = 'optionfield';
0924              break;
0925              
0926              case FIELD_TEXT:
0927              case FIELD_STRING:
0928                  if ($cp->vars['lang_default_value'])
0929                  {
0930                      $options['lang_default_value'] = ($field_type == FIELD_STRING) ? 'string' : 'text';
0931                  }
0932              break;
0933          }
0934      
0935          $lang_options = array();
0936   
0937          foreach ($options as $field => $field_type)
0938          {
0939              $lang_options[1]['lang_iso'] = $this->lang_defs['id'][$default_lang_id];
0940              $lang_options[1]['fields'][$field] = array(
0941                  'TITLE'        => $user->lang['CP_' . strtoupper($field)],
0942                  'FIELD'        => '<dd>' . ((is_array($cp->vars[$field])) ? implode('<br />', $cp->vars[$field]) : bbcode_nl2br($cp->vars[$field])) . '</dd>'
0943              );
0944   
0945              if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
0946              {
0947                  $lang_options[1]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
0948              }
0949          }
0950   
0951          foreach ($languages as $lang_id => $lang_iso)
0952          {
0953              $lang_options[$lang_id]['lang_iso'] = $lang_iso;
0954              foreach ($options as $field => $field_type)
0955              {
0956                  $value = ($action == 'create') ? utf8_normalize_nfc(request_var('l_' . $field, array(0 => ''), true)) : $cp->vars['l_' . $field];
0957                  if ($field == 'lang_options')
0958                  {
0959                      $var = (!isset($cp->vars['l_lang_options'][$lang_id]) || !is_array($cp->vars['l_lang_options'][$lang_id])) ? $cp->vars['lang_options'] : $cp->vars['l_lang_options'][$lang_id];
0960                      
0961                      switch ($field_type)
0962                      {
0963                          case 'two_options':
0964   
0965                              $lang_options[$lang_id]['fields'][$field] = array(
0966                                  'TITLE'        => $user->lang['CP_' . strtoupper($field)],
0967                                  'FIELD'        => '
0968                                              <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>
0969                                              <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>'
0970                              );
0971                          break;
0972   
0973                          case 'optionfield':
0974                              $value = ((isset($value[$lang_id])) ? ((is_array($value[$lang_id])) ?  implode("\n", $value[$lang_id]) : $value[$lang_id]) : implode("\n", $var));
0975                              $lang_options[$lang_id]['fields'][$field] = array(
0976                                  'TITLE'        => $user->lang['CP_' . strtoupper($field)],
0977                                  'FIELD'        => '<dd><textarea name="l_' . $field . '[' . $lang_id . ']" rows="7" cols="80">' . $value . '</textarea></dd>'
0978                              );
0979                          break;
0980                      }
0981                  
0982                      if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
0983                      {
0984                          $lang_options[$lang_id]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
0985                      }
0986                  }
0987                  else
0988                  {
0989                      $var = ($action == 'create' || !is_array($cp->vars[$field])) ? $cp->vars[$field] : $cp->vars[$field][$lang_id];
0990   
0991                      $lang_options[$lang_id]['fields'][$field] = array(
0992                          'TITLE'        => $user->lang['CP_' . strtoupper($field)],
0993                          '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>'
0994                      );
0995              
0996                      if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
0997                      {
0998                          $lang_options[$lang_id]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
0999                      }
1000                  }
1001              }
1002          }
1003   
1004          return $lang_options;
1005      }
1006   
1007      /**
1008      * Save Profile Field
1009      */
1010      function save_profile_field(&$cp, $field_type, $action = 'create')
1011      {
1012          global $db, $config, $user;
1013   
1014          $field_id = request_var('field_id', 0);
1015   
1016          // Collect all information, if something is going wrong, abort the operation
1017          $profile_sql = $profile_lang = $empty_lang = $profile_lang_fields = array();
1018   
1019          $default_lang_id = (!empty($this->edit_lang_id)) ? $this->edit_lang_id : $this->lang_defs['iso'][$config['default_lang']];
1020   
1021          if ($action == 'create')
1022          {
1023              $sql = 'SELECT MAX(field_order) as max_field_order
1024                  FROM ' . PROFILE_FIELDS_TABLE;
1025              $result = $db->sql_query($sql);
1026              $new_field_order = (int) $db->sql_fetchfield('max_field_order');
1027              $db->sql_freeresult($result);
1028   
1029              $field_ident = $cp->vars['field_ident'];
1030          }
1031   
1032          // Save the field
1033          $profile_fields = array(
1034              'field_length'            => $cp->vars['field_length'],
1035              'field_minlen'            => $cp->vars['field_minlen'],
1036              'field_maxlen'            => $cp->vars['field_maxlen'],
1037              'field_novalue'            => $cp->vars['field_novalue'],
1038              'field_default_value'    => $cp->vars['field_default_value'],
1039              'field_validation'        => $cp->vars['field_validation'],
1040              'field_required'        => $cp->vars['field_required'],
1041              'field_show_on_reg'        => $cp->vars['field_show_on_reg'],
1042              'field_hide'            => $cp->vars['field_hide'],
1043              'field_no_view'            => $cp->vars['field_no_view']
1044          );
1045   
1046          if ($action == 'create')
1047          {
1048              $profile_fields += array(
1049                  'field_type'        => $field_type,
1050                  'field_ident'        => $field_ident,
1051                  'field_name'        => $field_ident,
1052                  'field_order'        => $new_field_order + 1,
1053                  'field_active'        => 1
1054              );
1055   
1056              $sql = 'INSERT INTO ' . PROFILE_FIELDS_TABLE . ' ' . $db->sql_build_array('INSERT', $profile_fields);
1057              $db->sql_query($sql);
1058   
1059              $field_id = $db->sql_nextid();
1060          }
1061          else
1062          {
1063              $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . '
1064                  SET ' . $db->sql_build_array('UPDATE', $profile_fields) . "
1065                  WHERE field_id = $field_id";
1066              $db->sql_query($sql);
1067          }
1068          
1069          if ($action == 'create')
1070          {
1071              $field_ident = 'pf_' . $field_ident;
1072              $profile_sql[] = $this->add_field_ident($field_ident, $field_type);
1073          }
1074   
1075          $sql_ary = array(
1076              'lang_name'                => $cp->vars['lang_name'],
1077              'lang_explain'            => $cp->vars['lang_explain'],
1078              'lang_default_value'    => $cp->vars['lang_default_value']
1079          );
1080   
1081          if ($action == 'create')
1082          {
1083              $sql_ary['field_id'] = $field_id;
1084              $sql_ary['lang_id'] = $default_lang_id;
1085          
1086              $profile_sql[] = 'INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
1087          }
1088          else
1089          {
1090              $this->update_insert(PROFILE_LANG_TABLE, $sql_ary, array('field_id' => $field_id, 'lang_id' => $default_lang_id));
1091          }
1092   
1093          if (is_array($cp->vars['l_lang_name']) && sizeof($cp->vars['l_lang_name']))
1094          {
1095              foreach ($cp->vars['l_lang_name'] as $lang_id => $data)
1096              {
1097                  if (($cp->vars['lang_name'] != '' && $cp->vars['l_lang_name'][$lang_id] == '')
1098                      || ($cp->vars['lang_explain'] != '' && $cp->vars['l_lang_explain'][$lang_id] == '')
1099                      || ($cp->vars['lang_default_value'] != '' && $cp->vars['l_lang_default_value'][$lang_id] == ''))
1100                  {
1101                      $empty_lang[$lang_id] = true;
1102                      break;
1103                  }
1104   
1105                  if (!isset($empty_lang[$lang_id]))
1106                  {
1107                      $profile_lang[] = array(
1108                          'field_id'        => $field_id,
1109                          'lang_id'        => $lang_id,
1110                          'lang_name'        => $cp->vars['l_lang_name'][$lang_id],
1111                          'lang_explain'    => (isset($cp->vars['l_lang_explain'][$lang_id])) ? $cp->vars['l_lang_explain'][$lang_id] : '',
1112                          'lang_default_value'    => (isset($cp->vars['l_lang_default_value'][$lang_id])) ? $cp->vars['l_lang_default_value'][$lang_id] : ''
1113                      );
1114                  }
1115              }
1116   
1117              foreach ($empty_lang as $lang_id => $NULL)
1118              {
1119                  $sql = 'DELETE FROM ' . PROFILE_LANG_TABLE . "
1120                      WHERE field_id = $field_id
1121                      AND lang_id = " . (int) $lang_id;
1122                  $db->sql_query($sql);
1123              }
1124          }
1125   
1126          // These are always arrays because the key is the language id...
1127          $cp->vars['l_lang_name']            = utf8_normalize_nfc(request_var('l_lang_name', array(0 => ''), true));
1128          $cp->vars['l_lang_explain']            = utf8_normalize_nfc(request_var('l_lang_explain', array(0 => ''), true));
1129          $cp->vars['l_lang_default_value']    = utf8_normalize_nfc(request_var('l_lang_default_value', array(0 => ''), true));
1130   
1131          if ($field_type != FIELD_BOOL)
1132          {
1133              $cp->vars['l_lang_options']            = utf8_normalize_nfc(request_var('l_lang_options', array(0 => ''), true));
1134          }
1135          else
1136          {
1137              /**
1138              * @todo check if this line is correct...
1139              $cp->vars['l_lang_default_value']    = request_var('l_lang_default_value', array(0 => array('')), true);
1140              */
1141              $cp->vars['l_lang_options']    = utf8_normalize_nfc(request_var('l_lang_options', array(0 => array('')), true));
1142          }
1143   
1144          if ($cp->vars['lang_options'])
1145          {
1146              if (!is_array($cp->vars['lang_options']))
1147              {
1148                  $cp->vars['lang_options'] = explode("\n", $cp->vars['lang_options']);
1149              }
1150   
1151              if ($action != 'create')
1152              {
1153                  $sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . "
1154                      WHERE field_id = $field_id
1155                          AND lang_id = " . (int) $default_lang_id;
1156                  $db->sql_query($sql);
1157              }
1158              
1159              foreach ($cp->vars['lang_options'] as $option_id => $value)
1160              {
1161                  $sql_ary = array(
1162                      'field_type'    => (int) $field_type,
1163                      'lang_value'    => $value
1164                  );
1165   
1166                  if ($action == 'create')
1167                  {
1168                      $sql_ary['field_id'] = $field_id;
1169                      $sql_ary['lang_id'] = $default_lang_id;
1170                      $sql_ary['option_id'] = (int) $option_id;
1171   
1172                      $profile_sql[] = 'INSERT INTO ' . PROFILE_FIELDS_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
1173                  }
1174                  else
1175                  {
1176                      $this->update_insert(PROFILE_FIELDS_LANG_TABLE, $sql_ary, array(
1177                          'field_id'    => $field_id,
1178                          'lang_id'    => (int) $default_lang_id,
1179                          'option_id'    => (int) $option_id)
1180                      );
1181                  }
1182              }
1183          }
1184   
1185          if (is_array($cp->vars['l_lang_options']) && sizeof($cp->vars['l_lang_options']))
1186          {
1187              $empty_lang = array();
1188   
1189              foreach ($cp->vars['l_lang_options'] as $lang_id => $lang_ary)
1190              {
1191                  if (!is_array($lang_ary))
1192                  {
1193                      $lang_ary = explode("\n", $lang_ary);
1194                  }
1195   
1196                  if (sizeof($lang_ary) != sizeof($cp->vars['lang_options']))
1197                  {
1198                      $empty_lang[$lang_id] = true;
1199                  }
1200   
1201                  if (!isset($empty_lang[$lang_id]))
1202                  {
1203                      if ($action != 'create')
1204                      {
1205                          $sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . "
1206                              WHERE field_id = $field_id
1207                              AND lang_id = " . (int) $lang_id;
1208                          $db->sql_query($sql);
1209                      }
1210   
1211                      foreach ($lang_ary as $option_id => $value)
1212                      {
1213                          $profile_lang_fields[] = array(
1214                              'field_id'        => (int) $field_id,
1215                              'lang_id'        => (int) $lang_id,
1216                              'option_id'        => (int) $option_id,
1217                              'field_type'    => (int) $field_type,
1218                              'lang_value'    => $value
1219                          );
1220                      }
1221                  }
1222              }
1223   
1224              foreach ($empty_lang as $lang_id => $NULL)
1225              {
1226                  $sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . "
1227                      WHERE field_id = $field_id
1228                      AND lang_id = " . (int) $lang_id;
1229                  $db->sql_query($sql);
1230              }
1231          }
1232   
1233          foreach ($profile_lang as $sql)
1234          {
1235              if ($action == 'create')
1236              {
1237                  $profile_sql[] = 'INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql);
1238              }
1239              else
1240              {
1241                  $lang_id = $sql['lang_id'];
1242                  unset($sql['lang_id'], $sql['field_id']);
1243   
1244                  $this->update_insert(PROFILE_LANG_TABLE, $sql, array('lang_id' => (int) $lang_id, 'field_id' => $field_id));
1245              }
1246          }
1247   
1248          if (sizeof($profile_lang_fields))
1249          {
1250              foreach ($profile_lang_fields as $sql)
1251              {
1252                  if ($action == 'create')
1253                  {
1254                      $profile_sql[] = 'INSERT INTO ' . PROFILE_FIELDS_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql);
1255                  }
1256                  else
1257                  {
1258                      $lang_id = $sql['lang_id'];
1259                      $option_id = $sql['option_id'];
1260                      unset($sql['lang_id'], $sql['field_id'], $sql['option_id']);
1261                      
1262                      $this->update_insert(PROFILE_FIELDS_LANG_TABLE, $sql, array(
1263                          'lang_id'    => $lang_id,
1264                          'field_id'    => $field_id,
1265                          'option_id'    => $option_id)
1266                      );
1267                  }
1268              }
1269          }
1270   
1271   
1272          $db->sql_transaction('begin');
1273   
1274          if ($action == 'create')
1275          {
1276              foreach ($profile_sql as $sql)
1277              {
1278                  $db->sql_query($sql);
1279              }
1280          }
1281          
1282          $db->sql_transaction('commit');
1283   
1284          if ($action == 'edit')
1285          {
1286              add_log('admin', 'LOG_PROFILE_FIELD_EDIT', $cp->vars['field_ident'] . ':' . $cp->vars['lang_name']);
1287              trigger_error($user->lang['CHANGED_PROFILE_FIELD'] . adm_back_link($this->u_action));
1288          }
1289          else
1290          {
1291              add_log('admin', 'LOG_PROFILE_FIELD_CREATE', substr($field_ident, 3) . ':' . $cp->vars['lang_name']);
1292              trigger_error($user->lang['ADDED_PROFILE_FIELD'] . adm_back_link($this->u_action));
1293          }
1294      }
1295   
1296      /**
1297      * Update, then insert if not successfull
1298      */
1299      function update_insert($table, $sql_ary, $where_fields)
1300      {
1301          global $db;
1302   
1303          $where_sql = array();
1304          $check_key = '';
1305   
1306          foreach ($where_fields as $key => $value)
1307          {
1308              $check_key = (!$check_key) ? $key : $check_key;
1309              $where_sql[] = $key . ' = ' . ((is_string($value)) ? "'" . $db->sql_escape($value) . "'" : (int) $value);
1310          }
1311   
1312          if (!sizeof($where_sql))
1313          {
1314              return;
1315          }
1316   
1317          $sql = "SELECT $check_key
1318              FROM $table
1319              WHERE " . implode(' AND ', $where_sql);
1320          $result = $db->sql_query($sql);
1321          $row = $db->sql_fetchrow($result);
1322          $db->sql_freeresult($result);
1323   
1324          if (!$row)
1325          {
1326              $sql_ary = array_merge($where_fields, $sql_ary);
1327              
1328              if (sizeof($sql_ary))
1329              {
1330                  $db->sql_query("INSERT INTO $table " . $db->sql_build_array('INSERT', $sql_ary));
1331              }
1332          }
1333          else
1334          {
1335              if (sizeof($sql_ary))
1336              {
1337                  $sql = "UPDATE $table SET " . $db->sql_build_array('UPDATE', $sql_ary) . '
1338                      WHERE ' . implode(' AND ', $where_sql);
1339                  $db->sql_query($sql);
1340              }
1341          }
1342      }
1343   
1344      /**
1345      * Return sql statement for adding a new field ident (profile field) to the profile fields data table
1346      */
1347      function add_field_ident($field_ident, $field_type)
1348      {
1349          global $db;
1350   
1351          switch ($db->sql_layer)
1352          {
1353              case 'mysql':
1354              case 'mysql4':
1355              case 'mysqli':
1356   
1357                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1358                  $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD `$field_ident";
1359   
1360                  switch ($field_type)
1361                  {
1362                      case FIELD_STRING:
1363                          $sql .= ' VARCHAR(255) ';
1364                      break;
1365   
1366                      case FIELD_DATE:
1367                          $sql .= 'VARCHAR(10) ';
1368                      break;
1369   
1370                      case FIELD_TEXT:
1371                          $sql .= "TEXT";
1372          //                        ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
1373          //                        ADD {$field_ident}_bbcode_bitfield INT(11) UNSIGNED";
1374                      break;
1375   
1376                      case FIELD_BOOL:
1377                          $sql .= 'TINYINT(2) ';
1378                      break;
1379                  
1380                      case FIELD_DROPDOWN:
1381                          $sql .= 'MEDIUMINT(8) ';
1382                      break;
1383   
1384                      case FIELD_INT:
1385                          $sql .= 'BIGINT(20) ';
1386                      break;
1387                  }
1388   
1389              break;
1390   
1391              case 'sqlite':
1392   
1393                  switch ($field_type)
1394                  {
1395                      case FIELD_STRING:
1396                          $type = ' VARCHAR(255) ';
1397                      break;
1398   
1399                      case FIELD_DATE:
1400                          $type = 'VARCHAR(10) ';
1401                      break;
1402   
1403                      case FIELD_TEXT:
1404                          $type = "TEXT(65535)";
1405          //                        ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
1406          //                        ADD {$field_ident}_bbcode_bitfield INT(11) UNSIGNED";
1407                      break;
1408   
1409                      case FIELD_BOOL:
1410                          $type = 'TINYINT(2) ';
1411                      break;
1412   
1413                      case FIELD_DROPDOWN:
1414                          $type = 'MEDIUMINT(8) ';
1415                      break;
1416   
1417                      case FIELD_INT:
1418                          $type = 'BIGINT(20) ';
1419                      break;
1420                  }
1421   
1422                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1423                  if (version_compare(sqlite_libversion(), '3.0') == -1)
1424                  {
1425                      $sql = "SELECT sql
1426                          FROM sqlite_master
1427                          WHERE type = 'table'
1428                              AND name = '" . PROFILE_FIELDS_DATA_TABLE . "'
1429                          ORDER BY type DESC, name;";
1430                      $result = $db->sql_query($sql);
1431                      $row = $db->sql_fetchrow($result);
1432                      $db->sql_freeresult($result);
1433   
1434                      // Create a temp table and populate it, destroy the existing one
1435                      $db->sql_query(preg_replace('#CREATE\s+TABLE\s+"?' . PROFILE_FIELDS_DATA_TABLE . '"?#i', 'CREATE TEMPORARY TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp', $row['sql']));
1436                      $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . '_temp SELECT * FROM ' . PROFILE_FIELDS_DATA_TABLE);
1437                      $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE);
1438   
1439                      preg_match('#\((.*)\)#s', $row['sql'], $matches);
1440   
1441                      $new_table_cols = trim($matches[1]);
1442                      $old_table_cols = explode(',', $new_table_cols);
1443                      $column_list = array();
1444   
1445                      foreach ($old_table_cols as $declaration)
1446                      {
1447                          $entities = preg_split('#\s+#', trim($declaration));
1448                          if ($entities[0] == 'PRIMARY')
1449                          {
1450                              continue;
1451                          }
1452                          $column_list[] = $entities[0];
1453                      }
1454   
1455                      $columns = implode(',', $column_list);
1456   
1457                      $new_table_cols = $field_ident . ' ' . $type . ',' . $new_table_cols;
1458   
1459                      // create a new table and fill it up. destroy the temp one
1460                      $db->sql_query('CREATE TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $new_table_cols . ');');
1461                      $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . PROFILE_FIELDS_DATA_TABLE . '_temp;');
1462                      $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp');
1463                  }
1464                  else
1465                  {
1466                      $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident [$type]";
1467                  }
1468   
1469              break;
1470   
1471              case 'mssql':
1472              case 'mssql_odbc':
1473   
1474                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1475                  $sql = 'ALTER TABLE [' . PROFILE_FIELDS_DATA_TABLE . "] ADD [$field_ident";
1476   
1477                  switch ($field_type)
1478                  {
1479                      case FIELD_STRING:
1480                          $sql .= ' [VARCHAR] (255) ';
1481                      break;
1482   
1483                      case FIELD_DATE:
1484                          $sql .= '[VARCHAR] (10) ';
1485                      break;
1486   
1487                      case FIELD_TEXT:
1488                          $sql .= "[TEXT]";
1489          //                        ADD {$field_ident}_bbcode_uid [VARCHAR] (5) NOT NULL,
1490          //                        ADD {$field_ident}_bbcode_bitfield [INT] UNSIGNED";
1491                      break;
1492   
1493                      case FIELD_BOOL:
1494                      case FIELD_DROPDOWN:
1495                          $sql .= '[INT] ';
1496                      break;
1497   
1498                      case FIELD_INT:
1499                          $sql .= '[FLOAT] ';
1500                      break;
1501                  }
1502   
1503              break;
1504   
1505              case 'postgres':
1506   
1507                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1508                  $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD COLUMN \"$field_ident\" ";
1509   
1510                  switch ($field_type)
1511                  {
1512                      case FIELD_STRING:
1513                          $sql .= ' VARCHAR(255) ';
1514                      break;
1515   
1516                      case FIELD_DATE:
1517                          $sql .= 'VARCHAR(10) ';
1518                      break;
1519   
1520                      case FIELD_TEXT:
1521                          $sql .= "TEXT";
1522          //                        ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
1523          //                        ADD {$field_ident}_bbcode_bitfield INT4 UNSIGNED";
1524                      break;
1525   
1526                      case FIELD_BOOL:
1527                          $sql .= 'INT2 ';
1528                      break;
1529   
1530                      case FIELD_DROPDOWN:
1531                          $sql .= 'INT4 ';
1532                      break;
1533   
1534                      case FIELD_INT:
1535                          $sql .= 'INT8 ';
1536                      break;
1537                  }
1538   
1539              break;
1540   
1541              case 'firebird':
1542   
1543                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1544                  $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD \"$field_ident\" ";
1545   
1546                  switch ($field_type)
1547                  {
1548                      case FIELD_STRING:
1549                          $sql .= ' VARCHAR(255) ';
1550                      break;
1551   
1552                      case FIELD_DATE:
1553                          $sql .= 'VARCHAR(10) ';
1554                      break;
1555   
1556                      case FIELD_TEXT:
1557                          $sql .= "BLOB SUB_TYPE TEXT";
1558          //                        ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
1559          //                        ADD {$field_ident}_bbcode_bitfield INTEGER UNSIGNED";
1560                      break;
1561   
1562                      case FIELD_BOOL:
1563                      case FIELD_DROPDOWN:
1564                          $sql .= 'INTEGER ';
1565                      break;
1566   
1567                      case FIELD_INT:
1568                          $sql .= 'DOUBLE PRECISION ';
1569                      break;
1570                  }
1571   
1572              break;
1573   
1574              case 'oracle':
1575   
1576                  // We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
1577                  $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident ";
1578   
1579                  switch ($field_type)
1580                  {
1581                      case FIELD_STRING:
1582                          $sql .= ' VARCHAR2(255) ';
1583                      break;
1584   
1585                      case FIELD_DATE:
1586                          $sql .= 'VARCHAR2(10) ';
1587                      break;
1588   
1589                      case FIELD_TEXT:
1590                          $sql .= "CLOB";
1591          //                        ADD {$field_ident}_bbcode_uid VARCHAR2(5) NOT NULL,
1592          //                        ADD {$field_ident}_bbcode_bitfield NUMBER(11) UNSIGNED";
1593                      break;
1594   
1595                      case FIELD_BOOL:
1596                          $sql .= 'NUMBER(2) ';
1597                      break;
1598   
1599                      case FIELD_DROPDOWN:
1600                          $sql .= 'NUMBER(8) ';
1601                      break;
1602   
1603                      case FIELD_INT:
1604                          $sql .= 'NUMBER(20) ';
1605                      break;
1606                  }
1607   
1608              break;
1609          }
1610   
1611          return $sql;
1612      }
1613  }
1614   
1615  ?>