Merge remote-tracking branch 'github-nickvergessen/ticket/11201' into develop

* github-nickvergessen/ticket/11201: (50 commits)
  [ticket/11201] Remove empty calls section from .yml
  [ticket/11201] Split template file into multiple files
  [ticket/11201] Remove dependency from types on the manager
  [ticket/11201] Rename profilefields class to manager
  [ticket/11201] Fix parameter description
  [ticket/11201] Use !== null, its faster
  [ticket/11201] Also translate profile fields in UCP and ACP
  [ticket/11201] Add parameters and variables to profile field class
  [ticket/11201] Add commas on last array entry
  [ticket/11201] Allow translation of profile field name and explanation
  [ticket/11201] Fix some variable names
  [ticket/11201] Add tables to constructor in tests
  [ticket/11201] Add a method to return the translated full name of the type
  [ticket/11201] Remove db depending code from field class
  [ticket/11201] Add variables to classes and add constructor doc blocks
  [ticket/11201] Update copyright in class file
  [ticket/11201] Add visibility and remove unused variable
  [ticket/11201] Add some commas at the last array entry
  [ticket/11201] Cast some variables to integer
  [ticket/11201] Inject table names rather then using constants
  ...

Conflicts:
	phpBB/config/services.yml
This commit is contained in:
Nils Adermann 2014-02-02 16:34:55 +01:00
commit 38af79dd30
42 changed files with 3021 additions and 1811 deletions

View file

@ -0,0 +1,82 @@
services:
profilefields.manager:
class: phpbb\profilefields\manager
arguments:
- @auth
- @dbal.conn
- @request
- @template
- @profilefields.type_collection
- @user
- %tables.profile_fields%
- %tables.profile_fields_language%
- %tables.profile_fields_data%
profilefields.lang_helper:
class: phpbb\profilefields\lang_helper
arguments:
- @dbal.conn
- %tables.profile_fields_options_language%
profilefields.type_collection:
class: phpbb\di\service_collection
arguments:
- @service_container
tags:
- { name: service_collection, tag: profilefield.type }
profilefields.type.bool:
class: phpbb\profilefields\type\type_bool
arguments:
- @profilefields.lang_helper
- @request
- @template
- @user
tags:
- { name: profilefield.type }
profilefields.type.date:
class: phpbb\profilefields\type\type_date
arguments:
- @request
- @template
- @user
tags:
- { name: profilefield.type }
profilefields.type.dropdown:
class: phpbb\profilefields\type\type_dropdown
arguments:
- @profilefields.lang_helper
- @request
- @template
- @user
tags:
- { name: profilefield.type }
profilefields.type.int:
class: phpbb\profilefields\type\type_int
arguments:
- @request
- @template
- @user
tags:
- { name: profilefield.type }
profilefields.type.string:
class: phpbb\profilefields\type\type_string
arguments:
- @request
- @template
- @user
tags:
- { name: profilefield.type }
profilefields.type.text:
class: phpbb\profilefields\type\type_text
arguments:
- @request
- @template
- @user
tags:
- { name: profilefield.type }

View file

@ -9,6 +9,7 @@ imports:
- { resource: console.yml } - { resource: console.yml }
- { resource: mimetype_guessers.yml } - { resource: mimetype_guessers.yml }
- { resource: passwords.yml } - { resource: passwords.yml }
- { resource: profilefields.yml }
services: services:
acl.permissions: acl.permissions:

View file

@ -10,6 +10,10 @@ parameters:
tables.modules: %core.table_prefix%modules tables.modules: %core.table_prefix%modules
tables.notification_types: %core.table_prefix%notification_types tables.notification_types: %core.table_prefix%notification_types
tables.notifications: %core.table_prefix%notifications tables.notifications: %core.table_prefix%notifications
tables.profile_fields: %core.table_prefix%profile_fields
tables.profile_fields_data: %core.table_prefix%profile_fields_data
tables.profile_fields_options_language: %core.table_prefix%profile_fields_lang
tables.profile_fields_language: %core.table_prefix%profile_lang
tables.posts: %core.table_prefix%posts tables.posts: %core.table_prefix%posts
tables.topics: %core.table_prefix%topics tables.topics: %core.table_prefix%topics
tables.user_notifications: %core.table_prefix%user_notifications tables.user_notifications: %core.table_prefix%user_notifications

View file

