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

functions_profile_fields.php

Zuletzt modifiziert: 09.10.2024, 12:50 - Dateigröße: 31.88 KiB


0001  <?php
0002  /**
0003  *
0004  * @package phpBB3
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  * Custom Profile Fields
0021  * @package phpBB3
0022  */
0023  class custom_profile
0024  {
0025      var $profile_types = array(FIELD_INT => 'int', FIELD_STRING => 'string', FIELD_TEXT => 'text', FIELD_BOOL => 'bool', FIELD_DROPDOWN => 'dropdown', FIELD_DATE => 'date');
0026      var $profile_cache = array();
0027      var $options_lang = array();
0028   
0029      /**
0030      * Assign editable fields to template, mode can be profile (for profile change) or register (for registration)
0031      * Called by ucp_profile and ucp_register
0032      * @access public
0033      */
0034      function generate_profile_fields($mode, $lang_id)
0035      {
0036          global $db, $template, $auth;
0037   
0038          $sql_where = '';
0039          switch ($mode)
0040          {
0041              case 'register':
0042                  // If the field is required we show it on the registration page and do not show hidden fields
0043                  $sql_where .= ' AND (f.field_show_on_reg = 1 OR f.field_required = 1) AND f.field_hide = 0';
0044              break;
0045   
0046              case 'profile':
0047                  // Show hidden fields to moderators/admins
0048                  if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
0049                  {
0050                      $sql_where .= ' AND f.field_hide = 0';
0051                  }
0052              break;
0053   
0054              default:
0055                  trigger_error('Wrong profile mode specified', E_USER_ERROR);
0056              break;
0057          }
0058   
0059          $sql = 'SELECT l.*, f.*
0060              FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . " f
0061              WHERE f.field_active = 1
0062                  $sql_where
0063                  AND l.lang_id = $lang_id
0064                  AND l.field_id = f.field_id
0065              ORDER BY f.field_order";
0066          $result = $db->sql_query($sql);
0067   
0068          while ($row = $db->sql_fetchrow($result))
0069          {
0070              // Return templated field
0071              $tpl_snippet = $this->process_field_row('change', $row);
0072   
0073              // Some types are multivalue, we can't give them a field_id as we would not know which to pick
0074              $type = (int) $row['field_type'];
0075   
0076              $template->assign_block_vars('profile_fields', array(
0077                  'LANG_NAME'        => $row['lang_name'],
0078                  'LANG_EXPLAIN'    => $row['lang_explain'],
0079                  'FIELD'            => $tpl_snippet,
0080                  'FIELD_ID'        => ($type == FIELD_DATE || ($type == FIELD_BOOL && $row['field_length'] == '1')) ? '' : 'pf_' . $row['field_ident'],
0081                  'S_REQUIRED'    => ($row['field_required']) ? true : false)
0082              );
0083          }
0084          $db->sql_freeresult($result);
0085      }
0086   
0087      /**
0088      * Validate entered profile field data
0089      * @access public
0090      */
0091      function validate_profile_field($field_type, &$field_value, $field_data)
0092      {
0093          switch ($field_type)
0094          {
0095              case FIELD_INT:
0096              case FIELD_DROPDOWN:
0097                  $field_value = (int) $field_value;
0098              break;
0099   
0100              case FIELD_BOOL:
0101                  $field_value = (bool) $field_value;
0102              break;
0103          }
0104   
0105          switch ($field_type)
0106          {
0107              case FIELD_DATE:
0108                  $field_validate = explode('-', $field_value);
0109                  
0110                  $day = (isset($field_validate[0])) ? (int) $field_validate[0] : 0;
0111                  $month = (isset($field_validate[1])) ? (int) $field_validate[1] : 0;
0112                  $year = (isset($field_validate[2])) ? (int) $field_validate[2] : 0;
0113   
0114                  if ((!$day || !$month || !$year) && !$field_data['field_required'])
0115                  {
0116                      return false;
0117                  }
0118   
0119                  if ((!$day || !$month || !$year) && $field_data['field_required'])
0120                  {
0121                      return 'FIELD_REQUIRED';
0122                  }
0123   
0124                  if ($day < 0 || $day > 31 || $month < 0 || $month > 12 || ($year < 1901 && $year > 0) || $year > gmdate('Y', time()) + 50)
0125                  {
0126                      return 'FIELD_INVALID_DATE';
0127                  }
0128   
0129                  if (checkdate($month, $day, $year) === false)
0130                  {
0131                      return 'FIELD_INVALID_DATE';
0132                  }
0133              break;
0134   
0135              case FIELD_BOOL:
0136                  if (!$field_value && $field_data['field_required'])
0137                  {
0138                      return 'FIELD_REQUIRED';
0139                  }
0140              break;
0141   
0142              case FIELD_INT:
0143                  if (empty($field_value) && !$field_data['field_required'])
0144                  {
0145                      return false;
0146                  }
0147   
0148                  if ($field_value < $field_data['field_minlen'])
0149                  {
0150                      return 'FIELD_TOO_SMALL';
0151                  }
0152                  else if ($field_value > $field_data['field_maxlen'])
0153                  {
0154                      return 'FIELD_TOO_LARGE';
0155                  }
0156              break;
0157          
0158              case FIELD_DROPDOWN:
0159                  if ($field_value == $field_data['field_novalue'] && $field_data['field_required'])
0160                  {
0161                      return 'FIELD_REQUIRED';
0162                  }
0163              break;
0164              
0165              case FIELD_STRING:
0166              case FIELD_TEXT:
0167                  if (empty($field_value) && !$field_data['field_required'])
0168                  {
0169                      return false;
0170                  }
0171                  else if (empty($field_value) && $field_data['field_required'])
0172                  {
0173                      return 'FIELD_REQUIRED';
0174                  }
0175   
0176                  if ($field_data['field_minlen'] && utf8_strlen($field_value) < $field_data['field_minlen'])
0177                  {
0178                      return 'FIELD_TOO_SHORT';
0179                  }
0180                  else if ($field_data['field_maxlen'] && utf8_strlen($field_value) > $field_data['field_maxlen'])
0181                  {
0182                      return 'FIELD_TOO_LONG';
0183                  }
0184   
0185                  if (!empty($field_data['field_validation']) && $field_data['field_validation'] != '.*')
0186                  {
0187                      $field_validate = ($field_type == FIELD_STRING) ? $field_value : bbcode_nl2br($field_value);
0188                      if (!preg_match('#^' . str_replace('\\\\', '\\', $field_data['field_validation']) . '$#i', $field_validate))
0189                      {
0190                          return 'FIELD_INVALID_CHARS';
0191                      }
0192                  }
0193              break;
0194          }
0195   
0196          return false;
0197      }
0198   
0199      /**
0200      * Build profile cache, used for display
0201      * @access private
0202      */
0203      function build_cache()
0204      {
0205          global $db, $user, $auth;
0206   
0207          $this->profile_cache = array();
0208          
0209          // Display hidden/no_view fields for admin/moderator
0210          $sql = 'SELECT l.*, f.*
0211              FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f
0212              WHERE l.lang_id = ' . $user->get_iso_lang_id() . '
0213                  AND f.field_active = 1 ' .
0214                  ((!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_')) ? '    AND f.field_hide = 0 ' : '') . '
0215                  AND f.field_no_view = 0
0216                  AND l.field_id = f.field_id
0217              ORDER BY f.field_order';
0218          $result = $db->sql_query($sql);
0219   
0220          while ($row = $db->sql_fetchrow($result))
0221          {
0222              $this->profile_cache[$row['field_ident']] = $row;
0223          }
0224          $db->sql_freeresult($result);
0225      }
0226   
0227      /**
0228      * Get language entries for options and store them here for later use
0229      */
0230      function get_option_lang($field_id, $lang_id, $field_type, $preview)
0231      {
0232          global $db;
0233   
0234          if ($preview)
0235          {
0236              $lang_options = (!is_array($this->vars['lang_options'])) ? explode("\n", $this->vars['lang_options']) : $this->vars['lang_options'];
0237              
0238              foreach ($lang_options as $num => $var)
0239              {
0240                  $this->options_lang[$field_id][$lang_id][($num + 1)] = $var;
0241              }
0242          }
0243          else
0244          {
0245              $sql = 'SELECT option_id, lang_value
0246                  FROM ' . PROFILE_FIELDS_LANG_TABLE . "
0247                      WHERE field_id = $field_id
0248                      AND lang_id = $lang_id
0249                      AND field_type = $field_type
0250                  ORDER BY option_id";
0251              $result = $db->sql_query($sql);
0252   
0253              while ($row = $db->sql_fetchrow($result))
0254              {
0255                  $this->options_lang[$field_id][$lang_id][($row['option_id'] + 1)] = $row['lang_value'];
0256              }
0257              $db->sql_freeresult($result);
0258          }
0259      }
0260   
0261      /**
0262      * Submit profile field
0263      * @access public
0264      */
0265      function submit_cp_field($mode, $lang_id, &$cp_data, &$cp_error)
0266      {
0267          global $auth, $db, $user;
0268   
0269          $sql_where = '';
0270          switch ($mode)
0271          {
0272              case 'register':
0273                  // If the field is required we show it on the registration page and do not show hidden fields
0274                  $sql_where .= ' AND (f.field_show_on_reg = 1 OR f.field_required = 1) AND f.field_hide = 0';
0275              break;
0276   
0277              case 'profile':
0278                  // Show hidden fields to moderators/admins
0279                  if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
0280                  {
0281                      $sql_where .= ' AND f.field_hide = 0';
0282                  }
0283              break;
0284   
0285              default:
0286                  trigger_error('Wrong profile mode specified', E_USER_ERROR);
0287              break;
0288          }
0289   
0290          $sql = 'SELECT l.*, f.*
0291              FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . " f
0292              WHERE l.lang_id = $lang_id
0293                  AND f.field_active = 1
0294                  $sql_where
0295                  AND l.field_id = f.field_id
0296              ORDER BY f.field_order";
0297          $result = $db->sql_query($sql);
0298   
0299          while ($row = $db->sql_fetchrow($result))
0300          {
0301              $cp_data['pf_' . $row['field_ident']] = $this->get_profile_field($row);
0302              $check_value = $cp_data['pf_' . $row['field_ident']];
0303   
0304              if (($cp_result = $this->validate_profile_field($row['field_type'], $check_value, $row)) !== false)
0305              {
0306                  // If not and only showing common error messages, use this one
0307                  $error = '';
0308                  switch ($cp_result)
0309                  {
0310                      case 'FIELD_INVALID_DATE':
0311                      case 'FIELD_REQUIRED':
0312                          $error = sprintf($user->lang[$cp_result], $row['lang_name']);
0313                      break;
0314   
0315                      case 'FIELD_TOO_SHORT':
0316                      case 'FIELD_TOO_SMALL':
0317                          $error = sprintf($user->lang[$cp_result], $row['lang_name'], $row['field_minlen']);
0318                      break;
0319                      
0320                      case 'FIELD_TOO_LONG':
0321                      case 'FIELD_TOO_LARGE':
0322                          $error = sprintf($user->lang[$cp_result], $row['lang_name'], $row['field_maxlen']);
0323                      break;
0324                      
0325                      case 'FIELD_INVALID_CHARS':
0326                          switch ($row['field_validation'])
0327                          {
0328                              case '[0-9]+':
0329                                  $error = sprintf($user->lang[$cp_result . '_NUMBERS_ONLY'], $row['lang_name']);
0330                              break;
0331   
0332                              case '[\w]+':
0333                                  $error = sprintf($user->lang[$cp_result . '_ALPHA_ONLY'], $row['lang_name']);
0334                              break;
0335   
0336                              case '[\w_\+\. \-\[\]]+':
0337                                  $error = sprintf($user->lang[$cp_result . '_SPACERS_ONLY'], $row['lang_name']);
0338                              break;
0339                          }
0340                      break;
0341                  }
0342                  
0343                  if ($error != '')
0344                  {
0345                      $cp_error[] = $error;
0346                  }
0347              }
0348          }
0349          $db->sql_freeresult($result);
0350      }
0351   
0352      /**
0353      * Assign fields to template, used for viewprofile, viewtopic and memberlist (if load setting is enabled)
0354      * This is directly connected to the user -> mode == grab is to grab the user specific fields, mode == show is for assigning the row to the template
0355      * @access public
0356      */
0357      function generate_profile_fields_template($mode, $user_id = 0, $profile_row = false)
0358      {
0359          global $db;
0360   
0361          if ($mode == 'grab')
0362          {
0363              if (!is_array($user_id))
0364              {
0365                  $user_id = array($user_id);
0366              }
0367   
0368              if (!sizeof($this->profile_cache))
0369              {
0370                  $this->build_cache();
0371              }
0372   
0373              if (!sizeof($user_id))
0374              {
0375                  return array();
0376              }
0377   
0378              $sql = 'SELECT *
0379                  FROM ' . PROFILE_FIELDS_DATA_TABLE . '
0380                  WHERE ' . $db->sql_in_set('user_id', array_map('intval', $user_id));
0381              $result = $db->sql_query($sql);
0382   
0383              $field_data = array();
0384              while ($row = $db->sql_fetchrow($result))
0385              {
0386                  $field_data[$row['user_id']] = $row;
0387              }
0388              $db->sql_freeresult($result);
0389   
0390              $user_fields = array();
0391   
0392              // Go through the fields in correct order
0393              foreach (array_keys($this->profile_cache) as $used_ident)
0394              {
0395                  foreach ($field_data as $user_id => $row)
0396                  {
0397                      $user_fields[$user_id][$used_ident]['value'] = $row['pf_' . $used_ident];
0398                      $user_fields[$user_id][$used_ident]['data'] = $this->profile_cache[$used_ident];
0399                  }
0400              }
0401   
0402              return $user_fields;
0403          }
0404          else if ($mode == 'show')
0405          {
0406              // $profile_row == $user_fields[$row['user_id']];
0407              $tpl_fields = array();
0408              $tpl_fields['row'] = $tpl_fields['blockrow'] = array();
0409   
0410              foreach ($profile_row as $ident => $ident_ary)
0411              {
0412                  $value = $this->get_profile_value($ident_ary);
0413   
0414                  if ($value === NULL)
0415                  {
0416                      continue;
0417                  }
0418   
0419                  $tpl_fields['row'] += array(
0420                      'PROFILE_' . strtoupper($ident) . '_VALUE'    => $value,
0421                      'PROFILE_' . strtoupper($ident) . '_TYPE'    => $ident_ary['data']['field_type'],
0422                      'PROFILE_' . strtoupper($ident) . '_NAME'    => $ident_ary['data']['lang_name'],
0423                      'PROFILE_' . strtoupper($ident) . '_EXPLAIN'=> $ident_ary['data']['lang_explain'],
0424   
0425                      'S_PROFILE_' . strtoupper($ident)            => true
0426                  );
0427   
0428                  $tpl_fields['blockrow'][] = array(
0429                      'PROFILE_FIELD_VALUE'    => $value,
0430                      'PROFILE_FIELD_TYPE'    => $ident_ary['data']['field_type'],
0431                      'PROFILE_FIELD_NAME'    => $ident_ary['data']['lang_name'],
0432                      'PROFILE_FIELD_EXPLAIN'    => $ident_ary['data']['lang_explain'],
0433   
0434                      'S_PROFILE_' . strtoupper($ident)        => true
0435                  );
0436              }
0437          
0438              return $tpl_fields;
0439          }
0440          else
0441          {
0442              trigger_error('Wrong mode for custom profile', E_USER_ERROR);
0443          }
0444      }
0445   
0446      /**
0447      * Get Profile Value for display
0448      */
0449      function get_profile_value($ident_ary)
0450      {
0451          $value = $ident_ary['value'];
0452          $field_type = $ident_ary['data']['field_type'];
0453   
0454          switch ($this->profile_types[$field_type])
0455          {
0456              case 'int':
0457                  if ($value == '')
0458                  {
0459                      return NULL;
0460                  }
0461                  return (int) $value;
0462              break;
0463   
0464              case 'string':
0465              case 'text':
0466                  if (!$value)
0467                  {
0468                      return NULL;
0469                  }
0470   
0471                  $value = make_clickable($value);
0472                  $value = censor_text($value);
0473                  $value = bbcode_nl2br($value);
0474                  return $value;
0475              break;
0476   
0477              // case 'datetime':
0478              case 'date':
0479                  $date = explode('-', $value);
0480                  $day = (isset($date[0])) ? (int) $date[0] : 0;
0481                  $month = (isset($date[1])) ? (int) $date[1] : 0;
0482                  $year = (isset($date[2])) ? (int) $date[2] : 0;
0483   
0484                  if (!$day && !$month && !$year)
0485                  {
0486                      return NULL;
0487                  }
0488                  else if ($day && $month && $year)
0489                  {
0490                      global $user;
0491                      return $user->format_date(mktime(0, 0, 0, $month, $day, $year), $user->lang['DATE_FORMAT'], true);
0492                  }
0493   
0494                  return $value;
0495              break;
0496   
0497              case 'dropdown':
0498                  $field_id = $ident_ary['data']['field_id'];
0499                  $lang_id = $ident_ary['data']['lang_id'];
0500                  if (!isset($this->options_lang[$field_id][$lang_id]))
0501                  {
0502                      $this->get_option_lang($field_id, $lang_id, FIELD_DROPDOWN, false);
0503                  }
0504   
0505                  if ($value == $ident_ary['data']['field_novalue'])
0506                  {
0507                      return NULL;
0508                  }
0509   
0510                  $value = (int) $value;
0511   
0512                  // User not having a value assigned
0513                  if (!isset($this->options_lang[$field_id][$lang_id][$value]))
0514                  {
0515                      return NULL;
0516                  }
0517   
0518                  return $this->options_lang[$field_id][$lang_id][$value];
0519              break;
0520   
0521              case 'bool':
0522                  $field_id = $ident_ary['data']['field_id'];
0523                  $lang_id = $ident_ary['data']['lang_id'];
0524                  if (!isset($this->options_lang[$field_id][$lang_id]))
0525                  {
0526                      $this->get_option_lang($field_id, $lang_id, FIELD_BOOL, false);
0527                  }
0528   
0529                  if ($ident_ary['data']['field_length'] == 1)
0530                  {
0531                      return (isset($this->options_lang[$field_id][$lang_id][(int) $value])) ? $this->options_lang[$field_id][$lang_id][(int) $value] : NULL;
0532                  }
0533                  else if (!$value)
0534                  {
0535                      return NULL;
0536                  }
0537                  else
0538                  {
0539                      return $this->options_lang[$field_id][$lang_id][(int) ($value) + 1];
0540                  }
0541              break;
0542   
0543              default:
0544                  trigger_error('Unknown profile type', E_USER_ERROR);
0545              break;
0546          }
0547      }
0548   
0549      /**
0550      * Get field value for registration/profile
0551      * @access private
0552      */
0553      function get_var($field_validation, &$profile_row, $default_value, $preview)
0554      {
0555          global $user;
0556   
0557          $profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
0558          $user_ident = $profile_row['field_ident'];
0559          // checkbox - only testing for isset
0560          if ($profile_row['field_type'] == FIELD_BOOL && $profile_row['field_length'] == 2)
0561          {
0562              $value = (isset($_REQUEST[$profile_row['field_ident']])) ? true : ((!isset($user->profile_fields[$user_ident]) || $preview) ? $default_value : $user->profile_fields[$user_ident]);
0563          }
0564          else if ($profile_row['field_type'] == FIELD_INT)
0565          {
0566              if (isset($_REQUEST[$profile_row['field_ident']]))
0567              {
0568                  $value = ($_REQUEST[$profile_row['field_ident']] === '') ? NULL : request_var($profile_row['field_ident'], $default_value);
0569              }
0570              else
0571              {
0572                  if (!$preview && isset($user->profile_fields[$user_ident]) && is_null($user->profile_fields[$user_ident]))
0573                  {
0574                      $value = NULL;
0575                  }
0576                  else if (!isset($user->profile_fields[$user_ident]) || $preview)
0577                  {
0578                      $value = $default_value;
0579                  }
0580                  else
0581                  {
0582                      $value = $user->profile_fields[$user_ident];
0583                  }
0584              }
0585   
0586              return (is_null($value)) ? '' : (int) $value;
0587          }
0588          else
0589          {
0590              $value = (isset($_REQUEST[$profile_row['field_ident']])) ? request_var($profile_row['field_ident'], $default_value, true) : ((!isset($user->profile_fields[$user_ident]) || $preview) ? $default_value : $user->profile_fields[$user_ident]);
0591              
0592              if (gettype($value) == 'string')
0593              {
0594                  $value = utf8_normalize_nfc($value);
0595              }
0596          }
0597   
0598          switch ($field_validation)
0599          {
0600              case 'int':
0601                  return (int) $value;
0602              break;
0603          }
0604   
0605          return $value;
0606      }
0607   
0608      /**
0609      * Process int-type
0610      * @access private
0611      */
0612      function generate_int($profile_row, $preview = false)
0613      {
0614          global $template;
0615   
0616          $profile_row['field_value'] = $this->get_var('int', $profile_row, $profile_row['field_default_value'], $preview);
0617          $template->assign_block_vars($this->profile_types[$profile_row['field_type']], array_change_key_case($profile_row, CASE_UPPER));
0618      }
0619   
0620      /**
0621      * Process date-type
0622      * @access private
0623      */
0624      function generate_date($profile_row, $preview = false)
0625      {
0626          global $user, $template;
0627   
0628          $profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
0629          $user_ident = $profile_row['field_ident'];
0630   
0631          $now = getdate();
0632   
0633          if (!isset($_REQUEST[$profile_row['field_ident'] . '_day']))
0634          {
0635              if ($profile_row['field_default_value'] == 'now')
0636              {
0637                  $profile_row['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']);
0638              }
0639              list($day, $month, $year) = explode('-', ((!isset($user->profile_fields[$user_ident]) || $preview) ? $profile_row['field_default_value'] : $user->profile_fields[$user_ident]));
0640          }
0641          else
0642          {
0643              if ($preview && $profile_row['field_default_value'] == 'now')
0644              {
0645                  $profile_row['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']);
0646                  list($day, $month, $year) = explode('-', ((!isset($user->profile_fields[$user_ident]) || $preview) ? $profile_row['field_default_value'] : $user->profile_fields[$user_ident]));
0647              }
0648              else
0649              {
0650                  $day = request_var($profile_row['field_ident'] . '_day', 0);
0651                  $month = request_var($profile_row['field_ident'] . '_month', 0);
0652                  $year = request_var($profile_row['field_ident'] . '_year', 0);
0653              }
0654          }
0655   
0656          $profile_row['s_day_options'] = '<option value="0"' . ((!$day) ? ' selected="selected"' : '') . '>--</option>';
0657          for ($i = 1; $i < 32; $i++)
0658          {
0659              $profile_row['s_day_options'] .= '<option value="' . $i . '"' . (($i == $day) ? ' selected="selected"' : '') . ">$i</option>";
0660          }
0661   
0662          $profile_row['s_month_options'] = '<option value="0"' . ((!$month) ? ' selected="selected"' : '') . '>--</option>';
0663          for ($i = 1; $i < 13; $i++)
0664          {
0665              $profile_row['s_month_options'] .= '<option value="' . $i . '"' . (($i == $month) ? ' selected="selected"' : '') . ">$i</option>";
0666          }
0667   
0668          $profile_row['s_year_options'] = '<option value="0"' . ((!$year) ? ' selected="selected"' : '') . '>--</option>';
0669          for ($i = $now['year'] - 100; $i <= $now['year']; $i++)
0670          {
0671              $profile_row['s_year_options'] .= '<option value="' . $i . '"' . (($i == $year) ? ' selected="selected"' : '') . ">$i</option>";
0672          }
0673          unset($now);
0674          
0675          $profile_row['field_value'] = 0;
0676          $template->assign_block_vars($this->profile_types[$profile_row['field_type']], array_change_key_case($profile_row, CASE_UPPER));
0677      }
0678   
0679      /**
0680      * Process bool-type
0681      * @access private
0682      */
0683      function generate_bool($profile_row, $preview = false)
0684      {
0685          global $template;
0686   
0687          $value = $this->get_var('int', $profile_row, $profile_row['field_default_value'], $preview);
0688   
0689          $profile_row['field_value'] = $value;
0690          $template->assign_block_vars($this->profile_types[$profile_row['field_type']], array_change_key_case($profile_row, CASE_UPPER));
0691   
0692          if ($profile_row['field_length'] == 1)
0693          {
0694              if (!isset($this->options_lang[$profile_row['field_id']][$profile_row['lang_id']]) || !sizeof($this->options_lang[$profile_row['field_id']][$profile_row['lang_id']]))
0695              {
0696                  $this->get_option_lang($profile_row['field_id'], $profile_row['lang_id'], FIELD_BOOL, $preview);
0697              }
0698   
0699              foreach ($this->options_lang[$profile_row['field_id']][$profile_row['lang_id']] as $option_id => $option_value)
0700              {
0701                  $template->assign_block_vars('bool.options', array(
0702                      'OPTION_ID'    => $option_id,
0703                      'CHECKED'    => ($value == $option_id) ? ' checked="checked"' : '',
0704                      'VALUE'        => $option_value)
0705                  );
0706              }
0707          }
0708      }
0709   
0710      /**
0711      * Process string-type
0712      * @access private
0713      */
0714      function generate_string($profile_row, $preview = false)
0715      {
0716          global $template;
0717   
0718          $profile_row['field_value'] = $this->get_var('string', $profile_row, $profile_row['lang_default_value'], $preview);
0719          $template->assign_block_vars($this->profile_types[$profile_row['field_type']], array_change_key_case($profile_row, CASE_UPPER));
0720      }
0721   
0722      /**
0723      * Process text-type
0724      * @access private
0725      */
0726      function generate_text($profile_row, $preview = false)
0727      {
0728          global $template;
0729          global $user, $phpEx, $phpbb_root_path;
0730   
0731          $field_length = explode('|', $profile_row['field_length']);
0732          $profile_row['field_rows'] = $field_length[0];
0733          $profile_row['field_cols'] = $field_length[1];
0734   
0735          $profile_row['field_value'] = $this->get_var('string', $profile_row, $profile_row['lang_default_value'], $preview);
0736          $template->assign_block_vars($this->profile_types[$profile_row['field_type']], array_change_key_case($profile_row, CASE_UPPER));
0737      }
0738   
0739      /**
0740      * Process dropdown-type
0741      * @access private
0742      */
0743      function generate_dropdown($profile_row, $preview = false)
0744      {
0745          global $user, $template;
0746   
0747          $value = $this->get_var('int', $profile_row, $profile_row['field_default_value'], $preview);
0748   
0749          if (!isset($this->options_lang[$profile_row['field_id']]) || !isset($this->options_lang[$profile_row['field_id']][$profile_row['lang_id']]) || !sizeof($this->options_lang[$profile_row['field_id']][$profile_row['lang_id']]))
0750          {
0751              $this->get_option_lang($profile_row['field_id'], $profile_row['lang_id'], FIELD_DROPDOWN, $preview);
0752          }
0753   
0754          $profile_row['field_value'] = $value;
0755          $template->assign_block_vars($this->profile_types[$profile_row['field_type']], array_change_key_case($profile_row, CASE_UPPER));
0756   
0757          foreach ($this->options_lang[$profile_row['field_id']][$profile_row['lang_id']] as $option_id => $option_value)
0758          {
0759              $template->assign_block_vars('dropdown.options', array(
0760                  'OPTION_ID'    => $option_id,
0761                  'SELECTED'    => ($value == $option_id) ? ' selected="selected"' : '',
0762                  'VALUE'        => $option_value)
0763              );
0764          }
0765      }
0766   
0767      /**
0768      * Return Templated value/field. Possible values for $mode are:
0769      * change == user is able to set/enter profile values; preview == just show the value
0770      * @access private
0771      */
0772      function process_field_row($mode, $profile_row)
0773      {
0774          global $template;
0775   
0776          $preview = ($mode == 'preview') ? true : false;
0777   
0778          // set template filename
0779          $template->set_filenames(array(
0780              'cp_body'        => 'custom_profile_fields.html')
0781          );
0782   
0783          // empty previously filled blockvars
0784          foreach ($this->profile_types as $field_case => $field_type)
0785          {
0786              $template->destroy_block_vars($field_type);
0787          }
0788   
0789          // Assign template variables
0790          $type_func = 'generate_' . $this->profile_types[$profile_row['field_type']];
0791          $this->$type_func($profile_row, $preview);
0792   
0793          // Return templated data
0794          return $template->assign_display('cp_body');
0795      }
0796   
0797      /**
0798      * Build Array for user insertion into custom profile fields table
0799      */
0800      function build_insert_sql_array($cp_data)
0801      {
0802          global $db, $user, $auth;
0803   
0804          $sql_not_in = array();
0805          foreach ($cp_data as $key => $null)
0806          {
0807              $sql_not_in[] = (strncmp($key, 'pf_', 3) === 0) ? substr($key, 3) : $key;
0808          }
0809   
0810          $sql = 'SELECT f.field_type, f.field_ident, f.field_default_value, l.lang_default_value
0811              FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f
0812              WHERE l.lang_id = ' . $user->get_iso_lang_id() . '
0813                  ' . ((sizeof($sql_not_in)) ? ' AND ' . $db->sql_in_set('f.field_ident', $sql_not_in, true) : '') . '
0814                  AND l.field_id = f.field_id';
0815          $result = $db->sql_query($sql);
0816   
0817          while ($row = $db->sql_fetchrow($result))
0818          {
0819              if ($row['field_default_value'] == 'now' && $row['field_type'] == FIELD_DATE)
0820              {
0821                  $now = getdate();
0822                  $row['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']);
0823              }
0824   
0825              $cp_data['pf_' . $row['field_ident']] = (in_array($row['field_type'], array(FIELD_TEXT, FIELD_STRING))) ? $row['lang_default_value'] : $row['field_default_value'];
0826          }
0827          $db->sql_freeresult($result);
0828          
0829          return $cp_data;
0830      }
0831   
0832      /**
0833      * Get profile field value on submit
0834      * @access private
0835      */
0836      function get_profile_field($profile_row)
0837      {
0838          global $phpbb_root_path, $phpEx;
0839          global $config;
0840          
0841          $var_name = 'pf_' . $profile_row['field_ident'];
0842          
0843          switch ($profile_row['field_type'])
0844          {
0845              case FIELD_DATE:
0846   
0847                  if (!isset($_REQUEST[$var_name . '_day']))
0848                  {
0849                      if ($profile_row['field_default_value'] == 'now')
0850                      {
0851                          $now = getdate();
0852                          $profile_row['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']);
0853                      }
0854                      list($day, $month, $year) = explode('-', $profile_row['field_default_value']);
0855                  }
0856                  else
0857                  {
0858                      $day = request_var($var_name . '_day', 0);
0859                      $month = request_var($var_name . '_month', 0);
0860                      $year = request_var($var_name . '_year', 0);
0861                  }
0862                  
0863                  $var = sprintf('%2d-%2d-%4d', $day, $month, $year);
0864              break;
0865   
0866              case FIELD_BOOL:
0867                  // Checkbox
0868                  if ($profile_row['field_length'] == 2)
0869                  {
0870                      $var = (isset($_REQUEST[$var_name])) ? 1 : 0;
0871                  }
0872                  else
0873                  {
0874                      $var = request_var($var_name, $profile_row['field_default_value']);
0875                  }
0876              break;
0877   
0878              case FIELD_STRING:
0879              case FIELD_TEXT:
0880                  $var = utf8_normalize_nfc(request_var($var_name, $profile_row['field_default_value'], true));
0881              break;
0882   
0883              case FIELD_INT:
0884                  if (isset($_REQUEST[$var_name]) && $_REQUEST[$var_name] === '')
0885                  {
0886                      $var = NULL;
0887                  }
0888                  else
0889                  {
0890                      $var = request_var($var_name, $profile_row['field_default_value']);
0891                  }
0892              break;
0893   
0894              default:
0895                  $var = request_var($var_name, $profile_row['field_default_value']);
0896              break;
0897          }
0898   
0899          return $var;
0900      }
0901  }
0902   
0903  /**
0904  * Custom Profile Fields ACP
0905  * @package phpBB3
0906  */
0907  class custom_profile_admin extends custom_profile
0908  {
0909      var $vars = array();
0910   
0911      /**
0912      * Return possible validation options
0913      */
0914      function validate_options()
0915      {
0916          global $user;
0917   
0918          $validate_ary = array('CHARS_ANY' => '.*', 'NUMBERS_ONLY' => '[0-9]+', 'ALPHA_ONLY' => '[\w]+', 'ALPHA_SPACERS' => '[\w_\+\. \-\[\]]+');
0919   
0920          $validate_options = '';
0921          foreach ($validate_ary as $lang => $value)
0922          {
0923              $selected = ($this->vars['field_validation'] == $value) ? ' selected="selected"' : '';
0924              $validate_options .= '<option value="' . $value . '"' . $selected . '>' . $user->lang[$lang] . '</option>';
0925          }
0926   
0927          return $validate_options;
0928      }
0929      
0930      /**
0931      * Get string options for second step in ACP
0932      */
0933      function get_string_options()
0934      {
0935          global $user;
0936   
0937          $options = array(
0938              0 => array('TITLE' => $user->lang['FIELD_LENGTH'],        'FIELD' => '<input type="text" name="field_length" size="5" value="' . $this->vars['field_length'] . '" />'),
0939              1 => array('TITLE' => $user->lang['MIN_FIELD_CHARS'],    'FIELD' => '<input type="text" name="field_minlen" size="5" value="' . $this->vars['field_minlen'] . '" />'),
0940              2 => array('TITLE' => $user->lang['MAX_FIELD_CHARS'],    'FIELD' => '<input type="text" name="field_maxlen" size="5" value="' . $this->vars['field_maxlen'] . '" />'),
0941              3 => array('TITLE' => $user->lang['FIELD_VALIDATION'],    'FIELD' => '<select name="field_validation">' . $this->validate_options() . '</select>')
0942          );
0943   
0944          return $options;
0945      }
0946   
0947      /**
0948      * Get text options for second step in ACP
0949      */
0950      function get_text_options()
0951      {
0952          global $user;
0953   
0954          $options = array(
0955              0 => array('TITLE' => $user->lang['FIELD_LENGTH'],        'FIELD' => '<input name="rows" size="5" value="' . $this->vars['rows'] . '" /> ' . $user->lang['ROWS'] . '</dd><dd><input name="columns" size="5" value="' . $this->vars['columns'] . '" /> ' . $user->lang['COLUMNS'] . ' <input type="hidden" name="field_length" value="' . $this->vars['field_length'] . '" />'),
0956              1 => array('TITLE' => $user->lang['MIN_FIELD_CHARS'],    'FIELD' => '<input type="text" name="field_minlen" size="10" value="' . $this->vars['field_minlen'] . '" />'),
0957              2 => array('TITLE' => $user->lang['MAX_FIELD_CHARS'],    'FIELD' => '<input type="text" name="field_maxlen" size="10" value="' . $this->vars['field_maxlen'] . '" />'),
0958              3 => array('TITLE' => $user->lang['FIELD_VALIDATION'],    'FIELD' => '<select name="field_validation">' . $this->validate_options() . '</select>')
0959          );
0960   
0961          return $options;
0962      }
0963   
0964      /**
0965      * Get int options for second step in ACP
0966      */
0967      function get_int_options()
0968      {
0969          global $user;
0970   
0971          $options = array(
0972              0 => array('TITLE' => $user->lang['FIELD_LENGTH'],        'FIELD' => '<input type="text" name="field_length" size="5" value="' . $this->vars['field_length'] . '" />'),
0973              1 => array('TITLE' => $user->lang['MIN_FIELD_NUMBER'],    'FIELD' => '<input type="text" name="field_minlen" size="5" value="' . $this->vars['field_minlen'] . '" />'),
0974              2 => array('TITLE' => $user->lang['MAX_FIELD_NUMBER'],    'FIELD' => '<input type="text" name="field_maxlen" size="5" value="' . $this->vars['field_maxlen'] . '" />'),
0975              3 => array('TITLE' => $user->lang['DEFAULT_VALUE'],        'FIELD' => '<input type="post" name="field_default_value" value="' . $this->vars['field_default_value'] . '" />')
0976          );
0977   
0978          return $options;
0979      }
0980   
0981      /**
0982      * Get bool options for second step in ACP
0983      */
0984      function get_bool_options()
0985      {
0986          global $user, $config, $lang_defs;
0987   
0988          $default_lang_id = $lang_defs['iso'][$config['default_lang']];
0989   
0990          $profile_row = array(
0991              'var_name'                => 'field_default_value',
0992              'field_id'                => 1,
0993              'lang_name'                => $this->vars['lang_name'],
0994              'lang_explain'            => $this->vars['lang_explain'],
0995              'lang_id'                => $default_lang_id,
0996              'field_default_value'    => $this->vars['field_default_value'],
0997              'field_ident'            => 'field_default_value',
0998              'field_type'            => FIELD_BOOL,
0999              'field_length'            => $this->vars['field_length'],
1000              'lang_options'            => $this->vars['lang_options']
1001          );
1002   
1003          $options = array(
1004              0 => array('TITLE' => $user->lang['FIELD_TYPE'], 'EXPLAIN' => $user->lang['BOOL_TYPE_EXPLAIN'], 'FIELD' => '<label><input type="radio" class="radio" name="field_length" value="1"' . (($this->vars['field_length'] == 1) ? ' checked="checked"' : '') . ' onchange="document.getElementById(\'add_profile_field\').submit();" /> ' . $user->lang['RADIO_BUTTONS'] . '</label><label><input type="radio" class="radio" name="field_length" value="2"' . (($this->vars['field_length'] == 2) ? ' checked="checked"' : '') . ' onchange="document.getElementById(\'add_profile_field\').submit();" /> ' . $user->lang['CHECKBOX'] . '</label>'),
1005              1 => array('TITLE' => $user->lang['DEFAULT_VALUE'], 'FIELD' => $this->process_field_row('preview', $profile_row))
1006          );
1007   
1008          return $options;
1009      }
1010   
1011      /**
1012      * Get dropdown options for second step in ACP
1013      */
1014      function get_dropdown_options()
1015      {
1016          global $user, $config, $lang_defs;
1017   
1018          $default_lang_id = $lang_defs['iso'][$config['default_lang']];
1019   
1020          $profile_row[0] = array(
1021              'var_name'                => 'field_default_value',
1022              'field_id'                => 1,
1023              'lang_name'                => $this->vars['lang_name'],
1024              'lang_explain'            => $this->vars['lang_explain'],
1025              'lang_id'                => $default_lang_id,
1026              'field_default_value'    => $this->vars['field_default_value'],
1027              'field_ident'            => 'field_default_value',
1028              'field_type'            => FIELD_DROPDOWN,
1029              'lang_options'            => $this->vars['lang_options']
1030          );
1031   
1032          $profile_row[1] = $profile_row[0];
1033          $profile_row[1]['var_name'] = 'field_novalue';
1034          $profile_row[1]['field_ident'] = 'field_novalue';
1035          $profile_row[1]['field_default_value']    = $this->vars['field_novalue'];
1036   
1037          $options = array(
1038              0 => array('TITLE' => $user->lang['DEFAULT_VALUE'], 'FIELD' => $this->process_field_row('preview', $profile_row[0])),
1039              1 => array('TITLE' => $user->lang['NO_VALUE_OPTION'], 'EXPLAIN' => $user->lang['NO_VALUE_OPTION_EXPLAIN'], 'FIELD' => $this->process_field_row('preview', $profile_row[1]))
1040          );
1041   
1042          return $options;
1043      }
1044   
1045      /**
1046      * Get date options for second step in ACP
1047      */
1048      function get_date_options()
1049      {
1050          global $user, $config, $lang_defs;
1051   
1052          $default_lang_id = $lang_defs['iso'][$config['default_lang']];
1053   
1054          $profile_row = array(
1055              'var_name'                => 'field_default_value',
1056              'lang_name'                => $this->vars['lang_name'],
1057              'lang_explain'            => $this->vars['lang_explain'],
1058              'lang_id'                => $default_lang_id,
1059              'field_default_value'    => $this->vars['field_default_value'],
1060              'field_ident'            => 'field_default_value',
1061              'field_type'            => FIELD_DATE,
1062              'field_length'            => $this->vars['field_length']
1063          );
1064   
1065          $always_now = request_var('always_now', -1);
1066          if ($always_now == -1)
1067          {
1068              $s_checked = ($this->vars['field_default_value'] == 'now') ? true : false;
1069          }
1070          else
1071          {
1072              $s_checked = ($always_now) ? true : false;
1073          }
1074   
1075          $options = array(
1076              0 => array('TITLE' => $user->lang['DEFAULT_VALUE'],    'FIELD' => $this->process_field_row('preview', $profile_row)),
1077              1 => array('TITLE' => $user->lang['ALWAYS_TODAY'],    'FIELD' => '<label><input type="radio" class="radio" name="always_now" value="1"' . (($s_checked) ? ' checked="checked"' : '') . ' onchange="document.getElementById(\'add_profile_field\').submit();" /> ' . $user->lang['YES'] . '</label><label><input type="radio" class="radio" name="always_now" value="0"' . ((!$s_checked) ? ' checked="checked"' : '') . ' onchange="document.getElementById(\'add_profile_field\').submit();" /> ' . $user->lang['NO'] . '</label>'),
1078          );
1079   
1080          return $options;
1081      }
1082  }
1083   
1084  ?>