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