@ -24,16 +24,16 @@ class acp_profile
var $edit_lang_id; var $edit_lang_id;
var $lang_defs; var $lang_defs;
protected $type_collection;
function main($id, $mode) function main($id, $mode)
{ {
global $config, $db, $user, $auth, $template, $cache; global $config, $db, $user, $auth, $template, $cache;
global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix; global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
global $request; global $request, $phpbb_container;
include($phpbb_root_path . 'includes/functions_posting.' . $phpEx); include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
include($phpbb_root_path . 'includes/functions_user.' . $phpEx); include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
$user->add_lang(array('ucp', 'acp/profile')); $user->add_lang(array('ucp', 'acp/profile'));
$this->tpl_name = 'acp_profile'; $this->tpl_name = 'acp_profile';
@ -50,17 +50,8 @@ class acp_profile
trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
// Define some default values for each field type $cp = $phpbb_container->get('profilefields.manager');
$default_values = array( $this->type_collection = $phpbb_container->get('profilefields.type_collection');
FIELD_STRING => array('field_length' => 10, 'field_minlen' => 0, 'field_maxlen' => 20, 'field_validation' => '.*', 'field_novalue' => '', 'field_default_value' => ''),
FIELD_TEXT => array('field_length' => '5|80', 'field_minlen' => 0, 'field_maxlen' => 1000, 'field_validation' => '.*', 'field_novalue' => '', 'field_default_value' => ''),
FIELD_INT => array('field_length' => 5, 'field_minlen' => 0, 'field_maxlen' => 100, 'field_validation' => '', 'field_novalue' => 0, 'field_default_value' => 0),
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'),
FIELD_BOOL => array('field_length' => 1, 'field_minlen' => 0, 'field_maxlen' => 0, 'field_validation' => '', 'field_novalue' => 0, 'field_default_value' => 0),
FIELD_DROPDOWN => array('field_length' => 0, 'field_minlen' => 0, 'field_maxlen' => 5, 'field_validation' => '', 'field_novalue' => 0, 'field_default_value' => 0),
);
$cp = new custom_profile_admin();
// Build Language array // Build Language array
// Based on this, we decide which elements need to be edited later and which language items are missing // Based on this, we decide which elements need to be edited later and which language items are missing
@ -94,10 +85,10 @@ class acp_profile
// Have some fields been defined? // Have some fields been defined?
if (isset($this->lang_defs['entry'])) if (isset($this->lang_defs['entry']))
{ {
foreach ($this->lang_defs['entry'] as $field_id => $field_ary) foreach ($this->lang_defs['entry'] as $field_ident => $field_ary)
{ {
// Fill an array with the languages that are missing for each field // Fill an array with the languages that are missing for each field
$this->lang_defs['diff'][$field_id] = array_diff(array_values($this->lang_defs['iso']), $field_ary); $this->lang_defs['diff'][$field_ident] = array_diff(array_values($this->lang_defs['iso']), $field_ary);
} }
} }
@ -352,6 +343,7 @@ class acp_profile
$this->edit_lang_id = $field_row['lang_id']; $this->edit_lang_id = $field_row['lang_id'];
} }
$field_type = $field_row['field_type']; $field_type = $field_row['field_type'];
$profile_field = $this->type_collection[$field_type];
// Get language entries // Get language entries
$sql = 'SELECT * $sql = 'SELECT *
@ -375,14 +367,15 @@ class acp_profile
// We are adding a new field, define basic params // We are adding a new field, define basic params
$lang_options = $field_row = array(); $lang_options = $field_row = array();
$field_type = request_var('field_type', 0); $field_type = request_var('field_type', '');
if (!$field_type) if (!isset($this->type_collection[$field_type]))
{ {
trigger_error($user->lang['NO_FIELD_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['NO_FIELD_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
$field_row = array_merge($default_values[$field_type], array( $profile_field = $this->type_collection[$field_type];
$field_row = array_merge($profile_field->get_default_option_values(), array(
'field_ident' => str_replace(' ', '_', utf8_clean_string(request_var('field_ident', '', true))), 'field_ident' => str_replace(' ', '_', utf8_clean_string(request_var('field_ident', '', true))),
'field_required' => 0, 'field_required' => 0,
'field_show_novalue'=> 0, 'field_show_novalue'=> 0,
@ -407,23 +400,6 @@ class acp_profile
3 => array('l_lang_name', 'l_lang_explain', 'l_lang_default_value', 'l_lang_options') 3 => array('l_lang_name', 'l_lang_explain', 'l_lang_default_value', 'l_lang_options')
); );
// Text-based fields require the lang_default_value to be excluded
if ($field_type == FIELD_STRING || $field_type == FIELD_TEXT)
{
$exclude[1][] = 'lang_default_value';
}
// option-specific fields require lang_options to be excluded
if ($field_type == FIELD_BOOL || $field_type == FIELD_DROPDOWN)
{
$exclude[1][] = 'lang_options';
}
$cp->vars['field_ident'] = ($action == 'create' && $step == 1) ? utf8_clean_string(request_var('field_ident', $field_row['field_ident'], true)) : request_var('field_ident', $field_row['field_ident']);
$cp->vars['lang_name'] = utf8_normalize_nfc(request_var('lang_name', $field_row['lang_name'], true));
$cp->vars['lang_explain'] = utf8_normalize_nfc(request_var('lang_explain', $field_row['lang_explain'], true));
$cp->vars['lang_default_value'] = utf8_normalize_nfc(request_var('lang_default_value', $field_row['lang_default_value'], true));
// Visibility Options... // Visibility Options...
$visibility_ary = array( $visibility_ary = array(
'field_required', 'field_required',
@ -435,6 +411,13 @@ class acp_profile
'field_hide', 'field_hide',
); );
$options = $profile_field->prepare_options_form($exclude, $visibility_ary);
$cp->vars['field_ident'] = ($action == 'create' && $step == 1) ? utf8_clean_string(request_var('field_ident', $field_row['field_ident'], true)) : request_var('field_ident', $field_row['field_ident']);
$cp->vars['lang_name'] = utf8_normalize_nfc(request_var('lang_name', $field_row['lang_name'], true));
$cp->vars['lang_explain'] = utf8_normalize_nfc(request_var('lang_explain', $field_row['lang_explain'], true));
$cp->vars['lang_default_value'] = utf8_normalize_nfc(request_var('lang_default_value', $field_row['lang_default_value'], true));
foreach ($visibility_ary as $val) foreach ($visibility_ary as $val)
{ {
$cp->vars[$val] = ($submit || $save) ? request_var($val, 0) : $field_row[$val]; $cp->vars[$val] = ($submit || $save) ? request_var($val, 0) : $field_row[$val];
@ -442,16 +425,6 @@ class acp_profile
$cp->vars['field_no_view'] = request_var('field_no_view', (int) $field_row['field_no_view']); $cp->vars['field_no_view'] = request_var('field_no_view', (int) $field_row['field_no_view']);
// A boolean field expects an array as the lang options
if ($field_type == FIELD_BOOL)
{
$options = utf8_normalize_nfc(request_var('lang_options', array(''), true));
}
else
{
$options = utf8_normalize_nfc(request_var('lang_options', '', true));
}
// If the user has submitted a form with options (i.e. dropdown field) // If the user has submitted a form with options (i.e. dropdown field)
if ($options) if ($options)
{ {
@ -479,93 +452,9 @@ class acp_profile
{ {
$var = utf8_normalize_nfc(request_var($key, $field_row[$key], true)); $var = utf8_normalize_nfc(request_var($key, $field_row[$key], true));
// Manipulate the intended variables a little bit if needed $field_data = $cp->vars;
if ($field_type == FIELD_DROPDOWN && $key == 'field_maxlen') $var = $profile_field->get_excluded_options($key, $action, $var, $field_data, 2);
{ $cp->vars = $field_data;
// Get the number of options if this key is 'field_maxlen'
$var = sizeof(explode("\n", utf8_normalize_nfc(request_var('lang_options', '', true))));
}
else if ($field_type == FIELD_TEXT && $key == 'field_length')
{
if (isset($_REQUEST['rows']))
{
$cp->vars['rows'] = request_var('rows', 0);
$cp->vars['columns'] = request_var('columns', 0);
$var = $cp->vars['rows'] . '|' . $cp->vars['columns'];
}
else
{
$row_col = explode('|', $var);
$cp->vars['rows'] = $row_col[0];
$cp->vars['columns'] = $row_col[1];
}
}
else if ($field_type == FIELD_DATE && $key == 'field_default_value')
{
$always_now = request_var('always_now', -1);
if ($always_now == 1 || ($always_now === -1 && $var == 'now'))
{
$now = getdate();
$cp->vars['field_default_value_day'] = $now['mday'];
$cp->vars['field_default_value_month'] = $now['mon'];
$cp->vars['field_default_value_year'] = $now['year'];
$var = 'now';
$request->overwrite('field_default_value', $var, \phpbb\request\request_interface::POST);
}
else
{
if (isset($_REQUEST['field_default_value_day']))
{
$cp->vars['field_default_value_day'] = request_var('field_default_value_day', 0);
$cp->vars['field_default_value_month'] = request_var('field_default_value_month', 0);
$cp->vars['field_default_value_year'] = request_var('field_default_value_year', 0);
$var = sprintf('%2d-%2d-%4d', $cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']);
$request->overwrite('field_default_value', $var, \phpbb\request\request_interface::POST);
}
else
{
list($cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']) = explode('-', $var);
}
}
}
else if ($field_type == FIELD_BOOL && $key == 'field_default_value')
{
// 'field_length' == 1 defines radio buttons. Possible values are 1 or 2 only.
// 'field_length' == 2 defines checkbox. Possible values are 0 or 1 only.
// If we switch the type on step 2, we have to adjust field value.
// 1 is a common value for the checkbox and radio buttons.
// Adjust unchecked checkbox value.
// If we return or save settings from 2nd/3rd page
// and the checkbox is unchecked, set the value to 0.
if (isset($_REQUEST['step']) && !isset($_REQUEST[$key]))
{
$var = 0;
}
// If we switch to the checkbox type but former radio buttons value was 2,
// which is not the case for the checkbox, set it to 0 (unchecked).
if ($cp->vars['field_length'] == 2 && $var == 2)
{
$var = 0;
}
// If we switch to the radio buttons but the former checkbox value was 0,
// which is not the case for the radio buttons, set it to 0.
else if ($cp->vars['field_length'] == 1 && $var == 0)
{
$var = 2;
}
}
else if ($field_type == FIELD_INT && $key == 'field_default_value')
{
// Permit an empty string
if ($action == 'create' && request_var('field_default_value', '') === '')
{
$var = '';
}
}
$cp->vars[$key] = $var; $cp->vars[$key] = $var;
} }
@ -614,18 +503,10 @@ class acp_profile
{ {
$cp->vars[$key] = $$key; $cp->vars[$key] = $$key;
} }
else if ($key == 'l_lang_options' && $field_type == FIELD_BOOL)
{
$cp->vars[$key] = utf8_normalize_nfc(request_var($key, array(0 => array('')), true));
}
else if ($key == 'l_lang_options' && is_array($cp->vars[$key]))
{
foreach ($cp->vars[$key] as $lang_id => $options)
{
$cp->vars[$key][$lang_id] = explode("\n", $options);
}
} $field_data = $cp->vars;
$var = $profile_field->get_excluded_options($key, $action, $var, $field_data, 3);
$cp->vars = $field_data;
} }
// Check for general issues in every step // Check for general issues in every step
@ -652,15 +533,7 @@ class acp_profile
$error[] = $user->lang['EMPTY_USER_FIELD_NAME']; $error[] = $user->lang['EMPTY_USER_FIELD_NAME'];
} }
if ($field_type == FIELD_DROPDOWN && !sizeof($cp->vars['lang_options'])) $error = $profile_field->validate_options_on_submit($error, $cp->vars);
{
$error[] = $user->lang['NO_FIELD_ENTRIES'];
}
if ($field_type == FIELD_BOOL && (empty($cp->vars['lang_options'][0]) || empty($cp->vars['lang_options'][1])))
{
$error[] = $user->lang['NO_FIELD_ENTRIES'];
}
// Check for already existing field ident // Check for already existing field ident
if ($action != 'edit') if ($action != 'edit')
@ -697,54 +570,16 @@ class acp_profile
$_new_key_ary = array(); $_new_key_ary = array();
$field_data = $cp->vars;
foreach ($key_ary as $key) foreach ($key_ary as $key)
{ {
if ($field_type == FIELD_TEXT && $key == 'field_length' && isset($_REQUEST['rows'])) $var = $profile_field->prepare_hidden_fields($step, $key, $action, $field_data);
if ($var !== null)
{ {
$cp->vars['rows'] = request_var('rows', 0); $_new_key_ary[$key] = $profile_field->prepare_hidden_fields($step, $key, $action, $field_data);
$cp->vars['columns'] = request_var('columns', 0);
$_new_key_ary[$key] = $cp->vars['rows'] . '|' . $cp->vars['columns'];
}
else if ($field_type == FIELD_DATE && $key == 'field_default_value')
{
$always_now = request_var('always_now', 0);
if ($always_now)
{
$_new_key_ary[$key] = 'now';
}
else if (isset($_REQUEST['field_default_value_day']))
{
$cp->vars['field_default_value_day'] = request_var('field_default_value_day', 0);
$cp->vars['field_default_value_month'] = request_var('field_default_value_month', 0);
$cp->vars['field_default_value_year'] = request_var('field_default_value_year', 0);
$_new_key_ary[$key] = sprintf('%2d-%2d-%4d', $cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']);
}
}
else if ($field_type == FIELD_BOOL && $key == 'l_lang_options' && isset($_REQUEST['l_lang_options']))
{
$_new_key_ary[$key] = utf8_normalize_nfc(request_var($key, array(array('')), true));
}
else if ($field_type == FIELD_BOOL && $key == 'field_default_value')
{
$_new_key_ary[$key] = request_var($key, $cp->vars[$key]);
}
else
{
if (!isset($_REQUEST[$key]))
{
$var = false;
}
else if ($key == 'field_ident' && isset($cp->vars[$key]))
{
$_new_key_ary[$key]= $cp->vars[$key];
}
else
{
$_new_key_ary[$key] = ($field_type == FIELD_BOOL && $key == 'lang_options') ? utf8_normalize_nfc(request_var($key, array(''), true)) : utf8_normalize_nfc(request_var($key, '', true));
}
} }
} }
$cp->vars = $field_data;
$s_hidden_fields .= build_hidden_fields($_new_key_ary); $s_hidden_fields .= build_hidden_fields($_new_key_ary);
} }
@ -778,9 +613,7 @@ class acp_profile
{ {
// Create basic options - only small differences between field types // Create basic options - only small differences between field types
case 1: case 1:
$template_vars = array(
// Build common create options
$template->assign_vars(array(
'S_STEP_ONE' => true, 'S_STEP_ONE' => true,
'S_FIELD_REQUIRED' => ($cp->vars['field_required']) ? true : false, 'S_FIELD_REQUIRED' => ($cp->vars['field_required']) ? true : false,
'S_FIELD_SHOW_NOVALUE'=> ($cp->vars['field_show_novalue']) ? true : false, 'S_FIELD_SHOW_NOVALUE'=> ($cp->vars['field_show_novalue']) ? true : false,
@ -792,53 +625,18 @@ class acp_profile
'S_FIELD_NO_VIEW' => ($cp->vars['field_no_view']) ? true : false, 'S_FIELD_NO_VIEW' => ($cp->vars['field_no_view']) ? true : false,
'L_LANG_SPECIFIC' => sprintf($user->lang['LANG_SPECIFIC_OPTIONS'], $config['default_lang']), 'L_LANG_SPECIFIC' => sprintf($user->lang['LANG_SPECIFIC_OPTIONS'], $config['default_lang']),
'FIELD_TYPE' => $user->lang['FIELD_' . strtoupper($cp->profile_types[$field_type])], 'FIELD_TYPE' => $profile_field->get_name(),
'FIELD_IDENT' => $cp->vars['field_ident'], 'FIELD_IDENT' => $cp->vars['field_ident'],
'LANG_NAME' => $cp->vars['lang_name'], 'LANG_NAME' => $cp->vars['lang_name'],
'LANG_EXPLAIN' => $cp->vars['lang_explain']) 'LANG_EXPLAIN' => $cp->vars['lang_explain'],
); );
// String and Text needs to set default values here... $field_data = $cp->vars;
if ($field_type == FIELD_STRING || $field_type == FIELD_TEXT) $profile_field->display_options($template_vars, $field_data);
{ $cp->vars = $field_data;
$template->assign_vars(array(
'S_TEXT' => ($field_type == FIELD_TEXT) ? true : false,
'S_STRING' => ($field_type == FIELD_STRING) ? true : false,
'L_DEFAULT_VALUE_EXPLAIN' => $user->lang[strtoupper($cp->profile_types[$field_type]) . '_DEFAULT_VALUE_EXPLAIN'],
'LANG_DEFAULT_VALUE' => $cp->vars['lang_default_value'])
);
}
if ($field_type == FIELD_BOOL || $field_type == FIELD_DROPDOWN)
{
// Initialize these array elements if we are creating a new field
if (!sizeof($cp->vars['lang_options']))
{
if ($field_type == FIELD_BOOL)
{
// No options have been defined for a boolean field.
$cp->vars['lang_options'][0] = '';
$cp->vars['lang_options'][1] = '';
}
else
{
// No options have been defined for the dropdown menu
$cp->vars['lang_options'] = array();
}
}
$template->assign_vars(array(
'S_BOOL' => ($field_type == FIELD_BOOL) ? true : false,
'S_DROPDOWN' => ($field_type == FIELD_DROPDOWN) ? true : false,
'L_LANG_OPTIONS_EXPLAIN' => $user->lang[strtoupper($cp->profile_types[$field_type]) . '_ENTRIES_EXPLAIN'],
'LANG_OPTIONS' => ($field_type == FIELD_DROPDOWN) ? implode("\n", $cp->vars['lang_options']) : '',
'FIRST_LANG_OPTION' => ($field_type == FIELD_BOOL) ? $cp->vars['lang_options'][0] : '',
'SECOND_LANG_OPTION' => ($field_type == FIELD_BOOL) ? $cp->vars['lang_options'][1] : '')
);
}
// Build common create options
$template->assign_vars($template_vars);
break; break;
case 2: case 2:
@ -849,8 +647,7 @@ class acp_profile
); );
// Build options based on profile type // Build options based on profile type
$function = 'get_' . $cp->profile_types[$field_type] . '_options'; $options = $profile_field->get_options($this->lang_defs['iso'][$config['default_lang']], $cp->vars);
$options = $cp->$function();
foreach ($options as $num => $option_ary) foreach ($options as $num => $option_ary)
{ {
@ -912,9 +709,10 @@ class acp_profile
$s_one_need_edit = true; $s_one_need_edit = true;
} }
$profile_field = $this->type_collection[$row['field_type']];
$template->assign_block_vars('fields', array( $template->assign_block_vars('fields', array(
'FIELD_IDENT' => $row['field_ident'], 'FIELD_IDENT' => $row['field_ident'],
'FIELD_TYPE' => $user->lang['FIELD_' . strtoupper($cp->profile_types[$row['field_type']])], 'FIELD_TYPE' => $profile_field->get_name(),
'L_ACTIVATE_DEACTIVATE' => $user->lang[$active_lang], 'L_ACTIVATE_DEACTIVATE' => $user->lang[$active_lang],
'U_ACTIVATE_DEACTIVATE' => $this->u_action . "&action=$active_value&field_id=$id", 'U_ACTIVATE_DEACTIVATE' => $this->u_action . "&action=$active_value&field_id=$id",
@ -936,15 +734,15 @@ class acp_profile
} }
$s_select_type = ''; $s_select_type = '';
foreach ($cp->profile_types as $key => $value) foreach ($this->type_collection as $key => $profile_field)
{ {
$s_select_type .= '<option value="' . $key . '">' . $user->lang['FIELD_' . strtoupper($value)] . '</option>'; $s_select_type .= '<option value="' . $key . '">' . $profile_field->get_name() . '</option>';
} }
$template->assign_vars(array( $template->assign_vars(array(
'U_ACTION' => $this->u_action, 'U_ACTION' => $this->u_action,
'S_TYPE_OPTIONS' => $s_select_type) 'S_TYPE_OPTIONS' => $s_select_type,
); ));
} }
/** /**
@ -952,7 +750,7 @@ class acp_profile
*/ */
function build_language_options(&$cp, $field_type, $action = 'create') function build_language_options(&$cp, $field_type, $action = 'create')
{ {
global $user, $config, $db; global $user, $config, $db, $phpbb_container;
$default_lang_id = (!empty($this->edit_lang_id)) ? $this->edit_lang_id : $this->lang_defs['iso'][$config['default_lang']]; $default_lang_id = (!empty($this->edit_lang_id)) ? $this->edit_lang_id : $this->lang_defs['iso'][$config['default_lang']];
@ -969,31 +767,8 @@ class acp_profile
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$options = array(); $profile_field = $this->type_collection[$field_type];
$options['lang_name'] = 'string'; $options = $profile_field->get_language_options($cp->vars);
if ($cp->vars['lang_explain'])
{
$options['lang_explain'] = 'text';
}
switch ($field_type)
{
case FIELD_BOOL:
$options['lang_options'] = 'two_options';
break;
case FIELD_DROPDOWN:
$options['lang_options'] = 'optionfield';
break;
case FIELD_TEXT:
case FIELD_STRING:
if (strlen($cp->vars['lang_default_value']))
{
$options['lang_default_value'] = ($field_type == FIELD_STRING) ? 'string' : 'text';
}
break;
}
$lang_options = array(); $lang_options = array();
@ -1072,7 +847,7 @@ class acp_profile
*/ */
function save_profile_field(&$cp, $field_type, $action = 'create') function save_profile_field(&$cp, $field_type, $action = 'create')
{ {
global $db, $config, $user; global $db, $config, $user, $phpbb_container;
$field_id = request_var('field_id', 0); $field_id = request_var('field_id', 0);
@ -1133,10 +908,16 @@ class acp_profile
$db->sql_query($sql); $db->sql_query($sql);
} }
$profile_field = $this->type_collection[$field_type];
if ($action == 'create') if ($action == 'create')
{ {
$field_ident = 'pf_' . $field_ident; $field_ident = 'pf_' . $field_ident;
$profile_sql[] = $this->add_field_ident($field_ident, $field_type);
$db_tools = $phpbb_container->get('dbal.tools');
list($sql_type, $null) = $db_tools->get_column_type($profile_field->get_database_column_type());
$profile_sql[] = $this->add_field_ident($field_ident, $sql_type);
} }
$sql_ary = array( $sql_ary = array(
@ -1190,23 +971,7 @@ class acp_profile
} }
} }
// These are always arrays because the key is the language id... $cp->vars = $profile_field->get_language_options_input($cp->vars);
$cp->vars['l_lang_name'] = utf8_normalize_nfc(request_var('l_lang_name', array(0 => ''), true));
$cp->vars['l_lang_explain'] = utf8_normalize_nfc(request_var('l_lang_explain', array(0 => ''), true));
$cp->vars['l_lang_default_value'] = utf8_normalize_nfc(request_var('l_lang_default_value', array(0 => ''), true));
if ($field_type != FIELD_BOOL)
{
$cp->vars['l_lang_options'] = utf8_normalize_nfc(request_var('l_lang_options', array(0 => ''), true));
}
else
{
/**
* @todo check if this line is correct...
$cp->vars['l_lang_default_value'] = request_var('l_lang_default_value', array(0 => array('')), true);
*/
$cp->vars['l_lang_options'] = utf8_normalize_nfc(request_var('l_lang_options', array(0 => array('')), true));
}
if ($cp->vars['lang_options']) if ($cp->vars['lang_options'])
{ {
@ -1226,7 +991,7 @@ class acp_profile
foreach ($cp->vars['lang_options'] as $option_id => $value) foreach ($cp->vars['lang_options'] as $option_id => $value)
{ {
$sql_ary = array( $sql_ary = array(
'field_type' => (int) $field_type, 'field_type' => $field_type,
'lang_value' => $value 'lang_value' => $value
); );
@ -1281,7 +1046,7 @@ class acp_profile
'field_id' => (int) $field_id, 'field_id' => (int) $field_id,
'lang_id' => (int) $lang_id, 'lang_id' => (int) $lang_id,
'option_id' => (int) $option_id, 'option_id' => (int) $option_id,
'field_type' => (int) $field_type, 'field_type' => $field_type,
'lang_value' => $value 'lang_value' => $value
); );
} }
@ -1411,7 +1176,7 @@ class acp_profile
/** /**
* Return sql statement for adding a new field ident (profile field) to the profile fields data table * Return sql statement for adding a new field ident (profile field) to the profile fields data table
*/ */
function add_field_ident($field_ident, $field_type) function add_field_ident($field_ident, $sql_type)
{ {
global $db; global $db;
@ -1420,73 +1185,11 @@ class acp_profile
case 'mysql': case 'mysql':
case 'mysql4': case 'mysql4':
case 'mysqli': case 'mysqli':
$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD `$field_ident` " . $sql_type;
// We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD `$field_ident` ";
switch ($field_type)
{
case FIELD_STRING:
$sql .= ' VARCHAR(255) ';
break;
case FIELD_DATE:
$sql .= 'VARCHAR(10) ';
break;
case FIELD_TEXT:
$sql .= "TEXT";
// ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
// ADD {$field_ident}_bbcode_bitfield INT(11) UNSIGNED";
break;
case FIELD_BOOL:
$sql .= 'TINYINT(2) ';
break;
case FIELD_DROPDOWN:
$sql .= 'MEDIUMINT(8) ';
break;
case FIELD_INT:
$sql .= 'BIGINT(20) ';
break;
}
break; break;
case 'sqlite': case 'sqlite':
switch ($field_type)
{
case FIELD_STRING:
$type = ' VARCHAR(255) ';
break;
case FIELD_DATE:
$type = 'VARCHAR(10) ';
break;
case FIELD_TEXT:
$type = "TEXT(65535)";
// ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
// ADD {$field_ident}_bbcode_bitfield INT(11) UNSIGNED";
break;
case FIELD_BOOL:
$type = 'TINYINT(2) ';
break;
case FIELD_DROPDOWN:
$type = 'MEDIUMINT(8) ';
break;
case FIELD_INT:
$type = 'BIGINT(20) ';
break;
}
// We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
if (version_compare(sqlite_libversion(), '3.0') == -1) if (version_compare(sqlite_libversion(), '3.0') == -1)
{ {
$sql = "SELECT sql $sql = "SELECT sql
@ -1521,7 +1224,7 @@ class acp_profile
$columns = implode(',', $column_list); $columns = implode(',', $column_list);
$new_table_cols = $field_ident . ' ' . $type . ',' . $new_table_cols; $new_table_cols = $field_ident . ' ' . $sql_type . ',' . $new_table_cols;
// create a new table and fill it up. destroy the temp one // create a new table and fill it up. destroy the temp one
$db->sql_query('CREATE TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $new_table_cols . ');'); $db->sql_query('CREATE TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $new_table_cols . ');');
@ -1530,7 +1233,7 @@ class acp_profile
} }
else else
{ {
$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident [$type]"; $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident [$sql_type]";
} }
break; break;
@ -1538,140 +1241,22 @@ class acp_profile
case 'mssql': case 'mssql':
case 'mssql_odbc': case 'mssql_odbc':
case 'mssqlnative': case 'mssqlnative':
$sql = 'ALTER TABLE [' . PROFILE_FIELDS_DATA_TABLE . "] ADD [$field_ident] " . $sql_type;
// We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
$sql = 'ALTER TABLE [' . PROFILE_FIELDS_DATA_TABLE . "] ADD [$field_ident] ";
switch ($field_type)
{
case FIELD_STRING:
$sql .= ' [VARCHAR] (255) ';
break;
case FIELD_DATE:
$sql .= '[VARCHAR] (10) ';
break;
case FIELD_TEXT:
$sql .= "[TEXT]";
// ADD {$field_ident}_bbcode_uid [VARCHAR] (5) NOT NULL,
// ADD {$field_ident}_bbcode_bitfield [INT] UNSIGNED";
break;
case FIELD_BOOL:
case FIELD_DROPDOWN:
$sql .= '[INT] ';
break;
case FIELD_INT:
$sql .= '[FLOAT] ';
break;
}
break; break;
case 'postgres': case 'postgres':
$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD COLUMN \"$field_ident\" " . $sql_type;
// We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD COLUMN \"$field_ident\" ";
switch ($field_type)
{
case FIELD_STRING:
$sql .= ' VARCHAR(255) ';
break;
case FIELD_DATE:
$sql .= 'VARCHAR(10) ';
break;
case FIELD_TEXT:
$sql .= "TEXT";
// ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
// ADD {$field_ident}_bbcode_bitfield INT4 UNSIGNED";
break;
case FIELD_BOOL:
$sql .= 'INT2 ';
break;
case FIELD_DROPDOWN:
$sql .= 'INT4 ';
break;
case FIELD_INT:
$sql .= 'INT8 ';
break;
}
break; break;
case 'firebird': case 'firebird':
$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' ADD "' . strtoupper($field_ident) . '" ' . $sql_type;
// We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' ADD "' . strtoupper($field_ident) . '" ';
switch ($field_type)
{
case FIELD_STRING:
$sql .= ' VARCHAR(255) ';
break;
case FIELD_DATE:
$sql .= 'VARCHAR(10) ';
break;
case FIELD_TEXT:
$sql .= "BLOB SUB_TYPE TEXT";
// ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL,
// ADD {$field_ident}_bbcode_bitfield INTEGER UNSIGNED";
break;
case FIELD_BOOL:
case FIELD_DROPDOWN:
$sql .= 'INTEGER ';
break;
case FIELD_INT:
$sql .= 'DOUBLE PRECISION ';
break;
}
break; break;
case 'oracle': case 'oracle':
$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident " . $sql_type;
// We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident ";
switch ($field_type)
{
case FIELD_STRING:
$sql .= ' VARCHAR2(255) ';
break;
case FIELD_DATE:
$sql .= 'VARCHAR2(10) ';
break;
case FIELD_TEXT:
$sql .= "CLOB";
// ADD {$field_ident}_bbcode_uid VARCHAR2(5) NOT NULL,
// ADD {$field_ident}_bbcode_bitfield NUMBER(11) UNSIGNED";
break;
case FIELD_BOOL:
$sql .= 'NUMBER(2) ';
break;
case FIELD_DROPDOWN:
$sql .= 'NUMBER(8) ';
break;
case FIELD_INT:
$sql .= 'NUMBER(20) ';
break;
}
break; break;
} }

View file

@ -1346,9 +1346,8 @@ class acp_users
case 'profile': case 'profile':
include($phpbb_root_path . 'includes/functions_user.' . $phpEx); include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
$cp = new custom_profile(); $cp = $phpbb_container->get('profilefields.manager');
$cp_data = $cp_error = array(); $cp_data = $cp_error = array();

View file

@ -758,7 +758,7 @@ $schema_data['phpbb_profile_fields'] = array(
'COLUMNS' => array( 'COLUMNS' => array(
'field_id' => array('UINT', NULL, 'auto_increment'), 'field_id' => array('UINT', NULL, 'auto_increment'),
'field_name' => array('VCHAR_UNI', ''), 'field_name' => array('VCHAR_UNI', ''),
'field_type' => array('TINT:4', 0), 'field_type' => array('VCHAR:100', ''),
'field_ident' => array('VCHAR:20', ''), 'field_ident' => array('VCHAR:20', ''),
'field_length' => array('VCHAR:20', ''), 'field_length' => array('VCHAR:20', ''),
'field_minlen' => array('VCHAR', ''), 'field_minlen' => array('VCHAR', ''),
@ -796,7 +796,7 @@ $schema_data['phpbb_profile_fields_lang'] = array(
'field_id' => array('UINT', 0), 'field_id' => array('UINT', 0),
'lang_id' => array('UINT', 0), 'lang_id' => array('UINT', 0),
'option_id' => array('UINT', 0), 'option_id' => array('UINT', 0),
'field_type' => array('TINT:4', 0), 'field_type' => array('VCHAR:100', ''),
'lang_value' => array('VCHAR_UNI', ''), 'lang_value' => array('VCHAR_UNI', ''),
), ),
'PRIMARY_KEY' => array('field_id', 'lang_id', 'option_id'), 'PRIMARY_KEY' => array('field_id', 'lang_id', 'option_id'),

File diff suppressed because it is too large Load diff

View file

@ -162,7 +162,7 @@ function user_update_name($old_name, $new_name)
function user_add($user_row, $cp_data = false) function user_add($user_row, $cp_data = false)
{ {
global $db, $user, $auth, $config, $phpbb_root_path, $phpEx; global $db, $user, $auth, $config, $phpbb_root_path, $phpEx;
global $phpbb_dispatcher; global $phpbb_dispatcher, $phpbb_container;
if (empty($user_row['username']) || !isset($user_row['group_id']) || !isset($user_row['user_email']) || !isset($user_row['user_type'])) if (empty($user_row['username']) || !isset($user_row['group_id']) || !isset($user_row['user_email']) || !isset($user_row['user_type']))
{ {
@ -276,12 +276,7 @@ function user_add($user_row, $cp_data = false)
{ {
$cp_data['user_id'] = (int) $user_id; $cp_data['user_id'] = (int) $user_id;
if (!class_exists('custom_profile')) $cp = $phpbb_container->get('profilefields.manager');
{
include_once($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
}
$cp = new custom_profile();
$sql = 'INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' ' . $sql = 'INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' ' .
$db->sql_build_array('INSERT', $cp->build_insert_sql_array($cp_data)); $db->sql_build_array('INSERT', $cp->build_insert_sql_array($cp_data));
$db->sql_query($sql); $db->sql_query($sql);

View file

@ -20,7 +20,7 @@ if (!defined('IN_PHPBB'))
*/ */
function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row) function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
{ {
global $user, $template, $auth, $db, $cache; global $user, $template, $auth, $db, $cache, $phpbb_container;
global $phpbb_root_path, $request, $phpEx, $config, $phpbb_dispatcher; global $phpbb_root_path, $request, $phpEx, $config, $phpbb_dispatcher;
$user->add_lang(array('viewtopic', 'memberlist')); $user->add_lang(array('viewtopic', 'memberlist'));
@ -61,11 +61,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
// Load the custom profile fields // Load the custom profile fields
if ($config['load_cpf_pm']) if ($config['load_cpf_pm'])
{ {
if (!class_exists('custom_profile')) $cp = $phpbb_container->get('profilefields.manager');
{
include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
}
$cp = new custom_profile();
$profile_fields = $cp->generate_profile_fields_template('grab', $author_id); $profile_fields = $cp->generate_profile_fields_template('grab', $author_id);
} }

View file

@ -29,8 +29,7 @@ class ucp_profile
function main($id, $mode) function main($id, $mode)
{ {
global $cache, $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx; global $cache, $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
global $request; global $request, $phpbb_container;
global $phpbb_container;
$user->add_lang('posting'); $user->add_lang('posting');
@ -260,9 +259,7 @@ class ucp_profile
trigger_error('NO_AUTH_PROFILEINFO'); trigger_error('NO_AUTH_PROFILEINFO');
} }
include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx); $cp = $phpbb_container->get('profilefields.manager');
$cp = new custom_profile();
$cp_data = $cp_error = array(); $cp_data = $cp_error = array();

View file

@ -35,8 +35,6 @@ class ucp_register
trigger_error('UCP_REGISTER_DISABLE'); trigger_error('UCP_REGISTER_DISABLE');
} }
include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
$coppa = $request->is_set('coppa') ? (int) $request->variable('coppa', false) : false; $coppa = $request->is_set('coppa') ? (int) $request->variable('coppa', false) : false;
$agreed = $request->variable('agreed', false); $agreed = $request->variable('agreed', false);
$submit = $request->is_set_post('submit'); $submit = $request->is_set_post('submit');
@ -78,7 +76,7 @@ class ucp_register
} }
} }
$cp = new custom_profile(); $cp = $phpbb_container->get('profilefields.manager');
$error = $cp_data = $cp_error = array(); $error = $cp_data = $cp_error = array();
$s_hidden_fields = array(); $s_hidden_fields = array();

View file

@ -908,7 +908,7 @@ CREATE INDEX phpbb_privmsgs_to_usr_flder_id ON phpbb_privmsgs_to(user_id, folder
CREATE TABLE phpbb_profile_fields ( CREATE TABLE phpbb_profile_fields (
field_id INTEGER NOT NULL, field_id INTEGER NOT NULL,
field_name VARCHAR(255) CHARACTER SET UTF8 DEFAULT '' NOT NULL COLLATE UNICODE, field_name VARCHAR(255) CHARACTER SET UTF8 DEFAULT '' NOT NULL COLLATE UNICODE,
field_type INTEGER DEFAULT 0 NOT NULL, field_type VARCHAR(100) CHARACTER SET NONE DEFAULT '' NOT NULL,
field_ident VARCHAR(20) CHARACTER SET NONE DEFAULT '' NOT NULL, field_ident VARCHAR(20) CHARACTER SET NONE DEFAULT '' NOT NULL,
field_length VARCHAR(20) CHARACTER SET NONE DEFAULT '' NOT NULL, field_length VARCHAR(20) CHARACTER SET NONE DEFAULT '' NOT NULL,
field_minlen VARCHAR(255) CHARACTER SET NONE DEFAULT '' NOT NULL, field_minlen VARCHAR(255) CHARACTER SET NONE DEFAULT '' NOT NULL,
@ -957,7 +957,7 @@ CREATE TABLE phpbb_profile_fields_lang (
field_id INTEGER DEFAULT 0 NOT NULL, field_id INTEGER DEFAULT 0 NOT NULL,
lang_id INTEGER DEFAULT 0 NOT NULL, lang_id INTEGER DEFAULT 0 NOT NULL,
option_id INTEGER DEFAULT 0 NOT NULL, option_id INTEGER DEFAULT 0 NOT NULL,
field_type INTEGER DEFAULT 0 NOT NULL, field_type VARCHAR(100) CHARACTER SET NONE DEFAULT '' NOT NULL,
lang_value VARCHAR(255) CHARACTER SET UTF8 DEFAULT '' NOT NULL COLLATE UNICODE lang_value VARCHAR(255) CHARACTER SET UTF8 DEFAULT '' NOT NULL COLLATE UNICODE
);; );;

View file

@ -1114,7 +1114,7 @@ GO
CREATE TABLE [phpbb_profile_fields] ( CREATE TABLE [phpbb_profile_fields] (
[field_id] [int] IDENTITY (1, 1) NOT NULL , [field_id] [int] IDENTITY (1, 1) NOT NULL ,
[field_name] [varchar] (255) DEFAULT ('') NOT NULL , [field_name] [varchar] (255) DEFAULT ('') NOT NULL ,
[field_type] [int] DEFAULT (0) NOT NULL , [field_type] [varchar] (100) DEFAULT ('') NOT NULL ,
[field_ident] [varchar] (20) DEFAULT ('') NOT NULL , [field_ident] [varchar] (20) DEFAULT ('') NOT NULL ,
[field_length] [varchar] (20) DEFAULT ('') NOT NULL , [field_length] [varchar] (20) DEFAULT ('') NOT NULL ,
[field_minlen] [varchar] (255) DEFAULT ('') NOT NULL , [field_minlen] [varchar] (255) DEFAULT ('') NOT NULL ,
@ -1172,7 +1172,7 @@ CREATE TABLE [phpbb_profile_fields_lang] (
[field_id] [int] DEFAULT (0) NOT NULL , [field_id] [int] DEFAULT (0) NOT NULL ,
[lang_id] [int] DEFAULT (0) NOT NULL , [lang_id] [int] DEFAULT (0) NOT NULL ,
[option_id] [int] DEFAULT (0) NOT NULL , [option_id] [int] DEFAULT (0) NOT NULL ,
[field_type] [int] DEFAULT (0) NOT NULL , [field_type] [varchar] (100) DEFAULT ('') NOT NULL ,
[lang_value] [varchar] (255) DEFAULT ('') NOT NULL [lang_value] [varchar] (255) DEFAULT ('') NOT NULL
) ON [PRIMARY] ) ON [PRIMARY]
GO GO

View file

@ -645,7 +645,7 @@ CREATE TABLE phpbb_privmsgs_to (
CREATE TABLE phpbb_profile_fields ( CREATE TABLE phpbb_profile_fields (
field_id mediumint(8) UNSIGNED NOT NULL auto_increment, field_id mediumint(8) UNSIGNED NOT NULL auto_increment,
field_name blob NOT NULL, field_name blob NOT NULL,
field_type tinyint(4) DEFAULT '0' NOT NULL, field_type varbinary(100) DEFAULT '' NOT NULL,
field_ident varbinary(20) DEFAULT '' NOT NULL, field_ident varbinary(20) DEFAULT '' NOT NULL,
field_length varbinary(20) DEFAULT '' NOT NULL, field_length varbinary(20) DEFAULT '' NOT NULL,
field_minlen varbinary(255) DEFAULT '' NOT NULL, field_minlen varbinary(255) DEFAULT '' NOT NULL,
@ -681,7 +681,7 @@ CREATE TABLE phpbb_profile_fields_lang (
field_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, field_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
lang_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, lang_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
option_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, option_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
field_type tinyint(4) DEFAULT '0' NOT NULL, field_type varbinary(100) DEFAULT '' NOT NULL,
lang_value blob NOT NULL, lang_value blob NOT NULL,
PRIMARY KEY (field_id, lang_id, option_id) PRIMARY KEY (field_id, lang_id, option_id)
); );

View file

@ -645,7 +645,7 @@ CREATE TABLE phpbb_privmsgs_to (
CREATE TABLE phpbb_profile_fields ( CREATE TABLE phpbb_profile_fields (
field_id mediumint(8) UNSIGNED NOT NULL auto_increment, field_id mediumint(8) UNSIGNED NOT NULL auto_increment,
field_name varchar(255) DEFAULT '' NOT NULL, field_name varchar(255) DEFAULT '' NOT NULL,
field_type tinyint(4) DEFAULT '0' NOT NULL, field_type varchar(100) DEFAULT '' NOT NULL,
field_ident varchar(20) DEFAULT '' NOT NULL, field_ident varchar(20) DEFAULT '' NOT NULL,
field_length varchar(20) DEFAULT '' NOT NULL, field_length varchar(20) DEFAULT '' NOT NULL,
field_minlen varchar(255) DEFAULT '' NOT NULL, field_minlen varchar(255) DEFAULT '' NOT NULL,
@ -681,7 +681,7 @@ CREATE TABLE phpbb_profile_fields_lang (
field_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, field_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
lang_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, lang_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
option_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, option_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
field_type tinyint(4) DEFAULT '0' NOT NULL, field_type varchar(100) DEFAULT '' NOT NULL,
lang_value varchar(255) DEFAULT '' NOT NULL, lang_value varchar(255) DEFAULT '' NOT NULL,
PRIMARY KEY (field_id, lang_id, option_id) PRIMARY KEY (field_id, lang_id, option_id)
) CHARACTER SET `utf8` COLLATE `utf8_bin`; ) CHARACTER SET `utf8` COLLATE `utf8_bin`;

View file

@ -1217,7 +1217,7 @@ CREATE INDEX phpbb_privmsgs_to_usr_flder_id ON phpbb_privmsgs_to (user_id, folde
CREATE TABLE phpbb_profile_fields ( CREATE TABLE phpbb_profile_fields (
field_id number(8) NOT NULL, field_id number(8) NOT NULL,
field_name varchar2(765) DEFAULT '' , field_name varchar2(765) DEFAULT '' ,
field_type number(4) DEFAULT '0' NOT NULL, field_type varchar2(100) DEFAULT '' ,
field_ident varchar2(20) DEFAULT '' , field_ident varchar2(20) DEFAULT '' ,
field_length varchar2(20) DEFAULT '' , field_length varchar2(20) DEFAULT '' ,
field_minlen varchar2(255) DEFAULT '' , field_minlen varchar2(255) DEFAULT '' ,
@ -1277,7 +1277,7 @@ CREATE TABLE phpbb_profile_fields_lang (
field_id number(8) DEFAULT '0' NOT NULL, field_id number(8) DEFAULT '0' NOT NULL,
lang_id number(8) DEFAULT '0' NOT NULL, lang_id number(8) DEFAULT '0' NOT NULL,
option_id number(8) DEFAULT '0' NOT NULL, option_id number(8) DEFAULT '0' NOT NULL,
field_type number(4) DEFAULT '0' NOT NULL, field_type varchar2(100) DEFAULT '' ,
lang_value varchar2(765) DEFAULT '' , lang_value varchar2(765) DEFAULT '' ,
CONSTRAINT pk_phpbb_profile_fields_lang PRIMARY KEY (field_id, lang_id, option_id) CONSTRAINT pk_phpbb_profile_fields_lang PRIMARY KEY (field_id, lang_id, option_id)
) )

View file

@ -853,7 +853,7 @@ CREATE SEQUENCE phpbb_profile_fields_seq;
CREATE TABLE phpbb_profile_fields ( CREATE TABLE phpbb_profile_fields (
field_id INT4 DEFAULT nextval('phpbb_profile_fields_seq'), field_id INT4 DEFAULT nextval('phpbb_profile_fields_seq'),
field_name varchar(255) DEFAULT '' NOT NULL, field_name varchar(255) DEFAULT '' NOT NULL,
field_type INT2 DEFAULT '0' NOT NULL, field_type varchar(100) DEFAULT '' NOT NULL,
field_ident varchar(20) DEFAULT '' NOT NULL, field_ident varchar(20) DEFAULT '' NOT NULL,
field_length varchar(20) DEFAULT '' NOT NULL, field_length varchar(20) DEFAULT '' NOT NULL,
field_minlen varchar(255) DEFAULT '' NOT NULL, field_minlen varchar(255) DEFAULT '' NOT NULL,
@ -893,7 +893,7 @@ CREATE TABLE phpbb_profile_fields_lang (
field_id INT4 DEFAULT '0' NOT NULL CHECK (field_id >= 0), field_id INT4 DEFAULT '0' NOT NULL CHECK (field_id >= 0),
lang_id INT4 DEFAULT '0' NOT NULL CHECK (lang_id >= 0), lang_id INT4 DEFAULT '0' NOT NULL CHECK (lang_id >= 0),
option_id INT4 DEFAULT '0' NOT NULL CHECK (option_id >= 0), option_id INT4 DEFAULT '0' NOT NULL CHECK (option_id >= 0),
field_type INT2 DEFAULT '0' NOT NULL, field_type varchar(100) DEFAULT '' NOT NULL,
lang_value varchar(255) DEFAULT '' NOT NULL, lang_value varchar(255) DEFAULT '' NOT NULL,
PRIMARY KEY (field_id, lang_id, option_id) PRIMARY KEY (field_id, lang_id, option_id)
); );

View file

@ -626,7 +626,7 @@ CREATE INDEX phpbb_privmsgs_to_usr_flder_id ON phpbb_privmsgs_to (user_id, folde
CREATE TABLE phpbb_profile_fields ( CREATE TABLE phpbb_profile_fields (
field_id INTEGER PRIMARY KEY NOT NULL , field_id INTEGER PRIMARY KEY NOT NULL ,
field_name varchar(255) NOT NULL DEFAULT '', field_name varchar(255) NOT NULL DEFAULT '',
field_type tinyint(4) NOT NULL DEFAULT '0', field_type varchar(100) NOT NULL DEFAULT '',
field_ident varchar(20) NOT NULL DEFAULT '', field_ident varchar(20) NOT NULL DEFAULT '',
field_length varchar(20) NOT NULL DEFAULT '', field_length varchar(20) NOT NULL DEFAULT '',
field_minlen varchar(255) NOT NULL DEFAULT '', field_minlen varchar(255) NOT NULL DEFAULT '',
@ -661,7 +661,7 @@ CREATE TABLE phpbb_profile_fields_lang (
field_id INTEGER UNSIGNED NOT NULL DEFAULT '0', field_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
lang_id INTEGER UNSIGNED NOT NULL DEFAULT '0', lang_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
option_id INTEGER UNSIGNED NOT NULL DEFAULT '0', option_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
field_type tinyint(4) NOT NULL DEFAULT '0', field_type varchar(100) NOT NULL DEFAULT '',
lang_value varchar(255) NOT NULL DEFAULT '', lang_value varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (field_id, lang_id, option_id) PRIMARY KEY (field_id, lang_id, option_id)
); );

View file

@ -617,8 +617,7 @@ switch ($mode)
$profile_fields = array(); $profile_fields = array();
if ($config['load_cpf_viewprofile']) if ($config['load_cpf_viewprofile'])
{ {
include_once($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx); $cp = $phpbb_container->get('profilefields.manager');
$cp = new custom_profile();
$profile_fields = $cp->generate_profile_fields_template('grab', $user_id); $profile_fields = $cp->generate_profile_fields_template('grab', $user_id);
$profile_fields = (isset($profile_fields[$user_id])) ? $cp->generate_profile_fields_template('show', false, $profile_fields[$user_id]) : array(); $profile_fields = (isset($profile_fields[$user_id])) ? $cp->generate_profile_fields_template('show', false, $profile_fields[$user_id]) : array();
} }
@ -1555,8 +1554,7 @@ switch ($mode)
// Load custom profile fields // Load custom profile fields
if ($config['load_cpf_memberlist']) if ($config['load_cpf_memberlist'])
{ {
include_once($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx); $cp = $phpbb_container->get('profilefields.manager');
$cp = new custom_profile();
// Grab all profile fields from users in id cache for later use - similar to the poster cache // Grab all profile fields from users in id cache for later use - similar to the poster cache
$profile_fields_cache = $cp->generate_profile_fields_template('grab', $user_list); $profile_fields_cache = $cp->generate_profile_fields_template('grab', $user_list);

View file

@ -0,0 +1,106 @@
<?php
/**
*
* @package migration
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
*
*/
namespace phpbb\db\migration\data\v310;
class profilefield_types extends \phpbb\db\migration\migration
{
static public function depends_on()
{
return array(
'\phpbb\db\migration\data\v310\alpha2',
);
}
public function update_schema()
{
return array(
'change_columns' => array(
$this->table_prefix . 'profile_fields' => array(
'field_type' => array('VCHAR:100', ''),
),
$this->table_prefix . 'profile_fields_lang' => array(
'field_type' => array('VCHAR:100', ''),
),
),
);
}
public function update_data()
{
return array(
array('custom', array(array($this, 'update_profile_fields_type'))),
array('custom', array(array($this, 'update_profile_fields_lang_type'))),
);
}
public function update_profile_fields_type()
{
// Update profile field types
$sql = 'SELECT field_type
FROM ' . $this->table_prefix . 'profile_fields
GROUP BY field_type';
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$sql = 'UPDATE ' . $this->table_prefix . "profile_fields
SET field_type = '" . $this->db->sql_escape($this->convert_phpbb30_field_type($row['field_type'])) . "'
WHERE field_type = '" . $this->db->sql_escape($row['field_type']) . "'";
$this->sql_query($sql);
}
$this->db->sql_freeresult($result);
}
public function update_profile_fields_lang_type()
{
// Update profile field language types
$sql = 'SELECT field_type
FROM ' . $this->table_prefix . 'profile_fields_lang
GROUP BY field_type';
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$sql = 'UPDATE ' . $this->table_prefix . "profile_fields_lang
SET field_type = '" . $this->db->sql_escape($this->convert_phpbb30_field_type($row['field_type'])) . "'
WHERE field_type = '" . $this->db->sql_escape($row['field_type']) . "'";
$this->sql_query($sql);
}
$this->db->sql_freeresult($result);
}
/**
* Determine the new field type for a given phpBB 3.0 field type
*
* @param $field_type string Field type in 3.0
* @return string Field new type which is used since 3.1
*/
public function convert_phpbb30_field_type($field_type)
{
switch ($field_type)
{
case FIELD_INT:
return 'profilefields.type.int';
case FIELD_STRING:
return 'profilefields.type.string';
case FIELD_TEXT:
return 'profilefields.type.text';
case FIELD_BOOL:
return 'profilefields.type.bool';
case FIELD_DROPDOWN:
return 'profilefields.type.dropdown';
case FIELD_DATE:
return 'profilefields.type.date';
default:
return $field_type;
}
}
}

View file

@ -1474,52 +1474,7 @@ class tools
} }
// Get type // Get type
if (strpos($column_data[0], ':') !== false) list($column_type, $orig_column_type) = $this->get_column_type($column_data[0]);
{
list($orig_column_type, $column_length) = explode(':', $column_data[0]);
if (!is_array($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']))
{
$column_type = sprintf($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':'], $column_length);
}
else
{
if (isset($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['rule']))
{
switch ($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['rule'][0])
{
case 'div':
$column_length /= $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['rule'][1];
$column_length = ceil($column_length);
$column_type = sprintf($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':'][0], $column_length);
break;
}
}
if (isset($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit']))
{
switch ($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][0])
{
case 'mult':
$column_length *= $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][1];
if ($column_length > $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][2])
{
$column_type = $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][3];
}
else
{
$column_type = sprintf($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':'][0], $column_length);
}
break;
}
}
}
$orig_column_type .= ':';
}
else
{
$orig_column_type = $column_data[0];
$column_type = $this->dbms_type_map[$this->sql_layer][$column_data[0]];
}
// Adjust default value if db-dependent specified // Adjust default value if db-dependent specified
if (is_array($column_data[1])) if (is_array($column_data[1]))
@ -1694,6 +1649,65 @@ class tools
return $return_array; return $return_array;
} }
/**
* Get the column's database type from the type map
*
* @param string $column_map_type
* @return array column type for this database
* and map type without length
*/
function get_column_type($column_map_type)
{
if (strpos($column_map_type, ':') !== false)
{
list($orig_column_type, $column_length) = explode(':', $column_map_type);
if (!is_array($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']))
{
$column_type = sprintf($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':'], $column_length);
}
else
{
if (isset($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['rule']))
{
switch ($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['rule'][0])
{
case 'div':
$column_length /= $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['rule'][1];
$column_length = ceil($column_length);
$column_type = sprintf($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':'][0], $column_length);
break;
}
}
if (isset($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit']))
{
switch ($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][0])
{
case 'mult':
$column_length *= $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][1];
if ($column_length > $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][2])
{
$column_type = $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][3];
}
else
{
$column_type = sprintf($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':'][0], $column_length);
}
break;
}
}
}
$orig_column_type .= ':';
}
else
{
$orig_column_type = $column_map_type;
$column_type = $this->dbms_type_map[$this->sql_layer][$column_map_type];
}
return array($column_type, $orig_column_type);
}
/** /**
* Add new column * Add new column
*/ */

View file

@ -0,0 +1,130 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields;
/**
* Custom Profile Fields
* @package phpBB3
*/
class lang_helper
{
/**
* Array with the language option, grouped by field and language
* @var array
*/
protected $options_lang = array();
/**
* Database object
* @var \phpbb\db\driver\driver
*/
protected $db;
/**
* Table where the language strings are stored
* @var string
*/
protected $language_table;
/**
* Construct
*
* @param \phpbb\db\driver\driver $db Database object
* @param string $language_table Table where the language strings are stored
*/
public function __construct($db, $language_table)
{
$this->db = $db;
$this->language_table = $language_table;
}
/**
* Get language entries for options and store them here for later use
*/
public function get_option_lang($field_id, $lang_id, $field_type, $preview_options)
{
if ($preview_options !== false)
{
$lang_options = (!is_array($preview_options)) ? explode("\n", $preview_options) : $preview_options;
foreach ($lang_options as $num => $var)
{
if (!isset($this->options_lang[$field_id]))
{
$this->options_lang[$field_id] = array();
}
if (!isset($this->options_lang[$field_id][$lang_id]))
{
$this->options_lang[$field_id][$lang_id] = array();
}
$this->options_lang[$field_id][$lang_id][($num + 1)] = $var;
}
}
else
{
$sql = 'SELECT option_id, lang_value
FROM ' . $this->language_table . '
WHERE field_id = ' . (int) $field_id . '
AND lang_id = ' . (int) $lang_id . "
AND field_type = '" . $this->db->sql_escape($field_type) . "'
ORDER BY option_id";
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$this->options_lang[$field_id][$lang_id][($row['option_id'] + 1)] = $row['lang_value'];
}
$this->db->sql_freeresult($result);
}
}
/**
* Are language options set for this field?
*
* @param int $field_id Database ID of the field
* @param int $lang_id ID of the language
* @param int $field_value Selected value of the field
* @return boolean
*/
public function is_set($field_id, $lang_id = null, $field_value = null)
{
$is_set = isset($this->options_lang[$field_id]);
if ($is_set && (!is_null($lang_id) || !is_null($field_value)))
{
$is_set = isset($this->options_lang[$field_id][$lang_id]);
}
if ($is_set && !is_null($field_value))
{
$is_set = isset($this->options_lang[$field_id][$lang_id][$field_value]);
}
return $is_set;
}
/**
* Get the selected language string
*
* @param int $field_id Database ID of the field
* @param int $lang_id ID of the language
* @param int $field_value Selected value of the field
* @return string
*/
public function get($field_id, $lang_id, $field_value = null)
{
if (is_null($field_value))
{
return $this->options_lang[$field_id][$lang_id];
}
return $this->options_lang[$field_id][$lang_id][$field_value];
}
}

View file

@ -0,0 +1,375 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields;
/**
* Custom Profile Fields
* @package phpBB3
*/
class manager
{
/**
* Auth object
* @var \phpbb\auth\auth
*/
protected $auth;
/**
* Database object
* @var \phpbb\db\driver\driver
*/
protected $db;
/**
* Request object
* @var \phpbb\request\request
*/
protected $request;
/**
* Template object
* @var \phpbb\template\template
*/
protected $template;
/**
* Service Collection object
* @var \phpbb\di\service_collection
*/
protected $type_collection;
/**
* User object
* @var \phpbb\user
*/
protected $user;
protected $fields_table;
protected $fields_language_table;
protected $fields_data_table;
protected $profile_cache = array();
/**
* Construct
*
* @param \phpbb\auth\auth $auth Auth object
* @param \phpbb\db\driver\driver $db Database object
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\di\service_collection $type_collection
* @param \phpbb\user $user User object
* @param string $fields_table
* @param string $fields_language_table
* @param string $fields_data_table
*/
public function __construct(\phpbb\auth\auth $auth, \phpbb\db\driver\driver $db, \phpbb\request\request $request, \phpbb\template\template $template, \phpbb\di\service_collection $type_collection, \phpbb\user $user, $fields_table, $fields_language_table, $fields_data_table)
{
$this->auth = $auth;
$this->db = $db;
$this->request = $request;
$this->template = $template;
$this->type_collection = $type_collection;
$this->user = $user;
$this->fields_table = $fields_table;
$this->fields_language_table = $fields_language_table;
$this->fields_data_table = $fields_data_table;
}
/**
* Assign editable fields to template, mode can be profile (for profile change) or register (for registration)
* Called by ucp_profile and ucp_register
*/
public function generate_profile_fields($mode, $lang_id)
{
$sql_where = '';
switch ($mode)
{
case 'register':
// If the field is required we show it on the registration page
$sql_where .= ' AND f.field_show_on_reg = 1';
break;
case 'profile':
// Show hidden fields to moderators/admins
if (!$this->auth->acl_gets('a_', 'm_') && !$this->auth->acl_getf_global('m_'))
{
$sql_where .= ' AND f.field_show_profile = 1';
}
break;
default:
trigger_error('Wrong profile mode specified', E_USER_ERROR);
break;
}
$sql = 'SELECT l.*, f.*
FROM ' . $this->fields_language_table . ' l, ' . $this->fields_table . " f
WHERE f.field_active = 1
$sql_where
AND l.lang_id = " . (int) $lang_id . '
AND l.field_id = f.field_id
ORDER BY f.field_order';
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
// Return templated field
$profile_field = $this->type_collection[$row['field_type']];
$tpl_snippet = $profile_field->process_field_row('change', $row);
$this->template->assign_block_vars('profile_fields', array(
'LANG_NAME' => $this->user->lang($row['lang_name']),
'LANG_EXPLAIN' => $this->user->lang($row['lang_explain']),
'FIELD' => $tpl_snippet,
'FIELD_ID' => $profile_field->get_field_ident($row),
'S_REQUIRED' => ($row['field_required']) ? true : false,
));
}
$this->db->sql_freeresult($result);
}
/**
* Build profile cache, used for display
*/
protected function build_cache()
{
$this->profile_cache = array();
// Display hidden/no_view fields for admin/moderator
$sql = 'SELECT l.*, f.*
FROM ' . $this->fields_language_table . ' l, ' . $this->fields_table . ' f
WHERE l.lang_id = ' . $this->user->get_iso_lang_id() . '
AND f.field_active = 1 ' .
((!$this->auth->acl_gets('a_', 'm_') && !$this->auth->acl_getf_global('m_')) ? ' AND f.field_hide = 0 ' : '') . '
AND f.field_no_view = 0
AND l.field_id = f.field_id
ORDER BY f.field_order';
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$this->profile_cache[$row['field_ident']] = $row;
}
$this->db->sql_freeresult($result);
}
/**
* Submit profile field for validation
*/
public function submit_cp_field($mode, $lang_id, &$cp_data, &$cp_error)
{
$sql_where = '';
switch ($mode)
{
case 'register':
// If the field is required we show it on the registration page
$sql_where .= ' AND f.field_show_on_reg = 1';
break;
case 'profile':
// Show hidden fields to moderators/admins
if (!$this->auth->acl_gets('a_', 'm_') && !$this->auth->acl_getf_global('m_'))
{
$sql_where .= ' AND f.field_show_profile = 1';
}
break;
default:
trigger_error('Wrong profile mode specified', E_USER_ERROR);
break;
}
$sql = 'SELECT l.*, f.*
FROM ' . $this->fields_language_table . ' l, ' . $this->fields_table . ' f
WHERE l.lang_id = ' . (int) $lang_id . "
AND f.field_active = 1
$sql_where
AND l.field_id = f.field_id
ORDER BY f.field_order";
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$profile_field = $this->type_collection[$row['field_type']];
$cp_data['pf_' . $row['field_ident']] = $profile_field->get_profile_field($row);
$check_value = $cp_data['pf_' . $row['field_ident']];
if (($cp_result = $profile_field->validate_profile_field($check_value, $row)) !== false)
{
// If the result is not false, it's an error message
$cp_error[] = $cp_result;
}
}
$this->db->sql_freeresult($result);
}
/**
* Update profile field data directly
*/
public function update_profile_field_data($user_id, $cp_data)
{
if (!sizeof($cp_data))
{
return;
}
$sql = 'UPDATE ' . $this->fields_data_table . '
SET ' . $this->db->sql_build_array('UPDATE', $cp_data) . '
WHERE user_id = ' . (int) $user_id;
$this->db->sql_query($sql);
if (!$this->db->sql_affectedrows())
{
$cp_data['user_id'] = (int) $user_id;
$this->db->sql_return_on_error(true);
$sql = 'INSERT INTO ' . $this->fields_data_table . ' ' . $this->db->sql_build_array('INSERT', $cp_data);
$this->db->sql_query($sql);
$this->db->sql_return_on_error(false);
}
}
/**
* Assign fields to template, used for viewprofile, viewtopic and memberlist (if load setting is enabled)
* 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
*/
public function generate_profile_fields_template($mode, $user_id = 0, $profile_row = false)
{
if ($mode == 'grab')
{
if (!is_array($user_id))
{
$user_id = array($user_id);
}
if (!sizeof($this->profile_cache))
{
$this->build_cache();
}
if (!sizeof($user_id))
{
return array();
}
$sql = 'SELECT *
FROM ' . $this->fields_data_table . '
WHERE ' . $this->db->sql_in_set('user_id', array_map('intval', $user_id));
$result = $this->db->sql_query($sql);
$field_data = array();
while ($row = $this->db->sql_fetchrow($result))
{
$field_data[$row['user_id']] = $row;
}
$this->db->sql_freeresult($result);
$user_fields = array();
$user_ids = $user_id;
// Go through the fields in correct order
foreach (array_keys($this->profile_cache) as $used_ident)
{
foreach ($field_data as $user_id => $row)
{
$user_fields[$user_id][$used_ident]['value'] = $row['pf_' . $used_ident];
$user_fields[$user_id][$used_ident]['data'] = $this->profile_cache[$used_ident];
}
foreach ($user_ids as $user_id)
{
if (!isset($user_fields[$user_id][$used_ident]) && $this->profile_cache[$used_ident]['field_show_novalue'])
{
$user_fields[$user_id][$used_ident]['value'] = '';
$user_fields[$user_id][$used_ident]['data'] = $this->profile_cache[$used_ident];
}
}
}
return $user_fields;
}
else if ($mode == 'show')
{
// $profile_row == $user_fields[$row['user_id']];
$tpl_fields = array();
$tpl_fields['row'] = $tpl_fields['blockrow'] = array();
foreach ($profile_row as $ident => $ident_ary)
{
$profile_field = $this->type_collection[$ident_ary['data']['field_type']];
$value = $profile_field->get_profile_value($ident_ary['value'], $ident_ary['data']);
if ($value === NULL)
{
continue;
}
$tpl_fields['row'] += array(
'PROFILE_' . strtoupper($ident) . '_VALUE' => $value,
'PROFILE_' . strtoupper($ident) . '_TYPE' => $ident_ary['data']['field_type'],
'PROFILE_' . strtoupper($ident) . '_NAME' => $this->user->lang($ident_ary['data']['lang_name']),
'PROFILE_' . strtoupper($ident) . '_EXPLAIN'=> $this->user->lang($ident_ary['data']['lang_explain']),
'S_PROFILE_' . strtoupper($ident) => true,
);
$tpl_fields['blockrow'][] = array(
'PROFILE_FIELD_VALUE' => $value,
'PROFILE_FIELD_TYPE' => $ident_ary['data']['field_type'],
'PROFILE_FIELD_NAME' => $this->user->lang($ident_ary['data']['lang_name']),
'PROFILE_FIELD_EXPLAIN' => $this->user->lang($ident_ary['data']['lang_explain']),
'S_PROFILE_' . strtoupper($ident) => true,
);
}
return $tpl_fields;
}
else
{
trigger_error('Wrong mode for custom profile', E_USER_ERROR);
}
}
/**
* Build Array for user insertion into custom profile fields table
*/
public function build_insert_sql_array($cp_data)
{
$sql_not_in = array();
foreach ($cp_data as $key => $null)
{
$sql_not_in[] = (strncmp($key, 'pf_', 3) === 0) ? substr($key, 3) : $key;
}
$sql = 'SELECT f.field_type, f.field_ident, f.field_default_value, l.lang_default_value
FROM ' . $this->fields_language_table . ' l, ' . $this->fields_table . ' f
WHERE l.lang_id = ' . $this->user->get_iso_lang_id() . '
' . ((sizeof($sql_not_in)) ? ' AND ' . $this->db->sql_in_set('f.field_ident', $sql_not_in, true) : '') . '
AND l.field_id = f.field_id';
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$profile_field = $this->type_collection[$row['field_type']];
$cp_data['pf_' . $row['field_ident']] = $profile_field->get_default_field_value($row);
}
$this->db->sql_freeresult($result);
return $cp_data;
}
}

View file

@ -0,0 +1,175 @@
<?php
/**
*
* @package phpBB
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields\type;
abstract class type_base implements type_interface
{
/**
* Request object
* @var \phpbb\request\request
*/
protected $request;
/**
* Template object
* @var \phpbb\template\template
*/
protected $template;
/**
* User object
* @var \phpbb\user
*/
protected $user;
/**
* Construct
*
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
* @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
$this->request = $request;
$this->template = $template;
$this->user = $user;
}
/**
* {@inheritDoc}
*/
public function get_name()
{
return $this->user->lang('FIELD_' . strtoupper($this->get_name_short()));
}
/**
* {@inheritDoc}
*/
public function get_service_name()
{
return 'profilefields.type.' . $this->get_name_short();
}
/**
* {@inheritDoc}
*/
public function get_template_filename()
{
return 'profilefields/' . $this->get_name_short() . '.html';
}
/**
* {@inheritDoc}
*/
public function get_field_ident($field_data)
{
return 'pf_' . $field_data['field_ident'];
}
/**
* {@inheritDoc}
*/
public function get_language_options_input($field_data)
{
$field_data['l_lang_name'] = $this->request->variable('l_lang_name', array(0 => ''), true);
$field_data['l_lang_explain'] = $this->request->variable('l_lang_explain', array(0 => ''), true);
$field_data['l_lang_default_value'] = $this->request->variable('l_lang_default_value', array(0 => ''), true);
$field_data['l_lang_options'] = $this->request->variable('l_lang_options', array(0 => ''), true);
return $field_data;
}
/**
* {@inheritDoc}
*/
public function prepare_options_form(&$exclude_options, &$visibility_options)
{
return $this->request->variable('lang_options', '', true);
}
/**
* {@inheritDoc}
*/
public function validate_options_on_submit($error, $field_data)
{
return $error;
}
/**
* {@inheritDoc}
*/
public function get_excluded_options($key, $action, $current_value, &$field_data, $step)
{
if ($step == 3 && ($field_data[$key] || $action != 'edit') && $key == 'l_lang_options' && is_array($field_data[$key]))
{
foreach ($field_data[$key] as $lang_id => $options)
{
$field_data[$key][$lang_id] = explode("\n", $options);
}
return $current_value;
}
return $current_value;
}
/**
* {@inheritDoc}
*/
public function prepare_hidden_fields($step, $key, $action, &$field_data)
{
if (!$this->request->is_set($key))
{
// Do not set this variable, we will use the default value
return null;
}
else if ($key == 'field_ident' && isset($field_data[$key]))
{
return $field_data[$key];
}
else
{
return $this->request->variable($key, '', true);
}
}
/**
* {@inheritDoc}
*/
public function display_options(&$template_vars, &$field_data)
{
return;
}
/**
* Return templated value/field. Possible values for $mode are:
* change == user is able to set/enter profile values; preview == just show the value
*/
public function process_field_row($mode, $profile_row)
{
$preview_options = ($mode == 'preview') ? $profile_row['lang_options'] : false;
// set template filename
$this->template->set_filenames(array(
'cp_body' => $this->get_template_filename(),
));
// empty previously filled blockvars
$this->template->destroy_block_vars($this->get_name_short());
// Assign template variables
$this->generate_field($profile_row, $preview_options);
return $this->template->assign_display('cp_body');
}
}

View file

@ -0,0 +1,387 @@
<?php
/**
*
* @package phpBB
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields\type;
class type_bool extends type_base
{
/**
* Profile fields language helper
* @var \phpbb\profilefields\lang_helper
*/
protected $lang_helper;
/**
* Request object
* @var \phpbb\request\request
*/
protected $request;
/**
* Template object
* @var \phpbb\template\template
*/
protected $template;
/**
* User object
* @var \phpbb\user
*/
protected $user;
/**
* Construct
*
* @param \phpbb\profilefields\lang_helper $lang_helper Profile fields language helper
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
* @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\profilefields\lang_helper $lang_helper, \phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
$this->lang_helper = $lang_helper;
$this->request = $request;
$this->template = $template;
$this->user = $user;
}
/**
* {@inheritDoc}
*/
public function get_name_short()
{
return 'bool';
}
/**
* {@inheritDoc}
*/
public function get_options($default_lang_id, $field_data)
{
$profile_row = array(
'var_name' => 'field_default_value',
'field_id' => 1,
'lang_name' => $field_data['lang_name'],
'lang_explain' => $field_data['lang_explain'],
'lang_id' => $default_lang_id,
'field_default_value' => $field_data['field_default_value'],
'field_ident' => 'field_default_value',
'field_type' => $this->get_service_name(),
'field_length' => $field_data['field_length'],
'lang_options' => $field_data['lang_options'],
);
$options = array(
0 => array('TITLE' => $this->user->lang['FIELD_TYPE'], 'EXPLAIN' => $this->user->lang['BOOL_TYPE_EXPLAIN'], 'FIELD' => '<label><input type="radio" class="radio" name="field_length" value="1"' . (($field_data['field_length'] == 1) ? ' checked="checked"' : '') . ' onchange="document.getElementById(\'add_profile_field\').submit();" /> ' . $this->user->lang['RADIO_BUTTONS'] . '</label><label><input type="radio" class="radio" name="field_length" value="2"' . (($field_data['field_length'] == 2) ? ' checked="checked"' : '') . ' onchange="document.getElementById(\'add_profile_field\').submit();" /> ' . $this->user->lang['CHECKBOX'] . '</label>'),
1 => array('TITLE' => $this->user->lang['DEFAULT_VALUE'], 'FIELD' => $this->process_field_row('preview', $profile_row)),
);
return $options;
}
/**
* {@inheritDoc}
*/
public function get_default_option_values()
{
return array(
'field_length' => 1,
'field_minlen' => 0,
'field_maxlen' => 0,
'field_validation' => '',
'field_novalue' => 0,
'field_default_value' => 0,
);
}
/**
* {@inheritDoc}
*/
public function get_default_field_value($field_data)
{
return $field_data['field_default_value'];
}
/**
* {@inheritDoc}
*/
public function get_profile_field($profile_row)
{
$var_name = 'pf_' . $profile_row['field_ident'];
// Checkbox
if ($profile_row['field_length'] == 2)
{
return ($this->request->is_set($var_name)) ? 1 : 0;
}
else
{
return $this->request->variable($var_name, (int) $profile_row['field_default_value']);
}
}
/**
* {@inheritDoc}
*/
public function validate_profile_field(&$field_value, $field_data)
{
$field_value = (bool) $field_value;
if (!$field_value && $field_data['field_required'])
{
return $this->user->lang('FIELD_REQUIRED', $field_data['lang_name']);
}
return false;
}
/**
* {@inheritDoc}
*/
public function get_profile_value($field_value, $field_data)
{
$field_id = $field_data['field_id'];
$lang_id = $field_data['lang_id'];
if (!$this->lang_helper->is_set($field_id, $lang_id))
{
$this->lang_helper->get_option_lang($field_id, $lang_id, FIELD_BOOL, false);
}
if (!$field_value && $field_data['field_show_novalue'])
{
$field_value = $field_data['field_default_value'];
}
if ($field_data['field_length'] == 1)
{
return ($this->lang_helper->is_set($field_id, $lang_id, (int) $field_value)) ? $this->lang_helper->get($field_id, $lang_id, (int) $field_value) : null;
}
else if (!$field_value)
{
return null;
}
else
{
return $this->lang_helper->is_set($field_id, $lang_id, $field_value + 1);
}
}
/**
* {@inheritDoc}
*/
public function generate_field($profile_row, $preview_options = false)
{
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
$field_ident = $profile_row['field_ident'];
$default_value = $profile_row['field_default_value'];
// checkbox - set the value to "true" if it has been set to 1
if ($profile_row['field_length'] == 2)
{
$value = ($this->request->is_set($field_ident) && $this->request->variable($field_ident, $default_value) == 1) ? true : ((!isset($this->user->profile_fields[$field_ident]) || $preview_options !== false) ? $default_value : $this->user->profile_fields[$field_ident]);
}
else
{
$value = ($this->request->is_set($field_ident)) ? $this->request->variable($field_ident, $default_value) : ((!isset($this->user->profile_fields[$field_ident]) || $preview_options !== false) ? $default_value : $this->user->profile_fields[$field_ident]);
}
$profile_row['field_value'] = (int) $value;
$this->template->assign_block_vars('bool', array_change_key_case($profile_row, CASE_UPPER));
if ($profile_row['field_length'] == 1)
{
if (!$this->lang_helper->is_set($profile_row['field_id'], $profile_row['lang_id'], 1))
{
$this->lang_helper->get_option_lang($profile_row['field_id'], $profile_row['lang_id'], $this->get_service_name(), $preview_options);
}
$options = $this->lang_helper->get($profile_row['field_id'], $profile_row['lang_id']);
foreach ($options as $option_id => $option_value)
{
$this->template->assign_block_vars('bool.options', array(
'OPTION_ID' => $option_id,
'CHECKED' => ($value == $option_id) ? ' checked="checked"' : '',
'VALUE' => $option_value,
));
}
}
}
/**
* {@inheritDoc}
*/
public function get_field_ident($field_data)
{
return ($field_data['field_length'] == '1') ? '' : 'pf_' . $field_data['field_ident'];
}
/**
* {@inheritDoc}
*/
public function get_database_column_type()
{
return 'TINT:2';
}
/**
* {@inheritDoc}
*/
public function get_language_options($field_data)
{
$options = array(
'lang_name' => 'string',
'lang_options' => 'two_options',
);
if ($field_data['lang_explain'])
{
$options['lang_explain'] = 'text';
}
return $options;
}
/**
* {@inheritDoc}
*/
public function get_language_options_input($field_data)
{
$field_data['l_lang_name'] = $this->request->variable('l_lang_name', array(0 => ''), true);
$field_data['l_lang_explain'] = $this->request->variable('l_lang_explain', array(0 => ''), true);
$field_data['l_lang_default_value'] = $this->request->variable('l_lang_default_value', array(0 => ''), true);
/**
* @todo check if this line is correct...
$field_data['l_lang_default_value'] = $this->request->variable('l_lang_default_value', array(0 => array('')), true);
*/
$field_data['l_lang_options'] = $this->request->variable('l_lang_options', array(0 => array('')), true);
return $field_data;
}
/**
* {@inheritDoc}
*/
public function prepare_options_form(&$exclude_options, &$visibility_options)
{
$exclude_options[1][] = 'lang_options';
return $this->request->variable('lang_options', array(''), true);
}
/**
* {@inheritDoc}
*/
public function validate_options_on_submit($error, $field_data)
{
if (empty($field_data['lang_options'][0]) || empty($field_data['lang_options'][1]))
{
$error[] = $this->user->lang['NO_FIELD_ENTRIES'];
}
return $error;
}
/**
* {@inheritDoc}
*/
public function get_excluded_options($key, $action, $current_value, &$field_data, $step)
{
if ($step == 2 && $key == 'field_default_value')
{
// 'field_length' == 1 defines radio buttons. Possible values are 1 or 2 only.
// 'field_length' == 2 defines checkbox. Possible values are 0 or 1 only.
// If we switch the type on step 2, we have to adjust field value.
// 1 is a common value for the checkbox and radio buttons.
// Adjust unchecked checkbox value.
// If we return or save settings from 2nd/3rd page
// and the checkbox is unchecked, set the value to 0.
if ($this->request->is_set('step') && !$this->request->is_set($key))
{
return 0;
}
// If we switch to the checkbox type but former radio buttons value was 2,
// which is not the case for the checkbox, set it to 0 (unchecked).
if ($field_data['field_length'] == 2 && $current_value == 2)
{
return 0;
}
// If we switch to the radio buttons but the former checkbox value was 0,
// which is not the case for the radio buttons, set it to 0.
else if ($field_data['field_length'] == 1 && $current_value == 0)
{
return 2;
}
}
if ($step == 3 && ($field_data[$key] || $action != 'edit') && $key == 'l_lang_options')
{
$field_data[$key] = $this->request->variable($key, array(0 => array('')), true);
return $current_value;
}
return parent::get_excluded_options($key, $action, $current_value, $field_data, $step);
}
/**
* {@inheritDoc}
*/
public function prepare_hidden_fields($step, $key, $action, &$field_data)
{
if ($key == 'l_lang_options' && $this->request->is_set('l_lang_options'))
{
return $this->request->variable($key, array(array('')), true);
}
else if ($key == 'field_default_value')
{
return $this->request->variable($key, $field_data[$key]);
}
else
{
if (!$this->request->is_set($key))
{
return false;
}
else if ($key == 'field_ident' && isset($field_data[$key]))
{
return $field_data[$key];
}
else
{
return ($key == 'lang_options') ? $this->request->variable($key, array(''), true) : $this->request->variable($key, '', true);
}
}
}
/**
* {@inheritDoc}
*/
public function display_options(&$template_vars, &$field_data)
{
// Initialize these array elements if we are creating a new field
if (!sizeof($field_data['lang_options']))
{
// No options have been defined for a boolean field.
$field_data['lang_options'][0] = '';
$field_data['lang_options'][1] = '';
}
$template_vars = array_merge($template_vars, array(
'S_BOOL' => true,
'L_LANG_OPTIONS_EXPLAIN' => $this->user->lang['BOOL_ENTRIES_EXPLAIN'],
'FIRST_LANG_OPTION' => $field_data['lang_options'][0],
'SECOND_LANG_OPTION' => $field_data['lang_options'][1],
));
}
}

View file

@ -0,0 +1,358 @@
<?php
/**
*
* @package phpBB
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields\type;
class type_date extends type_base
{
/**
* Request object
* @var \phpbb\request\request
*/
protected $request;
/**
* Template object
* @var \phpbb\template\template
*/
protected $template;
/**
* User object
* @var \phpbb\user
*/
protected $user;
/**
* Construct
*
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
* @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
$this->request = $request;
$this->template = $template;
$this->user = $user;
}
/**
* {@inheritDoc}
*/
public function get_name_short()
{
return 'date';
}
/**
* {@inheritDoc}
*/
public function get_options($default_lang_id, $field_data)
{
$profile_row = array(
'var_name' => 'field_default_value',
'lang_name' => $field_data['lang_name'],
'lang_explain' => $field_data['lang_explain'],
'lang_id' => $default_lang_id,
'field_default_value' => $field_data['field_default_value'],
'field_ident' => 'field_default_value',
'field_type' => $this->get_service_name(),
'field_length' => $field_data['field_length'],
);
$always_now = request_var('always_now', -1);
if ($always_now == -1)
{
$s_checked = ($field_data['field_default_value'] == 'now') ? true : false;
}
else
{
$s_checked = ($always_now) ? true : false;
}
$options = array(
0 => array('TITLE' => $this->user->lang['DEFAULT_VALUE'], 'FIELD' => $this->process_field_row('preview', $profile_row)),
1 => array('TITLE' => $this->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();" /> ' . $this->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();" /> ' . $this->user->lang['NO'] . '</label>'),
);
return $options;
}
/**
* {@inheritDoc}
*/
public function get_default_option_values()
{
return array(
'field_length' => 10,
'field_minlen' => 10,
'field_maxlen' => 10,
'field_validation' => '',
'field_novalue' => ' 0- 0- 0',
'field_default_value' => ' 0- 0- 0',
);
}
/**
* {@inheritDoc}
*/
public function get_default_field_value($field_data)
{
if ($field_data['field_default_value'] == 'now')
{
$now = getdate();
$field_data['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']);
}
return $field_data['field_default_value'];
}
/**
* {@inheritDoc}
*/
public function get_profile_field($profile_row)
{
$var_name = 'pf_' . $profile_row['field_ident'];
if (!$this->request->is_set($var_name . '_day'))
{
if ($profile_row['field_default_value'] == 'now')
{
$now = getdate();
$profile_row['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']);
}
list($day, $month, $year) = explode('-', $profile_row['field_default_value']);
}
else
{
$day = $this->request->variable($var_name . '_day', 0);
$month = $this->request->variable($var_name . '_month', 0);
$year = $this->request->variable($var_name . '_year', 0);
}
return sprintf('%2d-%2d-%4d', $day, $month, $year);
}
/**
* {@inheritDoc}
*/
public function validate_profile_field(&$field_value, $field_data)
{
$field_validate = explode('-', $field_value);
$day = (isset($field_validate[0])) ? (int) $field_validate[0] : 0;
$month = (isset($field_validate[1])) ? (int) $field_validate[1] : 0;
$year = (isset($field_validate[2])) ? (int) $field_validate[2] : 0;
if ((!$day || !$month || !$year) && !$field_data['field_required'])
{
return false;
}
if ((!$day || !$month || !$year) && $field_data['field_required'])
{
return $this->user->lang('FIELD_REQUIRED', $field_data['lang_name']);
}
if ($day < 0 || $day > 31 || $month < 0 || $month > 12 || ($year < 1901 && $year > 0) || $year > gmdate('Y', time()) + 50)
{
return $this->user->lang('FIELD_INVALID_DATE', $field_data['lang_name']);
}
if (checkdate($month, $day, $year) === false)
{
return $this->user->lang('FIELD_INVALID_DATE', $field_data['lang_name']);
}
return false;
}
/**
* {@inheritDoc}
*/
public function get_profile_value($field_value, $field_data)
{
$date = explode('-', $field_value);
$day = (isset($date[0])) ? (int) $date[0] : 0;
$month = (isset($date[1])) ? (int) $date[1] : 0;
$year = (isset($date[2])) ? (int) $date[2] : 0;
if (!$day && !$month && !$year && !$field_data['field_show_novalue'])
{
return null;
}
else if ($day && $month && $year)
{
// Date should display as the same date for every user regardless of timezone
return $this->user->create_datetime()
->setDate($year, $month, $day)
->setTime(0, 0, 0)
->format($this->user->lang['DATE_FORMAT'], true);
}
return $field_value;
}
/**
* {@inheritDoc}
*/
public function generate_field($profile_row, $preview_options = false)
{
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
$field_ident = $profile_row['field_ident'];
$now = getdate();
if (!$this->request->is_set($profile_row['field_ident'] . '_day'))
{
if ($profile_row['field_default_value'] == 'now')
{
$profile_row['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']);
}
list($day, $month, $year) = explode('-', ((!isset($this->user->profile_fields[$field_ident]) || $preview_options !== false) ? $profile_row['field_default_value'] : $this->user->profile_fields[$field_ident]));
}
else
{
if ($preview_options !== false && $profile_row['field_default_value'] == 'now')
{
$profile_row['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']);
list($day, $month, $year) = explode('-', ((!isset($this->user->profile_fields[$field_ident]) || $preview_options !== false) ? $profile_row['field_default_value'] : $this->user->profile_fields[$field_ident]));
}
else
{
$day = $this->request->variable($profile_row['field_ident'] . '_day', 0);
$month = $this->request->variable($profile_row['field_ident'] . '_month', 0);
$year = $this->request->variable($profile_row['field_ident'] . '_year', 0);
}
}
$profile_row['s_day_options'] = '<option value="0"' . ((!$day) ? ' selected="selected"' : '') . '>--</option>';
for ($i = 1; $i < 32; $i++)
{
$profile_row['s_day_options'] .= '<option value="' . $i . '"' . (($i == $day) ? ' selected="selected"' : '') . ">$i</option>";
}
$profile_row['s_month_options'] = '<option value="0"' . ((!$month) ? ' selected="selected"' : '') . '>--</option>';
for ($i = 1; $i < 13; $i++)
{
$profile_row['s_month_options'] .= '<option value="' . $i . '"' . (($i == $month) ? ' selected="selected"' : '') . ">$i</option>";
}
$profile_row['s_year_options'] = '<option value="0"' . ((!$year) ? ' selected="selected"' : '') . '>--</option>';
for ($i = $now['year'] - 100; $i <= $now['year'] + 100; $i++)
{
$profile_row['s_year_options'] .= '<option value="' . $i . '"' . (($i == $year) ? ' selected="selected"' : '') . ">$i</option>";
}
$profile_row['field_value'] = 0;
$this->template->assign_block_vars('date', array_change_key_case($profile_row, CASE_UPPER));
}
/**
* {@inheritDoc}
*/
public function get_field_ident($field_data)
{
return '';
}
/**
* {@inheritDoc}
*/
public function get_database_column_type()
{
return 'VCHAR:10';
}
/**
* {@inheritDoc}
*/
public function get_language_options($field_data)
{
$options = array(
'lang_name' => 'string',
);
if ($field_data['lang_explain'])
{
$options['lang_explain'] = 'text';
}
return $options;
}
/**
* {@inheritDoc}
*/
public function get_excluded_options($key, $action, $current_value, &$field_data, $step)
{
if ($step == 2 && $key == 'field_default_value')
{
$always_now = $this->request->variable('always_now', -1);
if ($always_now == 1 || ($always_now === -1 && $current_value == 'now'))
{
$now = getdate();
$field_data['field_default_value_day'] = $now['mday'];
$field_data['field_default_value_month'] = $now['mon'];
$field_data['field_default_value_year'] = $now['year'];
$current_value = 'now';
$this->request->overwrite('field_default_value', $current_value, \phpbb\request\request_interface::POST);
}
else
{
if ($this->request->is_set('field_default_value_day'))
{
$field_data['field_default_value_day'] = $this->request->variable('field_default_value_day', 0);
$field_data['field_default_value_month'] = $this->request->variable('field_default_value_month', 0);
$field_data['field_default_value_year'] = $this->request->variable('field_default_value_year', 0);
$current_value = sprintf('%2d-%2d-%4d', $field_data['field_default_value_day'], $field_data['field_default_value_month'], $field_data['field_default_value_year']);
$this->request->overwrite('field_default_value', $current_value, \phpbb\request\request_interface::POST);
}
else
{
list($field_data['field_default_value_day'], $field_data['field_default_value_month'], $field_data['field_default_value_year']) = explode('-', $current_value);
}
}
return $current_value;
}
return parent::get_excluded_options($key, $action, $current_value, $field_data, $step);
}
/**
* {@inheritDoc}
*/
public function prepare_hidden_fields($step, $key, $action, &$field_data)
{
if ($key == 'field_default_value')
{
$always_now = $this->request->variable('always_now', 0);
if ($always_now)
{
return 'now';
}
else if ($this->request->is_set('field_default_value_day'))
{
$field_data['field_default_value_day'] = $this->request->variable('field_default_value_day', 0);
$field_data['field_default_value_month'] = $this->request->variable('field_default_value_month', 0);
$field_data['field_default_value_year'] = $this->request->variable('field_default_value_year', 0);
return sprintf('%2d-%2d-%4d', $field_data['field_default_value_day'], $field_data['field_default_value_month'], $field_data['field_default_value_year']);
}
}
return parent::prepare_hidden_fields($step, $key, $action, $field_data);
}
}

