Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
acp_profile.php
0001 <?php
0002 /**
0003 *
0004 * This file is part of the phpBB Forum Software package.
0005 *
0006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
0007 * @license GNU General Public License, version 2 (GPL-2.0)
0008 *
0009 * For full copyright and license information, please see
0010 * the docs/CREDITS.txt file.
0011 *
0012 */
0013
0014 /**
0015 * @ignore
0016 */
0017 if (!defined('IN_PHPBB'))
0018 {
0019 exit;
0020 }
0021
0022 class acp_profile
0023 {
0024 var $u_action;
0025
0026 var $edit_lang_id;
0027 var $lang_defs;
0028
0029 /**
0030 * @var \phpbb\di\service_collection
0031 */
0032 protected $type_collection;
0033
0034 function main($id, $mode)
0035 {
0036 global $config, $db, $user, $template;
0037 global $phpbb_root_path, $phpEx;
0038 global $request, $phpbb_container, $phpbb_log, $phpbb_dispatcher;
0039
0040 if (!function_exists('generate_smilies'))
0041 {
0042 include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
0043 }
0044
0045 if (!function_exists('user_get_id_name'))
0046 {
0047 include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
0048 }
0049
0050 $user->add_lang(array('ucp', 'acp/profile'));
0051 $this->tpl_name = 'acp_profile';
0052 $this->page_title = 'ACP_CUSTOM_PROFILE_FIELDS';
0053
0054 $field_id = $request->variable('field_id', 0);
0055 $action = (isset($_POST['create'])) ? 'create' : $request->variable('action', '');
0056
0057 $error = array();
0058
0059 $form_key = 'acp_profile';
0060 add_form_key($form_key);
0061
0062 if (!$field_id && in_array($action, array('delete','activate', 'deactivate', 'move_up', 'move_down', 'edit')))
0063 {
0064 trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
0065 }
0066
0067 /* @var $cp \phpbb\profilefields\manager */
0068 $cp = $phpbb_container->get('profilefields.manager');
0069 $this->type_collection = $phpbb_container->get('profilefields.type_collection');
0070
0071 // Build Language array
0072 // Based on this, we decide which elements need to be edited later and which language items are missing
0073 $this->lang_defs = array();
0074
0075 $sql = 'SELECT lang_id, lang_iso
0076 FROM ' . LANG_TABLE . '
0077 ORDER BY lang_english_name';
0078 $result = $db->sql_query($sql);
0079
0080 while ($row = $db->sql_fetchrow($result))
0081 {
0082 // Make some arrays with all available languages
0083 $this->lang_defs['id'][$row['lang_id']] = $row['lang_iso'];
0084 $this->lang_defs['iso'][$row['lang_iso']] = $row['lang_id'];
0085 }
0086 $db->sql_freeresult($result);
0087
0088 $sql = 'SELECT field_id, lang_id
0089 FROM ' . PROFILE_LANG_TABLE . '
0090 ORDER BY lang_id';
0091 $result = $db->sql_query($sql);
0092
0093 while ($row = $db->sql_fetchrow($result))
0094 {
0095 // Which languages are available for each item
0096 $this->lang_defs['entry'][$row['field_id']][] = $row['lang_id'];
0097 }
0098 $db->sql_freeresult($result);
0099
0100 // Have some fields been defined?
0101 if (isset($this->lang_defs['entry']))
0102 {
0103 foreach ($this->lang_defs['entry'] as $field_ident => $field_ary)
0104 {
0105 // Fill an array with the languages that are missing for each field
0106 $this->lang_defs['diff'][$field_ident] = array_diff(array_values($this->lang_defs['iso']), $field_ary);
0107 }
0108 }
0109
0110 switch ($action)
0111 {
0112 case 'delete':
0113
0114 if (confirm_box(true))
0115 {
0116 $sql = 'SELECT field_ident
0117 FROM ' . PROFILE_FIELDS_TABLE . "
0118 WHERE field_id = $field_id";
0119 $result = $db->sql_query($sql);
0120 $field_ident = (string) $db->sql_fetchfield('field_ident');
0121 $db->sql_freeresult($result);
0122
0123 $db->sql_transaction('begin');
0124
0125 $db->sql_query('DELETE FROM ' . PROFILE_FIELDS_TABLE . " WHERE field_id = $field_id");
0126 $db->sql_query('DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " WHERE field_id = $field_id");
0127 $db->sql_query('DELETE FROM ' . PROFILE_LANG_TABLE . " WHERE field_id = $field_id");
0128
0129 /* @var $db_tools \phpbb\db\tools\tools_interface */
0130 $db_tools = $phpbb_container->get('dbal.tools');
0131 $db_tools->sql_column_remove(PROFILE_FIELDS_DATA_TABLE, 'pf_' . $field_ident);
0132
0133 $order = 0;
0134
0135 $sql = 'SELECT *
0136 FROM ' . PROFILE_FIELDS_TABLE . '
0137 ORDER BY field_order';
0138 $result = $db->sql_query($sql);
0139
0140 while ($row = $db->sql_fetchrow($result))
0141 {
0142 $order++;
0143 if ($row['field_order'] != $order)
0144 {
0145 $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
0146 SET field_order = $order
0147 WHERE field_id = {$row['field_id']}";
0148 $db->sql_query($sql);
0149 }
0150 }
0151 $db->sql_freeresult($result);
0152
0153 $db->sql_transaction('commit');
0154
0155 $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_REMOVED', false, array($field_ident));
0156 trigger_error($user->lang['REMOVED_PROFILE_FIELD'] . adm_back_link($this->u_action));
0157 }
0158 else
0159 {
0160 confirm_box(false, 'DELETE_PROFILE_FIELD', build_hidden_fields(array(
0161 'i' => $id,
0162 'mode' => $mode,
0163 'action' => $action,
0164 'field_id' => $field_id,
0165 )));
0166 }
0167
0168 break;
0169
0170 case 'activate':
0171
0172 if (!check_link_hash($request->variable('hash', ''), 'acp_profile'))
0173 {
0174 trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
0175 }
0176
0177 $sql = 'SELECT lang_id
0178 FROM ' . LANG_TABLE . "
0179 WHERE lang_iso = '" . $db->sql_escape($config['default_lang']) . "'";
0180 $result = $db->sql_query($sql);
0181 $default_lang_id = (int) $db->sql_fetchfield('lang_id');
0182 $db->sql_freeresult($result);
0183
0184 if (!in_array($default_lang_id, $this->lang_defs['entry'][$field_id]))
0185 {
0186 trigger_error($user->lang['DEFAULT_LANGUAGE_NOT_FILLED'] . adm_back_link($this->u_action), E_USER_WARNING);
0187 }
0188
0189 $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
0190 SET field_active = 1
0191 WHERE field_id = $field_id";
0192 $db->sql_query($sql);
0193
0194 $sql = 'SELECT field_ident
0195 FROM ' . PROFILE_FIELDS_TABLE . "
0196 WHERE field_id = $field_id";
0197 $result = $db->sql_query($sql);
0198 $field_ident = (string) $db->sql_fetchfield('field_ident');
0199 $db->sql_freeresult($result);
0200
0201 $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_ACTIVATE', false, array($field_ident));
0202
0203 if ($request->is_ajax())
0204 {
0205 $json_response = new \phpbb\json_response();
0206 $json_response->send(array(
0207 'text' => $user->lang('DEACTIVATE'),
0208 ));
0209 }
0210
0211 trigger_error($user->lang['PROFILE_FIELD_ACTIVATED'] . adm_back_link($this->u_action));
0212
0213 break;
0214
0215 case 'deactivate':
0216
0217 if (!check_link_hash($request->variable('hash', ''), 'acp_profile'))
0218 {
0219 trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
0220 }
0221
0222 $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
0223 SET field_active = 0
0224 WHERE field_id = $field_id";
0225 $db->sql_query($sql);
0226
0227 $sql = 'SELECT field_ident
0228 FROM ' . PROFILE_FIELDS_TABLE . "
0229 WHERE field_id = $field_id";
0230 $result = $db->sql_query($sql);
0231 $field_ident = (string) $db->sql_fetchfield('field_ident');
0232 $db->sql_freeresult($result);
0233
0234 if ($request->is_ajax())
0235 {
0236 $json_response = new \phpbb\json_response();
0237 $json_response->send(array(
0238 'text' => $user->lang('ACTIVATE'),
0239 ));
0240 }
0241
0242 $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_DEACTIVATE', false, array($field_ident));
0243
0244 trigger_error($user->lang['PROFILE_FIELD_DEACTIVATED'] . adm_back_link($this->u_action));
0245
0246 break;
0247
0248 case 'move_up':
0249 case 'move_down':
0250
0251 if (!check_link_hash($request->variable('hash', ''), 'acp_profile'))
0252 {
0253 trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
0254 }
0255
0256 $sql = 'SELECT field_order
0257 FROM ' . PROFILE_FIELDS_TABLE . "
0258 WHERE field_id = $field_id";
0259 $result = $db->sql_query($sql);
0260 $field_order = $db->sql_fetchfield('field_order');
0261 $db->sql_freeresult($result);
0262
0263 if ($field_order === false || ($field_order == 0 && $action == 'move_up'))
0264 {
0265 break;
0266 }
0267 $field_order = (int) $field_order;
0268 $order_total = $field_order * 2 + (($action == 'move_up') ? -1 : 1);
0269
0270 $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
0271 SET field_order = $order_total - field_order
0272 WHERE field_order IN ($field_order, " . (($action == 'move_up') ? $field_order - 1 : $field_order + 1) . ')';
0273 $db->sql_query($sql);
0274
0275 if ($request->is_ajax())
0276 {
0277 $json_response = new \phpbb\json_response;
0278 $json_response->send(array(
0279 'success' => (bool) $db->sql_affectedrows(),
0280 ));
0281 }
0282
0283 break;
0284
0285 case 'create':
0286 case 'edit':
0287
0288 $step = $request->variable('step', 1);
0289
0290 $submit = (isset($_REQUEST['next']) || isset($_REQUEST['prev'])) ? true : false;
0291 $save = (isset($_REQUEST['save'])) ? true : false;
0292
0293 // The language id of default language
0294 $this->edit_lang_id = $this->lang_defs['iso'][$config['default_lang']];
0295
0296 // We are editing... we need to grab basic things
0297 if ($action == 'edit')
0298 {
0299 $sql = 'SELECT l.*, f.*
0300 FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f
0301 WHERE l.lang_id = ' . $this->edit_lang_id . "
0302 AND f.field_id = $field_id
0303 AND l.field_id = f.field_id";
0304 $result = $db->sql_query($sql);
0305 $field_row = $db->sql_fetchrow($result);
0306 $db->sql_freeresult($result);
0307
0308 if (!$field_row)
0309 {
0310 // Some admin changed the default language?
0311 $sql = 'SELECT l.*, f.*
0312 FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f
0313 WHERE l.lang_id <> ' . $this->edit_lang_id . "
0314 AND f.field_id = $field_id
0315 AND l.field_id = f.field_id";
0316 $result = $db->sql_query($sql);
0317 $field_row = $db->sql_fetchrow($result);
0318 $db->sql_freeresult($result);
0319
0320 if (!$field_row)
0321 {
0322 trigger_error($user->lang['FIELD_NOT_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
0323 }
0324
0325 $this->edit_lang_id = $field_row['lang_id'];
0326 }
0327 $field_type = $field_row['field_type'];
0328 $profile_field = $this->type_collection[$field_type];
0329
0330 // Get language entries
0331 $sql = 'SELECT *
0332 FROM ' . PROFILE_FIELDS_LANG_TABLE . '
0333 WHERE lang_id = ' . $this->edit_lang_id . "
0334 AND field_id = $field_id
0335 ORDER BY option_id ASC";
0336 $result = $db->sql_query($sql);
0337
0338 $lang_options = array();
0339 while ($row = $db->sql_fetchrow($result))
0340 {
0341 $lang_options[$row['option_id']] = $row['lang_value'];
0342 }
0343 $db->sql_freeresult($result);
0344
0345 $s_hidden_fields = '<input type="hidden" name="field_id" value="' . $field_id . '" />';
0346 }
0347 else
0348 {
0349 // We are adding a new field, define basic params
0350 $lang_options = $field_row = array();
0351
0352 $field_type = $request->variable('field_type', '');
0353
0354 if (!isset($this->type_collection[$field_type]))
0355 {
0356 trigger_error($user->lang['NO_FIELD_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
0357 }
0358
0359 $profile_field = $this->type_collection[$field_type];
0360 $field_row = array_merge($profile_field->get_default_option_values(), array(
0361 'field_ident' => str_replace(' ', '_', utf8_clean_string($request->variable('field_ident', '', true))),
0362 'field_required' => 0,
0363 'field_show_novalue'=> 0,
0364 'field_hide' => 0,
0365 'field_show_profile'=> 0,
0366 'field_no_view' => 0,
0367 'field_show_on_reg' => 0,
0368 'field_show_on_pm' => 0,
0369 'field_show_on_vt' => 0,
0370 'field_show_on_ml' => 0,
0371 'field_is_contact' => 0,
0372 'field_contact_desc'=> '',
0373 'field_contact_url' => '',
0374 'lang_name' => $request->variable('field_ident', '', true),
0375 'lang_explain' => '',
0376 'lang_default_value'=> '')
0377 );
0378
0379 $s_hidden_fields = '<input type="hidden" name="field_type" value="' . $field_type . '" />';
0380 }
0381
0382 // $exclude contains the data we gather in each step
0383 $exclude = array(
0384 1 => array('field_ident', 'lang_name', 'lang_explain', 'field_option_none', 'field_show_on_reg', 'field_show_on_pm', 'field_show_on_vt', 'field_show_on_ml', 'field_required', 'field_show_novalue', 'field_hide', 'field_show_profile', 'field_no_view', 'field_is_contact', 'field_contact_desc', 'field_contact_url'),
0385 2 => array('field_length', 'field_maxlen', 'field_minlen', 'field_validation', 'field_novalue', 'field_default_value'),
0386 3 => array('l_lang_name', 'l_lang_explain', 'l_lang_default_value', 'l_lang_options')
0387 );
0388
0389 // Visibility Options...
0390 $visibility_ary = array(
0391 'field_required',
0392 'field_show_novalue',
0393 'field_show_on_reg',
0394 'field_show_on_pm',
0395 'field_show_on_vt',
0396 'field_show_on_ml',
0397 'field_show_profile',
0398 'field_hide',
0399 'field_is_contact',
0400 );
0401
0402 /**
0403 * Event to add initialization for new profile field table fields
0404 *
0405 * @event core.acp_profile_create_edit_init
0406 * @var string action create|edit
0407 * @var int step Configuration step (1|2|3)
0408 * @var bool submit Form has been submitted
0409 * @var bool save Configuration should be saved
0410 * @var string field_type Type of the field we are dealing with
0411 * @var array field_row Array of data about the field
0412 * @var array exclude Array of excluded fields by step
0413 * @var array visibility_ary Array of fields that are visibility related
0414 * @since 3.1.6-RC1
0415 */
0416 $vars = array(
0417 'action',
0418 'step',
0419 'submit',
0420 'save',
0421 'field_type',
0422 'field_row',
0423 'exclude',
0424 'visibility_ary',
0425 );
0426 extract($phpbb_dispatcher->trigger_event('core.acp_profile_create_edit_init', compact($vars)));
0427
0428 $options = $profile_field->prepare_options_form($exclude, $visibility_ary);
0429
0430 $cp->vars['field_ident'] = ($action == 'create' && $step == 1) ? utf8_clean_string($request->variable('field_ident', $field_row['field_ident'], true)) : $request->variable('field_ident', $field_row['field_ident']);
0431 $cp->vars['lang_name'] = $request->variable('lang_name', $field_row['lang_name'], true);
0432 $cp->vars['lang_explain'] = $request->variable('lang_explain', $field_row['lang_explain'], true);
0433 $cp->vars['lang_default_value'] = $request->variable('lang_default_value', $field_row['lang_default_value'], true);
0434 $cp->vars['field_contact_desc'] = $request->variable('field_contact_desc', $field_row['field_contact_desc'], true);
0435 $cp->vars['field_contact_url'] = $request->variable('field_contact_url', $field_row['field_contact_url'], true);
0436
0437 foreach ($visibility_ary as $val)
0438 {
0439 $cp->vars[$val] = ($submit || $save) ? $request->variable($val, 0) : $field_row[$val];
0440 }
0441
0442 $cp->vars['field_no_view'] = $request->variable('field_no_view', (int) $field_row['field_no_view']);
0443
0444 // If the user has submitted a form with options (i.e. dropdown field)
0445 if ($options)
0446 {
0447 $exploded_options = (is_array($options)) ? $options : explode("\n", $options);
0448
0449 if (sizeof($exploded_options) == sizeof($lang_options) || $action == 'create')
0450 {
0451 // The number of options in the field is equal to the number of options already in the database
0452 // Or we are creating a new dropdown list.
0453 $cp->vars['lang_options'] = $exploded_options;
0454 }
0455 else if ($action == 'edit')
0456 {
0457 // Changing the number of options? (We remove and re-create the option fields)
0458 $cp->vars['lang_options'] = $exploded_options;
0459 }
0460 }
0461 else
0462 {
0463 $cp->vars['lang_options'] = $lang_options;
0464 }
0465
0466 // step 2
0467 foreach ($exclude[2] as $key)
0468 {
0469 $var = $request->variable($key, $field_row[$key], true);
0470
0471 $field_data = $cp->vars;
0472 $var = $profile_field->get_excluded_options($key, $action, $var, $field_data, 2);
0473 $cp->vars = $field_data;
0474
0475 $cp->vars[$key] = $var;
0476 }
0477
0478 // step 3 - all arrays
0479 if ($action == 'edit')
0480 {
0481 // Get language entries
0482 $sql = 'SELECT *
0483 FROM ' . PROFILE_FIELDS_LANG_TABLE . '
0484 WHERE lang_id <> ' . $this->edit_lang_id . "
0485 AND field_id = $field_id
0486 ORDER BY option_id ASC";
0487 $result = $db->sql_query($sql);
0488
0489 $l_lang_options = array();
0490 while ($row = $db->sql_fetchrow($result))
0491 {
0492 $l_lang_options[$row['lang_id']][$row['option_id']] = $row['lang_value'];
0493 }
0494 $db->sql_freeresult($result);
0495
0496 $sql = 'SELECT lang_id, lang_name, lang_explain, lang_default_value
0497 FROM ' . PROFILE_LANG_TABLE . '
0498 WHERE lang_id <> ' . $this->edit_lang_id . "
0499 AND field_id = $field_id
0500 ORDER BY lang_id ASC";
0501 $result = $db->sql_query($sql);
0502
0503 $l_lang_name = $l_lang_explain = $l_lang_default_value = array();
0504 while ($row = $db->sql_fetchrow($result))
0505 {
0506 $l_lang_name[$row['lang_id']] = $row['lang_name'];
0507 $l_lang_explain[$row['lang_id']] = $row['lang_explain'];
0508 $l_lang_default_value[$row['lang_id']] = $row['lang_default_value'];
0509 }
0510 $db->sql_freeresult($result);
0511 }
0512
0513 foreach ($exclude[3] as $key)
0514 {
0515 $cp->vars[$key] = $request->variable($key, array(0 => ''), true);
0516
0517 if (!$cp->vars[$key] && $action == 'edit')
0518 {
0519 $cp->vars[$key] = ${$key};
0520 }
0521
0522 $field_data = $cp->vars;
0523 $var = $profile_field->get_excluded_options($key, $action, $var, $field_data, 3);
0524 $cp->vars = $field_data;
0525 }
0526
0527 // Check for general issues in every step
0528 if ($submit) // && $step == 1
0529 {
0530 // Check values for step 1
0531 if ($cp->vars['field_ident'] == '')
0532 {
0533 $error[] = $user->lang['EMPTY_FIELD_IDENT'];
0534 }
0535
0536 if (!preg_match('/^[a-z_]+$/', $cp->vars['field_ident']))
0537 {
0538 $error[] = $user->lang['INVALID_CHARS_FIELD_IDENT'];
0539 }
0540
0541 if (strlen($cp->vars['field_ident']) > 17)
0542 {
0543 $error[] = $user->lang['INVALID_FIELD_IDENT_LEN'];
0544 }
0545
0546 if ($cp->vars['lang_name'] == '')
0547 {
0548 $error[] = $user->lang['EMPTY_USER_FIELD_NAME'];
0549 }
0550
0551 $error = $profile_field->validate_options_on_submit($error, $cp->vars);
0552
0553 // Check for already existing field ident
0554 if ($action != 'edit')
0555 {
0556 $sql = 'SELECT field_ident
0557 FROM ' . PROFILE_FIELDS_TABLE . "
0558 WHERE field_ident = '" . $db->sql_escape($cp->vars['field_ident']) . "'";
0559 $result = $db->sql_query($sql);
0560 $row = $db->sql_fetchrow($result);
0561 $db->sql_freeresult($result);
0562
0563 if ($row)
0564 {
0565 $error[] = $user->lang['FIELD_IDENT_ALREADY_EXIST'];
0566 }
0567 }
0568 }
0569
0570 if (sizeof($error))
0571 {
0572 $submit = false;
0573 }
0574 else
0575 {
0576 $step = (isset($_REQUEST['next'])) ? $step + 1 : ((isset($_REQUEST['prev'])) ? $step - 1 : $step);
0577 }
0578
0579 // Build up the specific hidden fields
0580 foreach ($exclude as $num => $key_ary)
0581 {
0582 if ($num == $step)
0583 {
0584 continue;
0585 }
0586
0587 $_new_key_ary = array();
0588
0589 $field_data = $cp->vars;
0590 foreach ($key_ary as $key)
0591 {
0592 $var = $profile_field->prepare_hidden_fields($step, $key, $action, $field_data);
0593 if ($var !== null)
0594 {
0595 $_new_key_ary[$key] = $var;
0596 }
0597 }
0598 $cp->vars = $field_data;
0599
0600 $s_hidden_fields .= build_hidden_fields($_new_key_ary);
0601 }
0602
0603 if (!sizeof($error))
0604 {
0605 if (($step == 3 && (sizeof($this->lang_defs['iso']) == 1 || $save)) || ($action == 'edit' && $save))
0606 {
0607 if (!check_form_key($form_key))
0608 {
0609 trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
0610 }
0611
0612 $this->save_profile_field($cp, $field_type, $action);
0613 }
0614 }
0615
0616 $template->assign_vars(array(
0617 'S_EDIT' => true,
0618 'S_EDIT_MODE' => ($action == 'edit') ? true : false,
0619 'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
0620
0621 'L_TITLE' => $user->lang['STEP_' . $step . '_TITLE_' . strtoupper($action)],
0622 'L_EXPLAIN' => $user->lang['STEP_' . $step . '_EXPLAIN_' . strtoupper($action)],
0623
0624 'U_ACTION' => $this->u_action . "&action=$action&step=$step",
0625 'U_BACK' => $this->u_action)
0626 );
0627
0628 // Now go through the steps
0629 switch ($step)
0630 {
0631 // Create basic options - only small differences between field types
0632 case 1:
0633 $template_vars = array(
0634 'S_STEP_ONE' => true,
0635 'S_FIELD_REQUIRED' => ($cp->vars['field_required']) ? true : false,
0636 'S_FIELD_SHOW_NOVALUE'=> ($cp->vars['field_show_novalue']) ? true : false,
0637 'S_SHOW_ON_REG' => ($cp->vars['field_show_on_reg']) ? true : false,
0638 'S_SHOW_ON_PM' => ($cp->vars['field_show_on_pm']) ? true : false,
0639 'S_SHOW_ON_VT' => ($cp->vars['field_show_on_vt']) ? true : false,
0640 'S_SHOW_ON_MEMBERLIST'=> ($cp->vars['field_show_on_ml']) ? true : false,
0641 'S_FIELD_HIDE' => ($cp->vars['field_hide']) ? true : false,
0642 'S_SHOW_PROFILE' => ($cp->vars['field_show_profile']) ? true : false,
0643 'S_FIELD_NO_VIEW' => ($cp->vars['field_no_view']) ? true : false,
0644 'S_FIELD_CONTACT' => $cp->vars['field_is_contact'],
0645 'FIELD_CONTACT_DESC'=> $cp->vars['field_contact_desc'],
0646 'FIELD_CONTACT_URL' => $cp->vars['field_contact_url'],
0647
0648 'L_LANG_SPECIFIC' => sprintf($user->lang['LANG_SPECIFIC_OPTIONS'], $config['default_lang']),
0649 'FIELD_TYPE' => $profile_field->get_name(),
0650 'FIELD_IDENT' => $cp->vars['field_ident'],
0651 'LANG_NAME' => $cp->vars['lang_name'],
0652 'LANG_EXPLAIN' => $cp->vars['lang_explain'],
0653 );
0654
0655 $field_data = $cp->vars;
0656 $profile_field->display_options($template_vars, $field_data);
0657 $cp->vars = $field_data;
0658
0659 // Build common create options
0660 $template->assign_vars($template_vars);
0661 break;
0662
0663 case 2:
0664
0665 $template->assign_vars(array(
0666 'S_STEP_TWO' => true,
0667 'L_NEXT_STEP' => (sizeof($this->lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS'])
0668 );
0669
0670 // Build options based on profile type
0671 $options = $profile_field->get_options($this->lang_defs['iso'][$config['default_lang']], $cp->vars);
0672
0673 foreach ($options as $num => $option_ary)
0674 {
0675 $template->assign_block_vars('option', $option_ary);
0676 }
0677
0678 break;
0679
0680 // Define remaining language variables
0681 case 3:
0682
0683 $template->assign_var('S_STEP_THREE', true);
0684 $options = $this->build_language_options($cp, $field_type, $action);
0685
0686 foreach ($options as $lang_id => $lang_ary)
0687 {
0688 $template->assign_block_vars('options', array(
0689 'LANGUAGE' => sprintf($user->lang[(($lang_id == $this->edit_lang_id) ? 'DEFAULT_' : '') . 'ISO_LANGUAGE'], $lang_ary['lang_iso']))
0690 );
0691
0692 foreach ($lang_ary['fields'] as $field_ident => $field_ary)
0693 {
0694 $template->assign_block_vars('options.field', array(
0695 'L_TITLE' => $field_ary['TITLE'],
0696 'L_EXPLAIN' => (isset($field_ary['EXPLAIN'])) ? $field_ary['EXPLAIN'] : '',
0697 'FIELD' => $field_ary['FIELD'])
0698 );
0699 }
0700 }
0701
0702 break;
0703 }
0704
0705 $field_data = $cp->vars;
0706 /**
0707 * Event to add template variables for new profile field table fields
0708 *
0709 * @event core.acp_profile_create_edit_after
0710 * @var string action create|edit
0711 * @var int step Configuration step (1|2|3)
0712 * @var bool submit Form has been submitted
0713 * @var bool save Configuration should be saved
0714 * @var string field_type Type of the field we are dealing with
0715 * @var array field_data Array of data about the field
0716 * @var array s_hidden_fields Array of hidden fields in case this needs modification
0717 * @var array options Array of options specific to this step
0718 * @since 3.1.6-RC1
0719 */
0720 $vars = array(
0721 'action',
0722 'step',
0723 'submit',
0724 'save',
0725 'field_type',
0726 'field_data',
0727 's_hidden_fields',
0728 'options',
0729 );
0730 extract($phpbb_dispatcher->trigger_event('core.acp_profile_create_edit_after', compact($vars)));
0731
0732 $template->assign_vars(array(
0733 'S_HIDDEN_FIELDS' => $s_hidden_fields)
0734 );
0735
0736 return;
0737
0738 break;
0739 }
0740
0741 $sql = 'SELECT *
0742 FROM ' . PROFILE_FIELDS_TABLE . '
0743 ORDER BY field_order';
0744 $result = $db->sql_query($sql);
0745
0746 $s_one_need_edit = false;
0747 while ($row = $db->sql_fetchrow($result))
0748 {
0749 $active_lang = (!$row['field_active']) ? 'ACTIVATE' : 'DEACTIVATE';
0750 $active_value = (!$row['field_active']) ? 'activate' : 'deactivate';
0751 $id = $row['field_id'];
0752
0753 $s_need_edit = (sizeof($this->lang_defs['diff'][$row['field_id']])) ? true : false;
0754
0755 if ($s_need_edit)
0756 {
0757 $s_one_need_edit = true;
0758 }
0759
0760 if (!isset($this->type_collection[$row['field_type']]))
0761 {
0762 continue;
0763 }
0764 $profile_field = $this->type_collection[$row['field_type']];
0765 $template->assign_block_vars('fields', array(
0766 'FIELD_IDENT' => $row['field_ident'],
0767 'FIELD_TYPE' => $profile_field->get_name(),
0768
0769 'L_ACTIVATE_DEACTIVATE' => $user->lang[$active_lang],
0770 'U_ACTIVATE_DEACTIVATE' => $this->u_action . "&action=$active_value&field_id=$id" . '&hash=' . generate_link_hash('acp_profile'),
0771 'U_EDIT' => $this->u_action . "&action=edit&field_id=$id",
0772 'U_TRANSLATE' => $this->u_action . "&action=edit&field_id=$id&step=3",
0773 'U_DELETE' => $this->u_action . "&action=delete&field_id=$id",
0774 'U_MOVE_UP' => $this->u_action . "&action=move_up&field_id=$id" . '&hash=' . generate_link_hash('acp_profile'),
0775 'U_MOVE_DOWN' => $this->u_action . "&action=move_down&field_id=$id" . '&hash=' . generate_link_hash('acp_profile'),
0776
0777 'S_NEED_EDIT' => $s_need_edit)
0778 );
0779 }
0780 $db->sql_freeresult($result);
0781
0782 // At least one option field needs editing?
0783 if ($s_one_need_edit)
0784 {
0785 $template->assign_var('S_NEED_EDIT', true);
0786 }
0787
0788 $s_select_type = '';
0789 foreach ($this->type_collection as $key => $profile_field)
0790 {
0791 $s_select_type .= '<option value="' . $key . '">' . $profile_field->get_name() . '</option>';
0792 }
0793
0794 $template->assign_vars(array(
0795 'U_ACTION' => $this->u_action,
0796 'S_TYPE_OPTIONS' => $s_select_type,
0797 ));
0798 }
0799
0800 /**
0801 * Build all Language specific options
0802 */
0803 function build_language_options(&$cp, $field_type, $action = 'create')
0804 {
0805 global $user, $config, $db, $request;
0806
0807 $default_lang_id = (!empty($this->edit_lang_id)) ? $this->edit_lang_id : $this->lang_defs['iso'][$config['default_lang']];
0808
0809 $sql = 'SELECT lang_id, lang_iso
0810 FROM ' . LANG_TABLE . '
0811 WHERE lang_id <> ' . (int) $default_lang_id . '
0812 ORDER BY lang_english_name';
0813 $result = $db->sql_query($sql);
0814
0815 $languages = array();
0816 while ($row = $db->sql_fetchrow($result))
0817 {
0818 $languages[$row['lang_id']] = $row['lang_iso'];
0819 }
0820 $db->sql_freeresult($result);
0821
0822 $profile_field = $this->type_collection[$field_type];
0823 $options = $profile_field->get_language_options($cp->vars);
0824
0825 $lang_options = array();
0826
0827 foreach ($options as $field => $field_type)
0828 {
0829 $lang_options[1]['lang_iso'] = $this->lang_defs['id'][$default_lang_id];
0830 $lang_options[1]['fields'][$field] = array(
0831 'TITLE' => $user->lang['CP_' . strtoupper($field)],
0832 'FIELD' => '<dd>' . ((is_array($cp->vars[$field])) ? implode('<br />', $cp->vars[$field]) : bbcode_nl2br($cp->vars[$field])) . '</dd>'
0833 );
0834
0835 if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
0836 {
0837 $lang_options[1]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
0838 }
0839 }
0840
0841 foreach ($languages as $lang_id => $lang_iso)
0842 {
0843 $lang_options[$lang_id]['lang_iso'] = $lang_iso;
0844 foreach ($options as $field => $field_type)
0845 {
0846 $value = ($action == 'create') ? $request->variable('l_' . $field, array(0 => ''), true) : $cp->vars['l_' . $field];
0847 if ($field == 'lang_options')
0848 {
0849 $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];
0850
0851 switch ($field_type)
0852 {
0853 case 'two_options':
0854
0855 $lang_options[$lang_id]['fields'][$field] = array(
0856 'TITLE' => $user->lang['CP_' . strtoupper($field)],
0857 'FIELD' => '
0858 <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>
0859 <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>'
0860 );
0861 break;
0862
0863 case 'optionfield':
0864 $value = ((isset($value[$lang_id])) ? ((is_array($value[$lang_id])) ? implode("\n", $value[$lang_id]) : $value[$lang_id]) : implode("\n", $var));
0865 $lang_options[$lang_id]['fields'][$field] = array(
0866 'TITLE' => $user->lang['CP_' . strtoupper($field)],
0867 'FIELD' => '<dd><textarea name="l_' . $field . '[' . $lang_id . ']" rows="7" cols="80">' . $value . '</textarea></dd>'
0868 );
0869 break;
0870 }
0871
0872 if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
0873 {
0874 $lang_options[$lang_id]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
0875 }
0876 }
0877 else
0878 {
0879 $var = ($action == 'create' || !is_array($cp->vars[$field])) ? $cp->vars[$field] : $cp->vars[$field][$lang_id];
0880
0881 $lang_options[$lang_id]['fields'][$field] = array(
0882 'TITLE' => $user->lang['CP_' . strtoupper($field)],
0883 '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>'
0884 );
0885
0886 if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
0887 {
0888 $lang_options[$lang_id]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
0889 }
0890 }
0891 }
0892 }
0893
0894 return $lang_options;
0895 }
0896
0897 /**
0898 * Save Profile Field
0899 */
0900 function save_profile_field(&$cp, $field_type, $action = 'create')
0901 {
0902 global $db, $config, $user, $phpbb_container, $phpbb_log, $request, $phpbb_dispatcher;
0903
0904 $field_id = $request->variable('field_id', 0);
0905
0906 // Collect all information, if something is going wrong, abort the operation
0907 $profile_sql = $profile_lang = $empty_lang = $profile_lang_fields = array();
0908
0909 $default_lang_id = (!empty($this->edit_lang_id)) ? $this->edit_lang_id : $this->lang_defs['iso'][$config['default_lang']];
0910
0911 if ($action == 'create')
0912 {
0913 $sql = 'SELECT MAX(field_order) as max_field_order
0914 FROM ' . PROFILE_FIELDS_TABLE;
0915 $result = $db->sql_query($sql);
0916 $new_field_order = (int) $db->sql_fetchfield('max_field_order');
0917 $db->sql_freeresult($result);
0918
0919 $field_ident = $cp->vars['field_ident'];
0920 }
0921
0922 // Save the field
0923 $profile_fields = array(
0924 'field_length' => $cp->vars['field_length'],
0925 'field_minlen' => $cp->vars['field_minlen'],
0926 'field_maxlen' => $cp->vars['field_maxlen'],
0927 'field_novalue' => $cp->vars['field_novalue'],
0928 'field_default_value' => $cp->vars['field_default_value'],
0929 'field_validation' => $cp->vars['field_validation'],
0930 'field_required' => $cp->vars['field_required'],
0931 'field_show_novalue' => $cp->vars['field_show_novalue'],
0932 'field_show_on_reg' => $cp->vars['field_show_on_reg'],
0933 'field_show_on_pm' => $cp->vars['field_show_on_pm'],
0934 'field_show_on_vt' => $cp->vars['field_show_on_vt'],
0935 'field_show_on_ml' => $cp->vars['field_show_on_ml'],
0936 'field_hide' => $cp->vars['field_hide'],
0937 'field_show_profile' => $cp->vars['field_show_profile'],
0938 'field_no_view' => $cp->vars['field_no_view'],
0939 'field_is_contact' => $cp->vars['field_is_contact'],
0940 'field_contact_desc' => $cp->vars['field_contact_desc'],
0941 'field_contact_url' => $cp->vars['field_contact_url'],
0942 );
0943
0944 $field_data = $cp->vars;
0945 /**
0946 * Event to modify profile field configuration data before saving to database
0947 *
0948 * @event core.acp_profile_create_edit_save_before
0949 * @var string action create|edit
0950 * @var string field_type Type of the field we are dealing with
0951 * @var array field_data Array of data about the field
0952 * @var array profile_fields Array of fields to be sent to the database
0953 * @since 3.1.6-RC1
0954 */
0955 $vars = array(
0956 'action',
0957 'field_type',
0958 'field_data',
0959 'profile_fields',
0960 );
0961 extract($phpbb_dispatcher->trigger_event('core.acp_profile_create_edit_save_before', compact($vars)));
0962
0963 if ($action == 'create')
0964 {
0965 $profile_fields += array(
0966 'field_type' => $field_type,
0967 'field_ident' => $field_ident,
0968 'field_name' => $field_ident,
0969 'field_order' => $new_field_order + 1,
0970 'field_active' => 1
0971 );
0972
0973 $sql = 'INSERT INTO ' . PROFILE_FIELDS_TABLE . ' ' . $db->sql_build_array('INSERT', $profile_fields);
0974 $db->sql_query($sql);
0975
0976 $field_id = $db->sql_nextid();
0977 }
0978 else
0979 {
0980 $sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . '
0981 SET ' . $db->sql_build_array('UPDATE', $profile_fields) . "
0982 WHERE field_id = $field_id";
0983 $db->sql_query($sql);
0984 }
0985
0986 $profile_field = $this->type_collection[$field_type];
0987
0988 if ($action == 'create')
0989 {
0990 $field_ident = 'pf_' . $field_ident;
0991 /* @var $db_tools \phpbb\db\tools\tools_interface */
0992 $db_tools = $phpbb_container->get('dbal.tools');
0993 $db_tools->sql_column_add(PROFILE_FIELDS_DATA_TABLE, $field_ident, array($profile_field->get_database_column_type(), null));
0994 }
0995
0996 $sql_ary = array(
0997 'lang_name' => $cp->vars['lang_name'],
0998 'lang_explain' => $cp->vars['lang_explain'],
0999 'lang_default_value' => $cp->vars['lang_default_value']
1000 );
1001
1002 if ($action == 'create')
1003 {
1004 $sql_ary['field_id'] = $field_id;
1005 $sql_ary['lang_id'] = $default_lang_id;
1006
1007 $profile_sql[] = 'INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
1008 }
1009 else
1010 {
1011 $this->update_insert(PROFILE_LANG_TABLE, $sql_ary, array('field_id' => $field_id, 'lang_id' => $default_lang_id));
1012 }
1013
1014 if (is_array($cp->vars['l_lang_name']) && sizeof($cp->vars['l_lang_name']))
1015 {
1016 foreach ($cp->vars['l_lang_name'] as $lang_id => $data)
1017 {
1018 if (($cp->vars['lang_name'] != '' && $cp->vars['l_lang_name'][$lang_id] == '')
1019 || ($cp->vars['lang_explain'] != '' && $cp->vars['l_lang_explain'][$lang_id] == '')
1020 || ($cp->vars['lang_default_value'] != '' && $cp->vars['l_lang_default_value'][$lang_id] == ''))
1021 {
1022 $empty_lang[$lang_id] = true;
1023 break;
1024 }
1025
1026 if (!isset($empty_lang[$lang_id]))
1027 {
1028 $profile_lang[] = array(
1029 'field_id' => $field_id,
1030 'lang_id' => $lang_id,
1031 'lang_name' => $cp->vars['l_lang_name'][$lang_id],
1032 'lang_explain' => (isset($cp->vars['l_lang_explain'][$lang_id])) ? $cp->vars['l_lang_explain'][$lang_id] : '',
1033 'lang_default_value' => (isset($cp->vars['l_lang_default_value'][$lang_id])) ? $cp->vars['l_lang_default_value'][$lang_id] : ''
1034 );
1035 }
1036 }
1037
1038 foreach ($empty_lang as $lang_id => $NULL)
1039 {
1040 $sql = 'DELETE FROM ' . PROFILE_LANG_TABLE . "
1041 WHERE field_id = $field_id
1042 AND lang_id = " . (int) $lang_id;
1043 $db->sql_query($sql);
1044 }
1045 }
1046
1047 $cp->vars = $profile_field->get_language_options_input($cp->vars);
1048
1049 if ($cp->vars['lang_options'])
1050 {
1051 if (!is_array($cp->vars['lang_options']))
1052 {
1053 $cp->vars['lang_options'] = explode("\n", $cp->vars['lang_options']);
1054 }
1055
1056 if ($action != 'create')
1057 {
1058 $sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . "
1059 WHERE field_id = $field_id
1060 AND lang_id = " . (int) $default_lang_id;
1061 $db->sql_query($sql);
1062 }
1063
1064 foreach ($cp->vars['lang_options'] as $option_id => $value)
1065 {
1066 $sql_ary = array(
1067 'field_type' => $field_type,
1068 'lang_value' => $value
1069 );
1070
1071 if ($action == 'create')
1072 {
1073 $sql_ary['field_id'] = $field_id;
1074 $sql_ary['lang_id'] = $default_lang_id;
1075 $sql_ary['option_id'] = (int) $option_id;
1076
1077 $profile_sql[] = 'INSERT INTO ' . PROFILE_FIELDS_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
1078 }
1079 else
1080 {
1081 $this->update_insert(PROFILE_FIELDS_LANG_TABLE, $sql_ary, array(
1082 'field_id' => $field_id,
1083 'lang_id' => (int) $default_lang_id,
1084 'option_id' => (int) $option_id)
1085 );
1086 }
1087 }
1088 }
1089
1090 if (is_array($cp->vars['l_lang_options']) && sizeof($cp->vars['l_lang_options']))
1091 {
1092 $empty_lang = array();
1093
1094 foreach ($cp->vars['l_lang_options'] as $lang_id => $lang_ary)
1095 {
1096 if (!is_array($lang_ary))
1097 {
1098 $lang_ary = explode("\n", $lang_ary);
1099 }
1100
1101 if (sizeof($lang_ary) != sizeof($cp->vars['lang_options']))
1102 {
1103 $empty_lang[$lang_id] = true;
1104 }
1105
1106 if (!isset($empty_lang[$lang_id]))
1107 {
1108 if ($action != 'create')
1109 {
1110 $sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . "
1111 WHERE field_id = $field_id
1112 AND lang_id = " . (int) $lang_id;
1113 $db->sql_query($sql);
1114 }
1115
1116 foreach ($lang_ary as $option_id => $value)
1117 {
1118 $profile_lang_fields[] = array(
1119 'field_id' => (int) $field_id,
1120 'lang_id' => (int) $lang_id,
1121 'option_id' => (int) $option_id,
1122 'field_type' => $field_type,
1123 'lang_value' => $value
1124 );
1125 }
1126 }
1127 }
1128
1129 foreach ($empty_lang as $lang_id => $NULL)
1130 {
1131 $sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . "
1132 WHERE field_id = $field_id
1133 AND lang_id = " . (int) $lang_id;
1134 $db->sql_query($sql);
1135 }
1136 }
1137
1138 foreach ($profile_lang as $sql)
1139 {
1140 if ($action == 'create')
1141 {
1142 $profile_sql[] = 'INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql);
1143 }
1144 else
1145 {
1146 $lang_id = $sql['lang_id'];
1147 unset($sql['lang_id'], $sql['field_id']);
1148
1149 $this->update_insert(PROFILE_LANG_TABLE, $sql, array('lang_id' => (int) $lang_id, 'field_id' => $field_id));
1150 }
1151 }
1152
1153 if (sizeof($profile_lang_fields))
1154 {
1155 foreach ($profile_lang_fields as $sql)
1156 {
1157 if ($action == 'create')
1158 {
1159 $profile_sql[] = 'INSERT INTO ' . PROFILE_FIELDS_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql);
1160 }
1161 else
1162 {
1163 $lang_id = $sql['lang_id'];
1164 $option_id = $sql['option_id'];
1165 unset($sql['lang_id'], $sql['field_id'], $sql['option_id']);
1166
1167 $this->update_insert(PROFILE_FIELDS_LANG_TABLE, $sql, array(
1168 'lang_id' => $lang_id,
1169 'field_id' => $field_id,
1170 'option_id' => $option_id)
1171 );
1172 }
1173 }
1174 }
1175
1176 $db->sql_transaction('begin');
1177
1178 if ($action == 'create')
1179 {
1180 foreach ($profile_sql as $sql)
1181 {
1182 $db->sql_query($sql);
1183 }
1184 }
1185
1186 $db->sql_transaction('commit');
1187
1188 if ($action == 'edit')
1189 {
1190 $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_EDIT', false, array($cp->vars['field_ident'] . ':' . $cp->vars['lang_name']));
1191 trigger_error($user->lang['CHANGED_PROFILE_FIELD'] . adm_back_link($this->u_action));
1192 }
1193 else
1194 {
1195 $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_CREATE', false, array(substr($field_ident, 3) . ':' . $cp->vars['lang_name']));
1196 trigger_error($user->lang['ADDED_PROFILE_FIELD'] . adm_back_link($this->u_action));
1197 }
1198 }
1199
1200 /**
1201 * Update, then insert if not successfull
1202 */
1203 function update_insert($table, $sql_ary, $where_fields)
1204 {
1205 global $db;
1206
1207 $where_sql = array();
1208 $check_key = '';
1209
1210 foreach ($where_fields as $key => $value)
1211 {
1212 $check_key = (!$check_key) ? $key : $check_key;
1213 $where_sql[] = $key . ' = ' . ((is_string($value)) ? "'" . $db->sql_escape($value) . "'" : (int) $value);
1214 }
1215
1216 if (!sizeof($where_sql))
1217 {
1218 return;
1219 }
1220
1221 $sql = "SELECT $check_key
1222 FROM $table
1223 WHERE " . implode(' AND ', $where_sql);
1224 $result = $db->sql_query($sql);
1225 $row = $db->sql_fetchrow($result);
1226 $db->sql_freeresult($result);
1227
1228 if (!$row)
1229 {
1230 $sql_ary = array_merge($where_fields, $sql_ary);
1231
1232 if (sizeof($sql_ary))
1233 {
1234 $db->sql_query("INSERT INTO $table " . $db->sql_build_array('INSERT', $sql_ary));
1235 }
1236 }
1237 else
1238 {
1239 if (sizeof($sql_ary))
1240 {
1241 $sql = "UPDATE $table SET " . $db->sql_build_array('UPDATE', $sql_ary) . '
1242 WHERE ' . implode(' AND ', $where_sql);
1243 $db->sql_query($sql);
1244 }
1245 }
1246 }
1247 }
1248