View file

@ -0,0 +1,298 @@
<?php
/**
*
* @package phpBB
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields\type;
class type_dropdown extends type_base
{
/**
* Profile fields language helper
* @var \phpbb\profilefields\lang_helper
*/
protected $lang_helper;
/**
* Request object
* @var \phpbb\request\request
*/
protected $request;
/**
* Template object
* @var \phpbb\template\template
*/
protected $template;
/**
* User object
* @var \phpbb\user
*/
protected $user;
/**
* Construct
*
* @param \phpbb\profilefields\lang_helper $lang_helper Profile fields language helper
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
* @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\profilefields\lang_helper $lang_helper, \phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
$this->lang_helper = $lang_helper;
$this->request = $request;
$this->template = $template;
$this->user = $user;
}
/**
* {@inheritDoc}
*/
public function get_name_short()
{
return 'dropdown';
}
/**
* {@inheritDoc}
*/
public function get_options($default_lang_id, $field_data)
{
$profile_row[0] = array(
'var_name' => 'field_default_value',
'field_id' => 1,
'lang_name' => $field_data['lang_name'],
'lang_explain' => $field_data['lang_explain'],
'lang_id' => $default_lang_id,
'field_default_value' => $field_data['field_default_value'],
'field_ident' => 'field_default_value',
'field_type' => $this->get_service_name(),
'lang_options' => $field_data['lang_options'],
);
$profile_row[1] = $profile_row[0];
$profile_row[1]['var_name'] = 'field_novalue';
$profile_row[1]['field_ident'] = 'field_novalue';
$profile_row[1]['field_default_value'] = $field_data['field_novalue'];
$options = array(
0 => array('TITLE' => $this->user->lang['DEFAULT_VALUE'], 'FIELD' => $this->process_field_row('preview', $profile_row[0])),
1 => array('TITLE' => $this->user->lang['NO_VALUE_OPTION'], 'EXPLAIN' => $this->user->lang['NO_VALUE_OPTION_EXPLAIN'], 'FIELD' => $this->process_field_row('preview', $profile_row[1])),
);
return $options;
}
/**
* {@inheritDoc}
*/
public function get_default_option_values()
{
return array(
'field_length' => 0,
'field_minlen' => 0,
'field_maxlen' => 5,
'field_validation' => '',
'field_novalue' => 0,
'field_default_value' => 0,
);
}
/**
* {@inheritDoc}
*/
public function get_default_field_value($field_data)
{
return $field_data['field_default_value'];
}
/**
* {@inheritDoc}
*/
public function get_profile_field($profile_row)
{
$var_name = 'pf_' . $profile_row['field_ident'];
return $this->request->variable($var_name, (int) $profile_row['field_default_value']);
}
/**
* {@inheritDoc}
*/
public function validate_profile_field(&$field_value, $field_data)
{
$field_value = (int) $field_value;
// retrieve option lang data if necessary
if (!$this->lang_helper->is_set($field_data['field_id'], $field_data['lang_id'], 1))
{
$this->lang_helper->get_option_lang($field_data['field_id'], $field_data['lang_id'], $this->get_service_name(), false);
}
if (!$this->lang_helper->is_set($field_data['field_id'], $field_data['lang_id'], $field_value))
{
return $this->user->lang('FIELD_INVALID_VALUE', $field_data['lang_name']);
}
if ($field_value == $field_data['field_novalue'] && $field_data['field_required'])
{
return $this->user->lang('FIELD_REQUIRED', $field_data['lang_name']);
}
return false;
}
/**
* {@inheritDoc}
*/
public function get_profile_value($field_value, $field_data)
{
$field_id = $field_data['field_id'];
$lang_id = $field_data['lang_id'];
if (!$this->lang_helper->is_set($field_id, $lang_id))
{
$this->lang_helper->get_option_lang($field_id, $lang_id, $this->get_service_name(), false);
}
if ($field_value == $field_data['field_novalue'] && !$field_data['field_show_novalue'])
{
return null;
}
$field_value = (int) $field_value;
// User not having a value assigned
if (!$this->lang_helper->is_set($field_id, $lang_id, $field_value))
{
if ($field_data['field_show_novalue'])
{
$field_value = $field_data['field_novalue'];
}
else
{
return null;
}
}
return $this->lang_helper->get($field_id, $lang_id, $field_value);
}
/**
* {@inheritDoc}
*/
public function generate_field($profile_row, $preview_options = false)
{
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
$field_ident = $profile_row['field_ident'];
$default_value = $profile_row['field_default_value'];
$value = ($this->request->is_set($field_ident)) ? $this->request->variable($field_ident, $default_value) : ((!isset($this->user->profile_fields[$field_ident]) || $preview_options !== false) ? $default_value : $this->user->profile_fields[$field_ident]);
if (!$this->lang_helper->is_set($profile_row['field_id'], $profile_row['lang_id'], 1))
{
$this->lang_helper->get_option_lang($profile_row['field_id'], $profile_row['lang_id'], $this->get_service_name(), $preview_options);
}
$profile_row['field_value'] = (int) $value;
$this->template->assign_block_vars('dropdown', array_change_key_case($profile_row, CASE_UPPER));
$options = $this->lang_helper->get($profile_row['field_id'], $profile_row['lang_id']);
foreach ($options as $option_id => $option_value)
{
$this->template->assign_block_vars('dropdown.options', array(
'OPTION_ID' => $option_id,
'SELECTED' => ($value == $option_id) ? ' selected="selected"' : '',
'VALUE' => $option_value,
));
}
}
/**
* {@inheritDoc}
*/
public function get_database_column_type()
{
return 'UINT';
}
/**
* {@inheritDoc}
*/
public function get_language_options($field_data)
{
$options = array(
'lang_name' => 'string',
'lang_options' => 'optionfield',
);
if ($field_data['lang_explain'])
{
$options['lang_explain'] = 'text';
}
return $options;
}
/**
* {@inheritDoc}
*/
public function prepare_options_form(&$exclude_options, &$visibility_options)
{
$exclude_options[1][] = 'lang_options';
return $this->request->variable('lang_options', '', true);
}
/**
* {@inheritDoc}
*/
public function validate_options_on_submit($error, $field_data)
{
if (!sizeof($field_data['lang_options']))
{
$error[] = $this->user->lang['NO_FIELD_ENTRIES'];
}
return $error;
}
/**
* {@inheritDoc}
*/
public function get_excluded_options($key, $action, $current_value, &$field_data, $step)
{
if ($step == 2 && $key == 'field_maxlen')
{
// Get the number of options if this key is 'field_maxlen'
return sizeof(explode("\n", $this->request->variable('lang_options', '', true)));
}
return parent::get_excluded_options($key, $action, $current_value, $field_data, $step);
}
/**
* {@inheritDoc}
*/
public function display_options(&$template_vars, &$field_data)
{
// Initialize these array elements if we are creating a new field
if (!sizeof($field_data['lang_options']))
{
// No options have been defined for the dropdown menu
$field_data['lang_options'] = array();
}
$template_vars = array_merge($template_vars, array(
'S_DROPDOWN' => true,
'L_LANG_OPTIONS_EXPLAIN' => $this->user->lang['DROPDOWN_ENTRIES_EXPLAIN'],
'LANG_OPTIONS' => implode("\n", $field_data['lang_options']),
));
}
}

View file

@ -0,0 +1,234 @@
<?php
/**
*
* @package phpBB
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields\type;
class type_int extends type_base
{
/**
* Request object
* @var \phpbb\request\request
*/
protected $request;
/**
* Template object
* @var \phpbb\template\template
*/
protected $template;
/**
* User object
* @var \phpbb\user
*/
protected $user;
/**
* Construct
*
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
* @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
$this->request = $request;
$this->template = $template;
$this->user = $user;
}
/**
* {@inheritDoc}
*/
public function get_name_short()
{
return 'int';
}
/**
* {@inheritDoc}
*/
public function get_options($default_lang_id, $field_data)
{
$options = array(
0 => array('TITLE' => $this->user->lang['FIELD_LENGTH'], 'FIELD' => '<input type="number" min="0" max="99999" name="field_length" size="5" value="' . $field_data['field_length'] . '" />'),
1 => array('TITLE' => $this->user->lang['MIN_FIELD_NUMBER'], 'FIELD' => '<input type="number" min="0" max="99999" name="field_minlen" size="5" value="' . $field_data['field_minlen'] . '" />'),
2 => array('TITLE' => $this->user->lang['MAX_FIELD_NUMBER'], 'FIELD' => '<input type="number" min="0" max="99999" name="field_maxlen" size="5" value="' . $field_data['field_maxlen'] . '" />'),
3 => array('TITLE' => $this->user->lang['DEFAULT_VALUE'], 'FIELD' => '<input type="post" name="field_default_value" value="' . $field_data['field_default_value'] . '" />'),
);
return $options;
}
/**
* {@inheritDoc}
*/
public function get_default_option_values()
{
return array(
'field_length' => 5,
'field_minlen' => 0,
'field_maxlen' => 100,
'field_validation' => '',
'field_novalue' => 0,
'field_default_value' => 0,
);
}
/**
* {@inheritDoc}
*/
public function get_default_field_value($field_data)
{
if ($field_data['field_default_value'] === '')
{
// We cannot insert an empty string into an integer column.
return null;
}
return $field_data['field_default_value'];
}
/**
* {@inheritDoc}
*/
public function get_profile_field($profile_row)
{
$var_name = 'pf_' . $profile_row['field_ident'];
if ($this->request->is_set($var_name) && $this->request->variable($var_name, '') === '')
{
return null;
}
else
{
return $this->request->variable($var_name, (int) $profile_row['field_default_value']);
}
}
/**
* {@inheritDoc}
*/
public function validate_profile_field(&$field_value, $field_data)
{
if (trim($field_value) === '' && !$field_data['field_required'])
{
return false;
}
$field_value = (int) $field_value;
if ($field_value < $field_data['field_minlen'])
{
return $this->user->lang('FIELD_TOO_SMALL', (int) $row['field_minlen'], $row['lang_name']);
}
else if ($field_value > $field_data['field_maxlen'])
{
return $this->user->lang('FIELD_TOO_LARGE', (int) $row['field_maxlen'], $row['lang_name']);
}
return false;
}
/**
* {@inheritDoc}
*/
public function get_profile_value($field_value, $field_data)
{
if ($field_value === '' && !$field_data['field_show_novalue'])
{
return null;
}
return (int) $field_value;
}
/**
* {@inheritDoc}
*/
public function generate_field($profile_row, $preview_options = false)
{
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
$field_ident = $profile_row['field_ident'];
$default_value = $profile_row['field_default_value'];
if ($this->request->is_set($field_ident))
{
$value = ($this->request->variable($field_ident, '') === '') ? null : $this->request->variable($field_ident, $default_value);
}
else
{
if ($preview_options === false && array_key_exists($field_ident, $this->user->profile_fields) && is_null($this->user->profile_fields[$field_ident]))
{
$value = null;
}
else if (!isset($this->user->profile_fields[$field_ident]) || $preview_options !== false)
{
$value = $default_value;
}
else
{
$value = $this->user->profile_fields[$field_ident];
}
}
$profile_row['field_value'] = (is_null($value) || $value === '') ? '' : (int) $value;
$this->template->assign_block_vars('int', array_change_key_case($profile_row, CASE_UPPER));
}
/**
* {@inheritDoc}
*/
public function get_field_ident($field_data)
{
return 'pf_' . $field_data['field_ident'];
}
/**
* {@inheritDoc}
*/
public function get_database_column_type()
{
return 'BINT';
}
/**
* {@inheritDoc}
*/
public function get_language_options($field_data)
{
$options = array(
'lang_name' => 'string',
);
if ($field_data['lang_explain'])
{
$options['lang_explain'] = 'text';
}
return $options;
}
/**
* {@inheritDoc}
*/
public function get_excluded_options($key, $action, $current_value, &$field_data, $step)
{
if ($step == 2 && $key == 'field_default_value')
{
// Permit an empty string
if ($action == 'create' && $this->request->variable('field_default_value', '') === '')
{
return '';
}
}
return parent::get_excluded_options($key, $action, $current_value, $field_data, $step);
}
}

View file

@ -0,0 +1,177 @@
<?php
/**
*
* @package phpBB
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields\type;
interface type_interface
{
/**
* Get the translated name of the type
*
* @return string Translated name of the field type
*/
public function get_name();
/**
* Get the short name of the type, used for error messages and template loops
*
* @return string lowercase version of the fields type
*/
public function get_name_short();
/**
* Get the name of service representing the type
*
* @return string lowercase version of the fields type
*/
public function get_service_name();
/**
* Get dropdown options for second step in ACP
*
* @param string $default_lang_id ID of the default language
* @param array $field_data Array with data for this field
* @return array with the acp options
*/
public function get_options($default_lang_id, $field_data);
/**
* Get default values for the options of this type
*
* @return array with values like default field size and more
*/
public function get_default_option_values();
/**
* Get default value for this type
*
* @param array $field_data Array with data for this field
* @return mixed default value for new users when no value is given
*/
public function get_default_field_value($field_data);
/**
* Get profile field value on submit
*
* @param array $profile_row Array with data for this field
* @return mixed Submitted value of the profile field
*/
public function get_profile_field($profile_row);
/**
* Validate entered profile field data
*
* @param mixed $field_value Field value to validate
* @param array $field_data Array with requirements of the field
* @return mixed String with the error message
*/
public function validate_profile_field(&$field_value, $field_data);
/**
* Get Profile Value for display
*
* @param mixed $field_value Field value as stored in the database
* @param array $field_data Array with requirements of the field
* @return mixed Field value to display
*/
public function get_profile_value($field_value, $field_data);
/**
* Generate the input field for display
*
* @param array $profile_row Array with data for this field
* @param mixed $preview_options When previewing we use different data
* @return null
*/
public function generate_field($profile_row, $preview_options = false);
/**
* Get the ident of the field
*
* Some types are multivalue, we can't give them a field_id
* as we would not know which to pick.
*
* @param array $field_data Array with data for this field
* @return string ident of the field
*/
public function get_field_ident($field_data);
/**
* Get the column type for the database
*
* @return string Returns the database column type
*/
public function get_database_column_type();
/**
* Get the options we need to display for the language input fields in the ACP
*
* @param array $field_data Array with data for this field
* @return array Returns the language options we need to generate
*/
public function get_language_options($field_data);
/**
* Get the input for the supplied language options
*
* @param array $field_data Array with data for this field
* @return array Returns the language options we need to generate
*/
public function get_language_options_input($field_data);
/**
* Allows exclusion of options in single steps of the creation process
*
* @param array $exclude_options Array with options that should be excluded in the steps
* @param array $visibility_options Array with options responsible for the fields visibility
* @return mixed Returns the provided language options
*/
public function prepare_options_form(&$exclude_options, &$visibility_options);
/**
* Allows exclusion of options in single steps of the creation process
*
* @param array $error Array with error messages
* @param array $field_data Array with data for this field
* @return array Array with error messages
*/
public function validate_options_on_submit($error, $field_data);
/**
* Allows manipulating the intended variables if needed
*
* @param string $key Name of the option
* @param string $action Currently performed action (create|edit)
* @param mixed $current_value Currently value of the option
* @param array $field_data Array with data for this field
* @param int $step Step on which the option is excluded
* @return mixed Final value of the option
*/
public function get_excluded_options($key, $action, $current_value, &$field_data, $step);
/**
* Allows manipulating the intended variables if needed
*
* @param string $key Name of the option
* @param int $step Step on which the option is hidden
* @param string $action Currently performed action (create|edit)
* @param array $field_data Array with data for this field
* @return mixed Final value of the option
*/
public function prepare_hidden_fields($step, $key, $action, &$field_data);
/**
* Allows assigning of additional template variables
*
* @param array $template_vars Template variables we are going to assign
* @param array $field_data Array with data for this field
* @return null
*/
public function display_options(&$template_vars, &$field_data);
}

View file

@ -0,0 +1,156 @@
<?php
/**
*
* @package phpBB
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields\type;
class type_string extends type_string_common
{
/**
* Request object
* @var \phpbb\request\request
*/
protected $request;
/**
* Template object
* @var \phpbb\template\template
*/
protected $template;
/**
* User object
* @var \phpbb\user
*/
protected $user;
/**
* Construct
*
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
* @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
$this->request = $request;
$this->template = $template;
$this->user = $user;
}
/**
* {@inheritDoc}
*/
public function get_name_short()
{
return 'string';
}
/**
* {@inheritDoc}
*/
public function get_options($default_lang_id, $field_data)
{
$options = array(
0 => array('TITLE' => $this->user->lang['FIELD_LENGTH'], 'FIELD' => '<input type="number" min="0" name="field_length" size="5" value="' . $field_data['field_length'] . '" />'),
1 => array('TITLE' => $this->user->lang['MIN_FIELD_CHARS'], 'FIELD' => '<input type="number" min="0" name="field_minlen" size="5" value="' . $field_data['field_minlen'] . '" />'),
2 => array('TITLE' => $this->user->lang['MAX_FIELD_CHARS'], 'FIELD' => '<input type="number" min="0" size="5" value="' . $field_data['field_maxlen'] . '" />'),
3 => array('TITLE' => $this->user->lang['FIELD_VALIDATION'], 'FIELD' => '<select name="field_validation">' . $this->validate_options($field_data) . '</select>'),
);
return $options;
}
/**
* {@inheritDoc}
*/
public function get_default_option_values()
{
return array(
'field_length' => 10,
'field_minlen' => 0,
'field_maxlen' => 20,
'field_validation' => '.*',
'field_novalue' => '',
'field_default_value' => '',
);
}
/**
* {@inheritDoc}
*/
public function get_profile_field($profile_row)
{
$var_name = 'pf_' . $profile_row['field_ident'];
return $this->request->variable($var_name, (string) $profile_row['field_default_value'], true);
}
/**
* {@inheritDoc}
*/
public function validate_profile_field(&$field_value, $field_data)
{
return $this->validate_string_profile_field('string', $field_value, $field_data);
}
/**
* {@inheritDoc}
*/
public function generate_field($profile_row, $preview_options = false)
{
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
$field_ident = $profile_row['field_ident'];
$default_value = $profile_row['lang_default_value'];
$profile_row['field_value'] = ($this->request->is_set($field_ident)) ? $this->request->variable($field_ident, $default_value, true) : ((!isset($this->user->profile_fields[$field_ident]) || $preview_options !== false) ? $default_value : $this->user->profile_fields[$field_ident]);
$this->template->assign_block_vars('string', array_change_key_case($profile_row, CASE_UPPER));
}
/**
* {@inheritDoc}
*/
public function get_database_column_type()
{
return 'VCHAR';
}
/**
* {@inheritDoc}
*/
public function get_language_options($field_data)
{
$options = array(
'lang_name' => 'string',
);
if ($field_data['lang_explain'])
{
$options['lang_explain'] = 'text';
}
if (strlen($field_data['lang_default_value']))
{
$options['lang_default_value'] = 'string';
}
return $options;
}
/**
* {@inheritDoc}
*/
public function display_options(&$template_vars, &$field_data)
{
$template_vars = array_merge($template_vars, array(
'S_STRING' => true,
'L_DEFAULT_VALUE_EXPLAIN' => $this->user->lang['STRING_DEFAULT_VALUE_EXPLAIN'],
'LANG_DEFAULT_VALUE' => $field_data['lang_default_value'],
));
}
}

View file

@ -0,0 +1,114 @@
<?php
/**
*
* @package phpBB
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields\type;
abstract class type_string_common extends type_base
{
/**
* Return possible validation options
*/
function validate_options($field_data)
{
$validate_ary = array('CHARS_ANY' => '.*', 'NUMBERS_ONLY' => '[0-9]+', 'ALPHA_ONLY' => '[\w]+', 'ALPHA_SPACERS' => '[\w_\+\. \-\[\]]+');
$validate_options = '';
foreach ($validate_ary as $lang => $value)
{
$selected = ($field_data['field_validation'] == $value) ? ' selected="selected"' : '';
$validate_options .= '<option value="' . $value . '"' . $selected . '>' . $this->user->lang[$lang] . '</option>';
}
return $validate_options;
}
/**
* {@inheritDoc}
*/
public function get_default_field_value($field_data)
{
return $field_data['lang_default_value'];
}
/**
* Validate entered profile field data
*
* @param string $field_type Field type (string or text)
* @param mixed $field_value Field value to validate
* @param array $field_data Array with requirements of the field
* @return mixed String with key of the error language string, false otherwise
*/
public function validate_string_profile_field($field_type, &$field_value, $field_data)
{
if (trim($field_value) === '' && !$field_data['field_required'])
{
return false;
}
else if (trim($field_value) === '' && $field_data['field_required'])
{
return $this->user->lang('FIELD_REQUIRED', $field_data['lang_name']);
}
if ($field_data['field_minlen'] && utf8_strlen($field_value) < $field_data['field_minlen'])
{
return $this->user->lang('FIELD_TOO_SHORT', (int) $row['field_minlen'], $row['lang_name']);
}
else if ($field_data['field_maxlen'] && utf8_strlen($field_value) > $field_data['field_maxlen'])
{
return $this->user->lang('FIELD_TOO_LONG', (int) $row['field_maxlen'], $row['lang_name']);
}
if (!empty($field_data['field_validation']) && $field_data['field_validation'] != '.*')
{
$field_validate = ($field_type != 'text') ? $field_value : bbcode_nl2br($field_value);
if (!preg_match('#^' . str_replace('\\\\', '\\', $field_data['field_validation']) . '$#i', $field_validate))
{
switch ($row['field_validation'])
{
case '[0-9]+':
return $this->user->lang('FIELD_INVALID_CHARS_NUMBERS_ONLY', $row['lang_name']);
case '[\w]+':
return $this->user->lang('FIELD_INVALID_CHARS_ALPHA_ONLY', $row['lang_name']);
case '[\w_\+\. \-\[\]]+':
return $this->user->lang('FIELD_INVALID_CHARS_SPACERS_ONLY', $row['lang_name']);
}
}
}
return false;
}
/**
* {@inheritDoc}
*/
public function get_profile_value($field_value, $field_data)
{
if (!$field_value && !$field_data['field_show_novalue'])
{
return null;
}
$field_value = make_clickable($field_value);
$field_value = censor_text($field_value);
$field_value = bbcode_nl2br($field_value);
return $field_value;
}
/**
* {@inheritDoc}
*/
public function prepare_options_form(&$exclude_options, &$visibility_options)
{
$exclude_options[1][] = 'lang_default_value';
return $this->request->variable('lang_options', '', true);
}
}

View file

@ -0,0 +1,201 @@
<?php
/**
*
* @package phpBB
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace phpbb\profilefields\type;
class type_text extends type_string_common
{
/**
* Request object
* @var \phpbb\request\request
*/
protected $request;
/**
* Template object
* @var \phpbb\template\template
*/
protected $template;
/**
* User object
* @var \phpbb\user
*/
protected $user;
/**
* Construct
*
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
* @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
$this->request = $request;
$this->template = $template;
$this->user = $user;
}
/**
* {@inheritDoc}
*/
public function get_name_short()
{
return 'text';
}
/**
* {@inheritDoc}
*/
public function get_options($default_lang_id, $field_data)
{
$options = array(
0 => array('TITLE' => $this->user->lang['FIELD_LENGTH'], 'FIELD' => '<input type="number" min="0" max="99999" name="rows" size="5" value="' . $field_data['rows'] . '" /> ' . $this->user->lang['ROWS'] . '</dd><dd><input type="number" min="0" max="99999" name="columns" size="5" value="' . $field_data['columns'] . '" /> ' . $this->user->lang['COLUMNS'] . ' <input type="hidden" name="field_length" value="' . $field_data['field_length'] . '" />'),
1 => array('TITLE' => $this->user->lang['MIN_FIELD_CHARS'], 'FIELD' => '<input type="number" min="0" max="9999999999" name="field_minlen" size="10" value="' . $field_data['field_minlen'] . '" />'),
2 => array('TITLE' => $this->user->lang['MAX_FIELD_CHARS'], 'FIELD' => '<input type="number" min="0" max="9999999999" name="field_maxlen" size="10" value="' . $field_data['field_maxlen'] . '" />'),
3 => array('TITLE' => $this->user->lang['FIELD_VALIDATION'], 'FIELD' => '<select name="field_validation">' . $this->validate_options($field_data) . '</select>'),
);
return $options;
}
/**
* {@inheritDoc}
*/
public function get_default_option_values()
{
return array(
'field_length' => '5|80',
'field_minlen' => 0,
'field_maxlen' => 1000,
'field_validation' => '.*',
'field_novalue' => '',
'field_default_value' => '',
);
}
/**
* {@inheritDoc}
*/
public function get_profile_field($profile_row)
{
$var_name = 'pf_' . $profile_row['field_ident'];
return $this->request->variable($var_name, (string) $profile_row['field_default_value'], true);
}
/**
* {@inheritDoc}
*/
public function validate_profile_field(&$field_value, $field_data)
{
return $this->validate_string_profile_field('text', $field_value, $field_data);
}
/**
* {@inheritDoc}
*/
public function generate_field($profile_row, $preview_options = false)
{
$field_length = explode('|', $profile_row['field_length']);
$profile_row['field_rows'] = $field_length[0];
$profile_row['field_cols'] = $field_length[1];
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
$field_ident = $profile_row['field_ident'];
$default_value = $profile_row['lang_default_value'];
$profile_row['field_value'] = ($this->request->is_set($field_ident)) ? $this->request->variable($field_ident, $default_value, true) : ((!isset($this->user->profile_fields[$field_ident]) || $preview_options !== false) ? $default_value : $this->user->profile_fields[$field_ident]);
$this->template->assign_block_vars('text', array_change_key_case($profile_row, CASE_UPPER));
}
/**
* {@inheritDoc}
*/
public function get_database_column_type()
{
return 'MTEXT';
}
/**
* {@inheritDoc}
*/
public function get_language_options($field_data)
{
$options = array(
'lang_name' => 'string',
);
if ($field_data['lang_explain'])
{
$options['lang_explain'] = 'text';
}
if (strlen($field_data['lang_default_value']))
{
$options['lang_default_value'] = 'text';
}
return $options;
}
/**
* {@inheritDoc}
*/
public function get_excluded_options($key, $action, $current_value, &$field_data, $step)
{
if ($step == 2 && $key == 'field_length')
{
if ($this->request->is_set('rows'))
{
$field_data['rows'] = $this->request->variable('rows', 0);
$field_data['columns'] = $this->request->variable('columns', 0);
$current_value = $field_data['rows'] . '|' . $field_data['columns'];
}
else
{
$row_col = explode('|', $current_value);
$field_data['rows'] = $row_col[0];
$field_data['columns'] = $row_col[1];
}
return $current_value;
}
return parent::get_excluded_options($key, $action, $current_value, $field_data, $step);
}
/**
* {@inheritDoc}
*/
public function prepare_hidden_fields($step, $key, $action, &$field_data)
{
if ($key == 'field_length' && $this->request->is_set('rows'))
{
$field_data['rows'] = $this->request->variable('rows', 0);
$field_data['columns'] = $this->request->variable('columns', 0);
return $field_data['rows'] . '|' . $field_data['columns'];
}
return parent::prepare_hidden_fields($step, $key, $action, $field_data);
}
/**
* {@inheritDoc}
*/
public function display_options(&$template_vars, &$field_data)
{
$template_vars = array_merge($template_vars, array(
'S_TEXT' => true,
'L_DEFAULT_VALUE_EXPLAIN' => $this->user->lang['TEXT_DEFAULT_VALUE_EXPLAIN'],
'LANG_DEFAULT_VALUE' => $field_data['lang_default_value'],
));
}
}

View file

@ -1,31 +0,0 @@
<!-- BEGIN dropdown -->
<select name="{dropdown.FIELD_IDENT}" id="{dropdown.FIELD_IDENT}">
<!-- BEGIN options --><option value="{dropdown.options.OPTION_ID}"{dropdown.options.SELECTED}>{dropdown.options.VALUE}</option><!-- END options -->
</select>
<!-- END dropdown -->
<!-- BEGIN text -->
<textarea name="{text.FIELD_IDENT}" id="{text.FIELD_IDENT}" rows="{text.FIELD_ROWS}" cols="{text.FIELD_COLS}" class="inputbox autowidth">{text.FIELD_VALUE}</textarea>
<!-- END text -->
<!-- BEGIN string -->
<input type="text" class="inputbox autowidth" name="{string.FIELD_IDENT}" id="{string.FIELD_IDENT}" size="{string.FIELD_LENGTH}" maxlength="{string.FIELD_MAXLEN}" value="{string.FIELD_VALUE}" />
<!-- END string -->
<!-- BEGIN bool -->
<!-- IF bool.FIELD_LENGTH eq 1 -->
<!-- BEGIN options --><label for="{bool.FIELD_IDENT}_{bool.options.OPTION_ID}"><input type="radio" class="radio" name="{bool.FIELD_IDENT}" id="{bool.FIELD_IDENT}_{bool.options.OPTION_ID}" value="{bool.options.OPTION_ID}"{bool.options.CHECKED} /> {bool.options.VALUE}</label> <!-- END options -->
<!-- ELSE -->
<input type="checkbox" class="radio" name="{bool.FIELD_IDENT}" id="{bool.FIELD_IDENT}"<!-- IF bool.FIELD_VALUE --> checked="checked"<!-- ENDIF --> />
<!-- ENDIF -->
<!-- END bool -->
<!-- BEGIN int -->
<input type="number" min="{int.FIELD_MINLEN}" max="{int.FIELD_MAXLEN}" class="inputbox autowidth" name="{int.FIELD_IDENT}" id="{int.FIELD_IDENT}" size="{int.FIELD_LENGTH}" value="{int.FIELD_VALUE}" />
<!-- END int -->
<!-- BEGIN date -->
<label for="{date.FIELD_IDENT}_day">{L_DAY}{L_COLON} <select name="{date.FIELD_IDENT}_day" id="{date.FIELD_IDENT}_day">{date.S_DAY_OPTIONS}</select></label>
<label for="{date.FIELD_IDENT}_month">{L_MONTH}{L_COLON} <select name="{date.FIELD_IDENT}_month" id="{date.FIELD_IDENT}_month">{date.S_MONTH_OPTIONS}</select></label>
<label for="{date.FIELD_IDENT}_year">{L_YEAR}{L_COLON} <select name="{date.FIELD_IDENT}_year" id="{date.FIELD_IDENT}_year">{date.S_YEAR_OPTIONS}</select></label>
<!-- END date -->

View file

@ -0,0 +1,7 @@
<!-- BEGIN bool -->
<!-- IF bool.FIELD_LENGTH eq 1 -->
<!-- BEGIN options --><label for="{bool.FIELD_IDENT}_{bool.options.OPTION_ID}"><input type="radio" class="radio" name="{bool.FIELD_IDENT}" id="{bool.FIELD_IDENT}_{bool.options.OPTION_ID}" value="{bool.options.OPTION_ID}"{bool.options.CHECKED} /> {bool.options.VALUE}</label> <!-- END options -->
<!-- ELSE -->
<input type="checkbox" class="radio" name="{bool.FIELD_IDENT}" id="{bool.FIELD_IDENT}"<!-- IF bool.FIELD_VALUE --> checked="checked"<!-- ENDIF --> />
<!-- ENDIF -->
<!-- END bool -->

View file

@ -0,0 +1,5 @@
<!-- BEGIN date -->
<label for="{date.FIELD_IDENT}_day">{L_DAY}{L_COLON} <select name="{date.FIELD_IDENT}_day" id="{date.FIELD_IDENT}_day">{date.S_DAY_OPTIONS}</select></label>
<label for="{date.FIELD_IDENT}_month">{L_MONTH}{L_COLON} <select name="{date.FIELD_IDENT}_month" id="{date.FIELD_IDENT}_month">{date.S_MONTH_OPTIONS}</select></label>
<label for="{date.FIELD_IDENT}_year">{L_YEAR}{L_COLON} <select name="{date.FIELD_IDENT}_year" id="{date.FIELD_IDENT}_year">{date.S_YEAR_OPTIONS}</select></label>
<!-- END date -->

View file

@ -0,0 +1,5 @@
<!-- BEGIN dropdown -->
<select name="{dropdown.FIELD_IDENT}" id="{dropdown.FIELD_IDENT}">
<!-- BEGIN options --><option value="{dropdown.options.OPTION_ID}"{dropdown.options.SELECTED}>{dropdown.options.VALUE}</option><!-- END options -->
</select>
<!-- END dropdown -->

View file

@ -0,0 +1,3 @@
<!-- BEGIN int -->
<input type="number" min="{int.FIELD_MINLEN}" max="{int.FIELD_MAXLEN}" class="inputbox autowidth" name="{int.FIELD_IDENT}" id="{int.FIELD_IDENT}" size="{int.FIELD_LENGTH}" value="{int.FIELD_VALUE}" />
<!-- END int -->

View file

@ -0,0 +1,3 @@
<!-- BEGIN string -->
<input type="text" class="inputbox autowidth" name="{string.FIELD_IDENT}" id="{string.FIELD_IDENT}" size="{string.FIELD_LENGTH}" maxlength="{string.FIELD_MAXLEN}" value="{string.FIELD_VALUE}" />
<!-- END string -->

View file

@ -0,0 +1,3 @@
<!-- BEGIN text -->
<textarea name="{text.FIELD_IDENT}" id="{text.FIELD_IDENT}" rows="{text.FIELD_ROWS}" cols="{text.FIELD_COLS}" class="inputbox">{text.FIELD_VALUE}</textarea>
<!-- END text -->

View file

@ -1265,11 +1265,7 @@ $db->sql_freeresult($result);
// Load custom profile fields // Load custom profile fields
if ($config['load_cpf_viewtopic']) if ($config['load_cpf_viewtopic'])
{ {
if (!class_exists('custom_profile')) $cp = $phpbb_container->get('profilefields.manager');
{
include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
}
$cp = new custom_profile();
// Grab all profile fields from users in id cache for later use - similar to the poster cache // Grab all profile fields from users in id cache for later use - similar to the poster cache
$profile_fields_tmp = $cp->generate_profile_fields_template('grab', $id_cache); $profile_fields_tmp = $cp->generate_profile_fields_template('grab', $id_cache);

View file

@ -7,8 +7,6 @@
* *
*/ */
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_profile_fields.php';
class phpbb_profile_custom_test extends phpbb_database_test_case class phpbb_profile_custom_test extends phpbb_database_test_case
{ {
public function getDataSet() public function getDataSet()
@ -16,40 +14,68 @@ class phpbb_profile_custom_test extends phpbb_database_test_case
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/profile_fields.xml'); return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/profile_fields.xml');
} }
static public function dropdownFields() static public function dropdown_fields()
{ {
return array( return array(
// note, there is an offset of 1 between option_id (0-indexed) // note, there is an offset of 1 between option_id (0-indexed)
// in the database and values (1-indexed) to avoid problems with // in the database and values (1-indexed) to avoid problems with
// transmitting 0 in an HTML form // transmitting 0 in an HTML form
// required, value, expected // required, value, expected
array(1, '0', 'FIELD_INVALID_VALUE', 'Required field should throw error for out-of-range value'), array(1, '0', 'FIELD_INVALID_VALUE-field', 'Required field should throw error for out-of-range value'),
array(1, '1', 'FIELD_REQUIRED', 'Required field should throw error for default value'), array(1, '1', 'FIELD_REQUIRED-field', 'Required field should throw error for default value'),
array(1, '2', false, 'Required field should accept non-default value'), array(1, '2', false, 'Required field should accept non-default value'),
array(0, '0', 'FIELD_INVALID_VALUE', 'Optional field should throw error for out-of-range value'), array(0, '0', 'FIELD_INVALID_VALUE-field', 'Optional field should throw error for out-of-range value'),
array(0, '1', false, 'Optional field should accept default value'), array(0, '1', false, 'Optional field should accept default value'),
array(0, '2', false, 'Optional field should accept non-default value'), array(0, '2', false, 'Optional field should accept non-default value'),
); );
} }
/** /**
* @dataProvider dropdownFields * @dataProvider dropdown_fields
*/ */
public function test_dropdown_validate($field_required, $field_value, $expected, $description) public function test_dropdown_validate($field_required, $field_value, $expected, $description)
{ {
global $db; global $db, $table_prefix;
$db = $this->new_dbal(); $db = $this->new_dbal();
$field_data = array( $field_data = array(
'field_id' => 1, 'field_id' => 1,
'lang_id' => 1, 'lang_id' => 1,
'lang_name' => 'field',
'field_novalue' => 1, 'field_novalue' => 1,
'field_required' => $field_required, 'field_required' => $field_required,
); );
$user = $this->getMock('\phpbb\user');
$user->expects($this->any())
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
$cp = new custom_profile; $request = $this->getMock('\phpbb\request\request');
$result = $cp->validate_profile_field(FIELD_DROPDOWN, $field_value, $field_data); $template = $this->getMock('\phpbb\template\template');
$cp = new \phpbb\profilefields\type\type_dropdown(
new \phpbb\profilefields\lang_helper($db, $table_prefix . 'profile_fields_lang'),
new \phpbb\profilefields\profilefields(
$this->getMock('\phpbb\auth\auth'),
$db,
$request,
$template,
$user,
$table_prefix . 'profile_fields',
$table_prefix . 'profile_lang',
$table_prefix . 'profile_fields_data'
),
$request,
$template,
$user
);
$result = $cp->validate_profile_field($field_value, $field_data);
$this->assertEquals($expected, $result, $description); $this->assertEquals($expected, $result, $description);
} }
public function return_callback_implode()
{
return implode('-', func_get_args());
}
} }

View file

@ -10,21 +10,21 @@
<value>1</value> <value>1</value>
<value>1</value> <value>1</value>
<value>0</value> <value>0</value>
<value>5</value> <value>profilefields.type.dropdown</value>
<value>Default Option</value> <value>Default Option</value>
</row> </row>
<row> <row>
<value>1</value> <value>1</value>
<value>1</value> <value>1</value>
<value>1</value> <value>1</value>
<value>5</value> <value>profilefields.type.dropdown</value>
<value>First Alternative</value> <value>First Alternative</value>
</row> </row>
<row> <row>
<value>1</value> <value>1</value>
<value>1</value> <value>1</value>
<value>2</value> <value>2</value>
<value>5</value> <value>profilefields.type.dropdown</value>
<value>Third Alternative</value> <value>Third Alternative</value>
</row> </row>
</table> </table>