[phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an array

Get help with installation and running phpBB 3.3.x here. Please do not post bug reports, feature requests, or extension related questions here.
mhamza
Registered User
Posts: 40
Joined: Sun Oct 18, 2020 6:51 pm

[phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an array

Post by mhamza »

Code: Select all

[phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an array or an object that implements Countable
There is an error like this and I don't know what caused it. Does anyone know?
Attachments
Ekran Görüntüsü (286).png
User avatar
P_I
Registered User
Posts: 1323
Joined: Tue Mar 01, 2011 8:35 pm
Location: Staying home - Western Canada
Contact:

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by P_I »

What phpBB version are you using?

What PHP version?

Both are shown on the ACP->General tab.

Did you recently make any changes, such as updating/upgrading? Or has your hosting provider made some changes?

It would probably be helpful if you used Support Request Template Generator and posted the results back here.
Normal people… believe that if it ain’t broke, don’t fix it. Engineers believe that if it ain’t broke, it doesn’t have enough features yet. – Scott Adams
mhamza
Registered User
Posts: 40
Joined: Sun Oct 18, 2020 6:51 pm

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by mhamza »

PHP version: 7.3.23
PHPbb version: 3.3.2
I recently upgraded to the latest version and ran into this problem. In addition to the error logs, I also saw:{LOG TFA EXCEPTION}
TFA_INCORRECT_KEY
User avatar
P_I
Registered User
Posts: 1323
Joined: Tue Mar 01, 2011 8:35 pm
Location: Staying home - Western Canada
Contact:

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by P_I »

How did you upgrade and from what version?

Taking a guess you upgraded from 3.2 then recommended way is to follow https://www.phpbb.com/support/docs/en/3 ... upgrade32/
Normal people… believe that if it ain’t broke, don’t fix it. Engineers believe that if it ain’t broke, it doesn’t have enough features yet. – Scott Adams
User avatar
david63
Registered User
Posts: 18582
Joined: Thu Dec 19, 2002 8:08 am
Location: Lancashire, UK
Contact:

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by david63 »

That is essentially a PHP error. I suspect that you have one, or more, files from a previous version of phpBB
David
Remember: You only know what you know and - you don't know what you don't know!
My CDB Contributions | How to install an extension
I will not be accepting translations for any of my extensions in Github - please post any translations in the appropriate topic.
No support requests via PM or email as they will be ignored
User avatar
oxpus
Registered User
Posts: 24
Joined: Mon Feb 03, 2003 11:43 am
Location: D - Bad Wildungen
Name: Karsten Ude
Contact:

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by oxpus »

mhamza wrote:
Sun Nov 22, 2020 4:21 pm
{LOG TFA EXCEPTION} TFA_INCORRECT_KEY
Do you have installed the phpBB Two Factor Authentication?
The log error have been produced by this extension.
But this is not the reason for the error on your acp_profile.php.

Do you you have installed other extensions, too?
mhamza
Registered User
Posts: 40
Joined: Sun Oct 18, 2020 6:51 pm

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by mhamza »

david63 wrote:
Sun Nov 22, 2020 6:53 pm
That is essentially a PHP error. I suspect that you have one, or more, files from a previous version of phpBB
I updated from version 3.3.1. Almost all of my extensions are lower than 3.3.2 but I know the error is not caused by this. I do not know if the file is likely to remain because I have followed the update steps completely. The place where the error appears is exactly the location in the profile where we wrote the website. I uploaded the acp_profile.php file from the latest version to my ftp server, saying that there is no problem when it is installed from scratch, even there is an error in the file. I tried updating again but the error was still occurring. I guess it is not possible to predict what to do and what will cause it.
mhamza
Registered User
Posts: 40
Joined: Sun Oct 18, 2020 6:51 pm

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by mhamza »

oxpus wrote:
Sun Nov 22, 2020 7:06 pm
mhamza wrote:
Sun Nov 22, 2020 4:21 pm
{LOG TFA EXCEPTION} TFA_INCORRECT_KEY
Do you have installed the phpBB Two Factor Authentication?
The log error have been produced by this extension.
But this is not the reason for the error on your acp_profile.php.

Do you you have installed other extensions, too?
Sorry for misleading it had nothing to do with that error. But what you said is correct.
mhamza
Registered User
Posts: 40
Joined: Sun Oct 18, 2020 6:51 pm

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by mhamza »

I get an ajax error when I try to activate it.
Attachments
Ekran Görüntüsü (287).png
User avatar
oxpus
Registered User
Posts: 24
Joined: Mon Feb 03, 2003 11:43 am
Location: D - Bad Wildungen
Name: Karsten Ude
Contact:

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by oxpus »

I think your table phpbb_profile_lang is broken or incomplete.
Try these sql statements:

Code: Select all

DELETE FROM phpbb_profile_lang;
INSERT INTO phpbb_profile_lang (field_id, lang_id, lang_name, lang_explain, lang_default_value) (SELECT field_id, 2, UPPER(REPLACE(field_name, 'phpbb_','')), '', '' FROM phpbb_profile_fields);
These sql statements will set the default values on the table phpbb_profile_lang to build the base for the profile fields.
You can repeat the insert statement (and only this!) for each language which you have installed besides the english language. Just replace the id "2" in the select statement with the lang_id's from the table phpbb_lang.

After this you can edit and complete the profile fields manually.
At least this should fix the error messages.
mhamza
Registered User
Posts: 40
Joined: Sun Oct 18, 2020 6:51 pm

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by mhamza »

oxpus wrote:
Sun Nov 22, 2020 9:46 pm
I think your table phpbb_profile_lang is broken or incomplete.
Try these sql statements:

Code: Select all

DELETE FROM phpbb_profile_lang;
INSERT INTO phpbb_profile_lang (field_id, lang_id, lang_name, lang_explain, lang_default_value) (SELECT field_id, 2, UPPER(REPLACE(field_name, 'phpbb_','')), '', '' FROM phpbb_profile_fields);
These sql statements will set the default values on the table phpbb_profile_lang to build the base for the profile fields.
You can repeat the insert statement (and only this!) for each language which you have installed besides the english language. Just replace the id "2" in the select statement with the lang_id's from the table phpbb_lang.

After this you can edit and complete the profile fields manually.
At least this should fix the error messages.
I could not find any file with this name.
I wonder where I should look for this code.
Sorry, I'm novice in this matter.
my acp_profile.php file code

Code: Select all

<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
	exit;
}

class acp_profile
{
	var $u_action;

	var $edit_lang_id;
	var $lang_defs;

	/**
	 * @var \phpbb\di\service_collection
	 */
	protected $type_collection;

	function main($id, $mode)
	{
		global $config, $db, $user, $template;
		global $phpbb_root_path, $phpEx;
		global $request, $phpbb_container, $phpbb_log, $phpbb_dispatcher;

		if (!function_exists('generate_smilies'))
		{
			include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
		}

		if (!function_exists('user_get_id_name'))
		{
			include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
		}

		$user->add_lang(array('ucp', 'acp/profile'));
		$this->tpl_name = 'acp_profile';
		$this->page_title = 'ACP_CUSTOM_PROFILE_FIELDS';

		$field_id = $request->variable('field_id', 0);
		$action = (isset($_POST['create'])) ? 'create' : $request->variable('action', '');

		$error = array();

		$form_key = 'acp_profile';
		add_form_key($form_key);

		if (!$field_id && in_array($action, array('delete','activate', 'deactivate', 'move_up', 'move_down', 'edit')))
		{
			trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
		}

		/* @var $cp \phpbb\profilefields\manager */
		$cp = $phpbb_container->get('profilefields.manager');
		$this->type_collection = $phpbb_container->get('profilefields.type_collection');

		// Build Language array
		// Based on this, we decide which elements need to be edited later and which language items are missing
		$this->lang_defs = array();

		$sql = 'SELECT lang_id, lang_iso
			FROM ' . LANG_TABLE . '
			ORDER BY lang_english_name';
		$result = $db->sql_query($sql);

		while ($row = $db->sql_fetchrow($result))
		{
			// Make some arrays with all available languages
			$this->lang_defs['id'][$row['lang_id']] = $row['lang_iso'];
			$this->lang_defs['iso'][$row['lang_iso']] = $row['lang_id'];
		}
		$db->sql_freeresult($result);

		$sql = 'SELECT field_id, lang_id
			FROM ' . PROFILE_LANG_TABLE . '
			ORDER BY lang_id';
		$result = $db->sql_query($sql);

		while ($row = $db->sql_fetchrow($result))
		{
			// Which languages are available for each item
			$this->lang_defs['entry'][$row['field_id']][] = $row['lang_id'];
		}
		$db->sql_freeresult($result);

		// Have some fields been defined?
		if (isset($this->lang_defs['entry']))
		{
			foreach ($this->lang_defs['entry'] as $field_ident => $field_ary)
			{
				// Fill an array with the languages that are missing for each field
				$this->lang_defs['diff'][$field_ident] = array_diff(array_values($this->lang_defs['iso']), $field_ary);
			}
		}

		switch ($action)
		{
			case 'delete':

				if (confirm_box(true))
				{
					$sql = 'SELECT field_ident
						FROM ' . PROFILE_FIELDS_TABLE . "
						WHERE field_id = $field_id";
					$result = $db->sql_query($sql);
					$field_ident = (string) $db->sql_fetchfield('field_ident');
					$db->sql_freeresult($result);

					$db->sql_transaction('begin');

					$db->sql_query('DELETE FROM ' . PROFILE_FIELDS_TABLE . " WHERE field_id = $field_id");
					$db->sql_query('DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " WHERE field_id = $field_id");
					$db->sql_query('DELETE FROM ' . PROFILE_LANG_TABLE . " WHERE field_id = $field_id");

					/* @var $db_tools \phpbb\db\tools\tools_interface */
					$db_tools = $phpbb_container->get('dbal.tools');
					$db_tools->sql_column_remove(PROFILE_FIELDS_DATA_TABLE, 'pf_' . $field_ident);

					$order = 0;

					$sql = 'SELECT *
						FROM ' . PROFILE_FIELDS_TABLE . '
						ORDER BY field_order';
					$result = $db->sql_query($sql);

					while ($row = $db->sql_fetchrow($result))
					{
						$order++;
						if ($row['field_order'] != $order)
						{
							$sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
								SET field_order = $order
								WHERE field_id = {$row['field_id']}";
							$db->sql_query($sql);
						}
					}
					$db->sql_freeresult($result);

					$db->sql_transaction('commit');

					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_REMOVED', false, array($field_ident));
					trigger_error($user->lang['REMOVED_PROFILE_FIELD'] . adm_back_link($this->u_action));
				}
				else
				{
					confirm_box(false, 'DELETE_PROFILE_FIELD', build_hidden_fields(array(
						'i'			=> $id,
						'mode'		=> $mode,
						'action'	=> $action,
						'field_id'	=> $field_id,
					)));
				}

			break;

			case 'activate':

				if (!check_link_hash($request->variable('hash', ''), 'acp_profile'))
				{
					trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
				}

				$sql = 'SELECT lang_id
					FROM ' . LANG_TABLE . "
					WHERE lang_iso = '" . $db->sql_escape($config['default_lang']) . "'";
				$result = $db->sql_query($sql);
				$default_lang_id = (int) $db->sql_fetchfield('lang_id');
				$db->sql_freeresult($result);

				if (!in_array($default_lang_id, $this->lang_defs['entry'][$field_id]))
				{
					trigger_error($user->lang['DEFAULT_LANGUAGE_NOT_FILLED'] . adm_back_link($this->u_action), E_USER_WARNING);
				}

				$sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
					SET field_active = 1
					WHERE field_id = $field_id";
				$db->sql_query($sql);

				$sql = 'SELECT field_ident
					FROM ' . PROFILE_FIELDS_TABLE . "
					WHERE field_id = $field_id";
				$result = $db->sql_query($sql);
				$field_ident = (string) $db->sql_fetchfield('field_ident');
				$db->sql_freeresult($result);

				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_ACTIVATE', false, array($field_ident));

				if ($request->is_ajax())
				{
					$json_response = new \phpbb\json_response();
					$json_response->send(array(
						'text'	=> $user->lang('DEACTIVATE'),
					));
				}

				trigger_error($user->lang['PROFILE_FIELD_ACTIVATED'] . adm_back_link($this->u_action));

			break;

			case 'deactivate':

				if (!check_link_hash($request->variable('hash', ''), 'acp_profile'))
				{
					trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
				}

				$sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
					SET field_active = 0
					WHERE field_id = $field_id";
				$db->sql_query($sql);

				$sql = 'SELECT field_ident
					FROM ' . PROFILE_FIELDS_TABLE . "
					WHERE field_id = $field_id";
				$result = $db->sql_query($sql);
				$field_ident = (string) $db->sql_fetchfield('field_ident');
				$db->sql_freeresult($result);

				if ($request->is_ajax())
				{
					$json_response = new \phpbb\json_response();
					$json_response->send(array(
						'text'	=> $user->lang('ACTIVATE'),
					));
				}

				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_DEACTIVATE', false, array($field_ident));

				trigger_error($user->lang['PROFILE_FIELD_DEACTIVATED'] . adm_back_link($this->u_action));

			break;

			case 'move_up':
			case 'move_down':

				if (!check_link_hash($request->variable('hash', ''), 'acp_profile'))
				{
					trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
				}

				$sql = 'SELECT field_order
					FROM ' . PROFILE_FIELDS_TABLE . "
					WHERE field_id = $field_id";
				$result = $db->sql_query($sql);
				$field_order = $db->sql_fetchfield('field_order');
				$db->sql_freeresult($result);

				if ($field_order === false || ($field_order == 0 && $action == 'move_up'))
				{
					break;
				}
				$field_order = (int) $field_order;
				$order_total = $field_order * 2 + (($action == 'move_up') ? -1 : 1);

				$sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
					SET field_order = $order_total - field_order
					WHERE field_order IN ($field_order, " . (($action == 'move_up') ? $field_order - 1 : $field_order + 1) . ')';
				$db->sql_query($sql);

				if ($request->is_ajax())
				{
					$json_response = new \phpbb\json_response;
					$json_response->send(array(
						'success'	=> (bool) $db->sql_affectedrows(),
					));
				}

			break;

			case 'create':
			case 'edit':

				$step = $request->variable('step', 1);

				$submit = (isset($_REQUEST['next']) || isset($_REQUEST['prev'])) ? true : false;
				$save = (isset($_REQUEST['save'])) ? true : false;

				// The language id of default language
				$this->edit_lang_id = $this->lang_defs['iso'][$config['default_lang']];

				// We are editing... we need to grab basic things
				if ($action == 'edit')
				{
					$sql = 'SELECT l.*, f.*
						FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f
						WHERE l.lang_id = ' . $this->edit_lang_id . "
							AND f.field_id = $field_id
							AND l.field_id = f.field_id";
					$result = $db->sql_query($sql);
					$field_row = $db->sql_fetchrow($result);
					$db->sql_freeresult($result);

					if (!$field_row)
					{
						// Some admin changed the default language?
						$sql = 'SELECT l.*, f.*
							FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f
							WHERE l.lang_id <> ' . $this->edit_lang_id . "
							AND f.field_id = $field_id
							AND l.field_id = f.field_id";
						$result = $db->sql_query($sql);
						$field_row = $db->sql_fetchrow($result);
						$db->sql_freeresult($result);

						if (!$field_row)
						{
							trigger_error($user->lang['FIELD_NOT_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
						}

						$this->edit_lang_id = $field_row['lang_id'];
					}
					$field_type = $field_row['field_type'];
					$profile_field = $this->type_collection[$field_type];

					// Get language entries
					$sql = 'SELECT *
						FROM ' . PROFILE_FIELDS_LANG_TABLE . '
						WHERE lang_id = ' . $this->edit_lang_id . "
							AND field_id = $field_id
						ORDER BY option_id ASC";
					$result = $db->sql_query($sql);

					$lang_options = array();
					while ($row = $db->sql_fetchrow($result))
					{
						$lang_options[$row['option_id']] = $row['lang_value'];
					}
					$db->sql_freeresult($result);

					$s_hidden_fields = '<input type="hidden" name="field_id" value="' . $field_id . '" />';
				}
				else
				{
					// We are adding a new field, define basic params
					$lang_options = $field_row = array();

					$field_type = $request->variable('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);
					}

					$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->variable('field_ident', '', true))),
						'field_required'	=> 0,
						'field_show_novalue'=> 0,
						'field_hide'		=> 0,
						'field_show_profile'=> 0,
						'field_no_view'		=> 0,
						'field_show_on_reg'	=> 0,
						'field_show_on_pm'	=> 0,
						'field_show_on_vt'	=> 0,
						'field_show_on_ml'	=> 0,
						'field_is_contact'	=> 0,
						'field_contact_desc'=> '',
						'field_contact_url'	=> '',
						'lang_name'			=> $request->variable('field_ident', '', true),
						'lang_explain'		=> '',
						'lang_default_value'=> '')
					);

					$s_hidden_fields = '<input type="hidden" name="field_type" value="' . $field_type . '" />';
				}

				// $exclude contains the data we gather in each step
				$exclude = array(
					1	=> array('field_ident', 'lang_name', 'lang_explain', 'field_option_none', 'field_show_on_reg', 'field_show_on_pm', 'field_show_on_vt', 'field_show_on_ml', 'field_required', 'field_show_novalue', 'field_hide', 'field_show_profile', 'field_no_view', 'field_is_contact', 'field_contact_desc', 'field_contact_url'),
					2	=> array('field_length', 'field_maxlen', 'field_minlen', 'field_validation', 'field_novalue', 'field_default_value'),
					3	=> array('l_lang_name', 'l_lang_explain', 'l_lang_default_value', 'l_lang_options')
				);

				// Visibility Options...
				$visibility_ary = array(
					'field_required',
					'field_show_novalue',
					'field_show_on_reg',
					'field_show_on_pm',
					'field_show_on_vt',
					'field_show_on_ml',
					'field_show_profile',
					'field_hide',
					'field_is_contact',
				);

				/**
				* Event to add initialization for new profile field table fields
				*
				* @event core.acp_profile_create_edit_init
				* @var	string	action			create|edit
				* @var	int		step			Configuration step (1|2|3)
				* @var	bool	submit			Form has been submitted
				* @var	bool	save			Configuration should be saved
				* @var	string	field_type		Type of the field we are dealing with
				* @var	array	field_row		Array of data about the field
				* @var	array	exclude			Array of excluded fields by step
				* @var	array	visibility_ary	Array of fields that are visibility related
				* @since 3.1.6-RC1
				*/
				$vars = array(
					'action',
					'step',
					'submit',
					'save',
					'field_type',
					'field_row',
					'exclude',
					'visibility_ary',
				);
				extract($phpbb_dispatcher->trigger_event('core.acp_profile_create_edit_init', compact($vars)));

				$options = $profile_field->prepare_options_form($exclude, $visibility_ary);

				$cp->vars['field_ident']		= ($action == 'create' && $step == 1) ? utf8_clean_string($request->variable('field_ident', $field_row['field_ident'], true)) : $request->variable('field_ident', $field_row['field_ident']);
				$cp->vars['lang_name']			= $request->variable('lang_name', $field_row['lang_name'], true);
				$cp->vars['lang_explain']		= $request->variable('lang_explain', $field_row['lang_explain'], true);
				$cp->vars['lang_default_value']	= $request->variable('lang_default_value', $field_row['lang_default_value'], true);
				$cp->vars['field_contact_desc']	= $request->variable('field_contact_desc', $field_row['field_contact_desc'], true);
				$cp->vars['field_contact_url']	= $request->variable('field_contact_url', $field_row['field_contact_url'], true);

				foreach ($visibility_ary as $val)
				{
					$cp->vars[$val] = ($submit || $save) ? $request->variable($val, 0) : $field_row[$val];
				}

				$cp->vars['field_no_view'] = $request->variable('field_no_view', (int) $field_row['field_no_view']);

				// If the user has submitted a form with options (i.e. dropdown field)
				if ($options)
				{
					$exploded_options = (is_array($options)) ? $options : explode("\n", $options);

					if (count($exploded_options) == count($lang_options) || $action == 'create')
					{
						// The number of options in the field is equal to the number of options already in the database
						// Or we are creating a new dropdown list.
						$cp->vars['lang_options'] = $exploded_options;
					}
					else if ($action == 'edit')
					{
						// Changing the number of options? (We remove and re-create the option fields)
						$cp->vars['lang_options'] = $exploded_options;
					}
				}
				else
				{
					$cp->vars['lang_options'] = $lang_options;
				}

				// step 2
				foreach ($exclude[2] as $key)
				{
					$var = $request->variable($key, $field_row[$key], true);

					$field_data = $cp->vars;
					$var = $profile_field->get_excluded_options($key, $action, $var, $field_data, 2);
					$cp->vars = $field_data;

					$cp->vars[$key] = $var;
				}

				// step 3 - all arrays
				if ($action == 'edit')
				{
					// Get language entries
					$sql = 'SELECT *
						FROM ' . PROFILE_FIELDS_LANG_TABLE . '
						WHERE lang_id <> ' . $this->edit_lang_id . "
							AND field_id = $field_id
						ORDER BY option_id ASC";
					$result = $db->sql_query($sql);

					$l_lang_options = array();
					while ($row = $db->sql_fetchrow($result))
					{
						$l_lang_options[$row['lang_id']][$row['option_id']] = $row['lang_value'];
					}
					$db->sql_freeresult($result);

					$sql = 'SELECT lang_id, lang_name, lang_explain, lang_default_value
						FROM ' . PROFILE_LANG_TABLE . '
						WHERE lang_id <> ' . $this->edit_lang_id . "
							AND field_id = $field_id
						ORDER BY lang_id ASC";
					$result = $db->sql_query($sql);

					$l_lang_name = $l_lang_explain = $l_lang_default_value = array();
					while ($row = $db->sql_fetchrow($result))
					{
						$l_lang_name[$row['lang_id']] = $row['lang_name'];
						$l_lang_explain[$row['lang_id']] = $row['lang_explain'];
						$l_lang_default_value[$row['lang_id']] = $row['lang_default_value'];
					}
					$db->sql_freeresult($result);
				}

				foreach ($exclude[3] as $key)
				{
					$cp->vars[$key] = $request->variable($key, array(0 => ''), true);

					if (!$cp->vars[$key] && $action == 'edit')
					{
						$cp->vars[$key] = ${$key};
					}

					$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
				if ($submit) //  && $step == 1
				{
					// Check values for step 1
					if ($cp->vars['field_ident'] == '')
					{
						$error[] = $user->lang['EMPTY_FIELD_IDENT'];
					}

					if (!preg_match('/^[a-z_]+$/', $cp->vars['field_ident']))
					{
						$error[] = $user->lang['INVALID_CHARS_FIELD_IDENT'];
					}

					if (strlen($cp->vars['field_ident']) > 17)
					{
						$error[] = $user->lang['INVALID_FIELD_IDENT_LEN'];
					}

					if ($cp->vars['lang_name'] == '')
					{
						$error[] = $user->lang['EMPTY_USER_FIELD_NAME'];
					}

					$error = $profile_field->validate_options_on_submit($error, $cp->vars);

					// Check for already existing field ident
					if ($action != 'edit')
					{
						$sql = 'SELECT field_ident
							FROM ' . PROFILE_FIELDS_TABLE . "
							WHERE field_ident = '" . $db->sql_escape($cp->vars['field_ident']) . "'";
						$result = $db->sql_query($sql);
						$row = $db->sql_fetchrow($result);
						$db->sql_freeresult($result);

						if ($row)
						{
							$error[] = $user->lang['FIELD_IDENT_ALREADY_EXIST'];
						}
					}
				}

				if (count($error))
				{
					$submit = false;
				}
				else
				{
					$step = (isset($_REQUEST['next'])) ? $step + 1 : ((isset($_REQUEST['prev'])) ? $step - 1 : $step);
				}

				// Build up the specific hidden fields
				foreach ($exclude as $num => $key_ary)
				{
					if ($num == $step)
					{
						continue;
					}

					$_new_key_ary = array();

					$field_data = $cp->vars;
					foreach ($key_ary as $key)
					{
						$var = $profile_field->prepare_hidden_fields($step, $key, $action, $field_data);
						if ($var !== null)
						{
							$_new_key_ary[$key] = $var;
						}
					}
					$cp->vars = $field_data;

					$s_hidden_fields .= build_hidden_fields($_new_key_ary);
				}

				if (!count($error))
				{
					if (($step == 3 && (count($this->lang_defs['iso']) == 1 || $save)) || ($action == 'edit' && $save))
					{
						if (!check_form_key($form_key))
						{
							trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
						}

						$this->save_profile_field($cp, $field_type, $action);
					}
				}

				$template->assign_vars(array(
					'S_EDIT'			=> true,
					'S_EDIT_MODE'		=> ($action == 'edit') ? true : false,
					'ERROR_MSG'			=> (count($error)) ? implode('<br />', $error) : '',

					'L_TITLE'			=> $user->lang['STEP_' . $step . '_TITLE_' . strtoupper($action)],
					'L_EXPLAIN'			=> $user->lang['STEP_' . $step . '_EXPLAIN_' . strtoupper($action)],

					'U_ACTION'			=> $this->u_action . "&amp;action=$action&amp;step=$step",
					'U_BACK'			=> $this->u_action)
				);

				// Now go through the steps
				switch ($step)
				{
					// Create basic options - only small differences between field types
					case 1:
						$template_vars = array(
							'S_STEP_ONE'		=> true,
							'S_FIELD_REQUIRED'	=> ($cp->vars['field_required']) ? true : false,
							'S_FIELD_SHOW_NOVALUE'=> ($cp->vars['field_show_novalue']) ? true : false,
							'S_SHOW_ON_REG'		=> ($cp->vars['field_show_on_reg']) ? true : false,
							'S_SHOW_ON_PM'		=> ($cp->vars['field_show_on_pm']) ? true : false,
							'S_SHOW_ON_VT'		=> ($cp->vars['field_show_on_vt']) ? true : false,
							'S_SHOW_ON_MEMBERLIST'=> ($cp->vars['field_show_on_ml']) ? true : false,
							'S_FIELD_HIDE'		=> ($cp->vars['field_hide']) ? true : false,
							'S_SHOW_PROFILE'	=> ($cp->vars['field_show_profile']) ? true : false,
							'S_FIELD_NO_VIEW'	=> ($cp->vars['field_no_view']) ? true : false,
							'S_FIELD_CONTACT'	=> $cp->vars['field_is_contact'],
							'FIELD_CONTACT_DESC'=> $cp->vars['field_contact_desc'],
							'FIELD_CONTACT_URL'	=> $cp->vars['field_contact_url'],

							'L_LANG_SPECIFIC'	=> sprintf($user->lang['LANG_SPECIFIC_OPTIONS'], $config['default_lang']),
							'FIELD_TYPE'		=> $profile_field->get_name(),
							'FIELD_IDENT'		=> $cp->vars['field_ident'],
							'LANG_NAME'			=> $cp->vars['lang_name'],
							'LANG_EXPLAIN'		=> $cp->vars['lang_explain'],
						);

						$field_data = $cp->vars;
						$profile_field->display_options($template_vars, $field_data);
						$cp->vars = $field_data;

						// Build common create options
						$template->assign_vars($template_vars);
					break;

					case 2:

						$template->assign_vars(array(
							'S_STEP_TWO'		=> true,
							'L_NEXT_STEP'			=> (count($this->lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS'])
						);

						// Build options based on profile type
						$options = $profile_field->get_options($this->lang_defs['iso'][$config['default_lang']], $cp->vars);

						foreach ($options as $num => $option_ary)
						{
							$template->assign_block_vars('option', $option_ary);
						}

					break;

					// Define remaining language variables
					case 3:

						$template->assign_var('S_STEP_THREE', true);
						$options = $this->build_language_options($cp, $field_type, $action);

						foreach ($options as $lang_id => $lang_ary)
						{
							$template->assign_block_vars('options', array(
								'LANGUAGE'		=> sprintf($user->lang[(($lang_id == $this->edit_lang_id) ? 'DEFAULT_' : '') . 'ISO_LANGUAGE'], $lang_ary['lang_iso']))
							);

							foreach ($lang_ary['fields'] as $field_ident => $field_ary)
							{
								$template->assign_block_vars('options.field', array(
									'L_TITLE'		=> $field_ary['TITLE'],
									'L_EXPLAIN'		=> (isset($field_ary['EXPLAIN'])) ? $field_ary['EXPLAIN'] : '',
									'FIELD'			=> $field_ary['FIELD'])
								);
							}
						}

					break;
				}

				$field_data = $cp->vars;
				/**
				* Event to add template variables for new profile field table fields
				*
				* @event core.acp_profile_create_edit_after
				* @var	string	action			create|edit
				* @var	int		step			Configuration step (1|2|3)
				* @var	bool	submit			Form has been submitted
				* @var	bool	save			Configuration should be saved
				* @var	string	field_type		Type of the field we are dealing with
				* @var	array	field_data		Array of data about the field
				* @var	array	s_hidden_fields	Array of hidden fields in case this needs modification
				* @var	array	options			Array of options specific to this step
				* @since 3.1.6-RC1
				*/
				$vars = array(
					'action',
					'step',
					'submit',
					'save',
					'field_type',
					'field_data',
					's_hidden_fields',
					'options',
				);
				extract($phpbb_dispatcher->trigger_event('core.acp_profile_create_edit_after', compact($vars)));

				$template->assign_vars(array(
					'S_HIDDEN_FIELDS'	=> $s_hidden_fields)
				);

				return;

			break;
		}

		$tpl_name = $this->tpl_name;
		$page_title = $this->page_title;
		$u_action = $this->u_action;

		/**
		* Event to handle actions on the ACP profile fields page
		*
		* @event core.acp_profile_action
		* @var	string	action		Action that is being performed
		* @var	string	tpl_name	Template file to load
		* @var	string	page_title	Page title
		* @var	string	u_action	The URL we are at, read only
		* @since 3.2.2-RC1
		*/
		$vars = array(
			'action',
			'tpl_name',
			'page_title',
			'u_action',
		);
		extract($phpbb_dispatcher->trigger_event('core.acp_profile_action', compact($vars)));

		$this->tpl_name = $tpl_name;
		$this->page_title = $page_title;
		unset($u_action);

		$sql = 'SELECT *
			FROM ' . PROFILE_FIELDS_TABLE . '
			ORDER BY field_order';
		$result = $db->sql_query($sql);

		$s_one_need_edit = false;
		while ($row = $db->sql_fetchrow($result))
		{
			$active_lang = (!$row['field_active']) ? 'ACTIVATE' : 'DEACTIVATE';
			$active_value = (!$row['field_active']) ? 'activate' : 'deactivate';
			$id = $row['field_id'];

			$s_need_edit = (count($this->lang_defs['diff'][$row['field_id']])) ? true : false;

			if ($s_need_edit)
			{
				$s_one_need_edit = true;
			}

			if (!isset($this->type_collection[$row['field_type']]))
			{
				continue;
			}
			$profile_field = $this->type_collection[$row['field_type']];

			$field_block = array(
				'FIELD_IDENT'		=> $row['field_ident'],
				'FIELD_TYPE'		=> $profile_field->get_name(),

				'L_ACTIVATE_DEACTIVATE'		=> $user->lang[$active_lang],
				'U_ACTIVATE_DEACTIVATE'		=> $this->u_action . "&amp;action=$active_value&amp;field_id=$id" . '&amp;hash=' . generate_link_hash('acp_profile'),
				'U_EDIT'					=> $this->u_action . "&amp;action=edit&amp;field_id=$id",
				'U_TRANSLATE'				=> $this->u_action . "&amp;action=edit&amp;field_id=$id&amp;step=3",
				'U_DELETE'					=> $this->u_action . "&amp;action=delete&amp;field_id=$id",
				'U_MOVE_UP'					=> $this->u_action . "&amp;action=move_up&amp;field_id=$id" . '&amp;hash=' . generate_link_hash('acp_profile'),
				'U_MOVE_DOWN'				=> $this->u_action . "&amp;action=move_down&amp;field_id=$id" . '&amp;hash=' . generate_link_hash('acp_profile'),

				'S_NEED_EDIT'				=> $s_need_edit,
			);

			/**
			* Event to modify profile field data before it is assigned to the template
			*
			* @event core.acp_profile_modify_profile_row
			* @var	array	row				Array with data for the current profile field
			* @var	array	field_block		Template data that is being assigned to the 'fields' block
			* @var	object	profile_field	A profile field instance, implements \phpbb\profilefields\type\type_base
			* @since 3.2.2-RC1
			*/
			$vars = array(
				'row',
				'field_block',
				'profile_field',
			);
			extract($phpbb_dispatcher->trigger_event('core.acp_profile_modify_profile_row', compact($vars)));

			$template->assign_block_vars('fields', $field_block);
		}
		$db->sql_freeresult($result);

		// At least one option field needs editing?
		if ($s_one_need_edit)
		{
			$template->assign_var('S_NEED_EDIT', true);
		}

		$s_select_type = '';
		foreach ($this->type_collection as $key => $profile_field)
		{
			$s_select_type .= '<option value="' . $key . '">' . $profile_field->get_name() . '</option>';
		}

		$template->assign_vars(array(
			'U_ACTION'			=> $this->u_action,
			'S_TYPE_OPTIONS'	=> $s_select_type,
		));
	}

	/**
	* Build all Language specific options
	*/
	function build_language_options($cp, $field_type, $action = 'create')
	{
		global $user, $config, $db, $request;

		$default_lang_id = (!empty($this->edit_lang_id)) ? $this->edit_lang_id : $this->lang_defs['iso'][$config['default_lang']];

		$sql = 'SELECT lang_id, lang_iso
			FROM ' . LANG_TABLE . '
			WHERE lang_id <> ' . (int) $default_lang_id . '
			ORDER BY lang_english_name';
		$result = $db->sql_query($sql);

		$languages = array();
		while ($row = $db->sql_fetchrow($result))
		{
			$languages[$row['lang_id']] = $row['lang_iso'];
		}
		$db->sql_freeresult($result);

		$profile_field = $this->type_collection[$field_type];
		$options = $profile_field->get_language_options($cp->vars);

		$lang_options = array();

		foreach ($options as $field => $field_type)
		{
			$lang_options[1]['lang_iso'] = $this->lang_defs['id'][$default_lang_id];
			$lang_options[1]['fields'][$field] = array(
				'TITLE'		=> $user->lang['CP_' . strtoupper($field)],
				'FIELD'		=> '<dd>' . ((is_array($cp->vars[$field])) ? implode('<br />', $cp->vars[$field]) : bbcode_nl2br($cp->vars[$field])) . '</dd>'
			);

			if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
			{
				$lang_options[1]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
			}
		}

		foreach ($languages as $lang_id => $lang_iso)
		{
			$lang_options[$lang_id]['lang_iso'] = $lang_iso;
			foreach ($options as $field => $field_type)
			{
				$value = ($action == 'create') ? $request->variable('l_' . $field, array(0 => ''), true) : $cp->vars['l_' . $field];
				if ($field == 'lang_options')
				{
					$var = (!isset($cp->vars['l_lang_options'][$lang_id]) || !is_array($cp->vars['l_lang_options'][$lang_id])) ? $cp->vars['lang_options'] : $cp->vars['l_lang_options'][$lang_id];

					switch ($field_type)
					{
						case 'two_options':

							$lang_options[$lang_id]['fields'][$field] = array(
								'TITLE'		=> $user->lang['CP_' . strtoupper($field)],
								'FIELD'		=> '
											<dd><input class="medium" name="l_' . $field . '[' . $lang_id . '][]" value="' . ((isset($value[$lang_id][0])) ? $value[$lang_id][0] : $var[0]) . '" /> ' . $user->lang['FIRST_OPTION'] . '</dd>
											<dd><input class="medium" name="l_' . $field . '[' . $lang_id . '][]" value="' . ((isset($value[$lang_id][1])) ? $value[$lang_id][1] : $var[1]) . '" /> ' . $user->lang['SECOND_OPTION'] . '</dd>'
							);
						break;

						case 'optionfield':
							$value = ((isset($value[$lang_id])) ? ((is_array($value[$lang_id])) ?  implode("\n", $value[$lang_id]) : $value[$lang_id]) : implode("\n", $var));
							$lang_options[$lang_id]['fields'][$field] = array(
								'TITLE'		=> $user->lang['CP_' . strtoupper($field)],
								'FIELD'		=> '<dd><textarea name="l_' . $field . '[' . $lang_id . ']" rows="7" cols="80">' . $value . '</textarea></dd>'
							);
						break;
					}

					if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
					{
						$lang_options[$lang_id]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
					}
				}
				else
				{
					$var = ($action == 'create' || !is_array($cp->vars[$field])) ? $cp->vars[$field] : $cp->vars[$field][$lang_id];

					$lang_options[$lang_id]['fields'][$field] = array(
						'TITLE'		=> $user->lang['CP_' . strtoupper($field)],
						'FIELD'		=> ($field_type == 'string') ? '<dd><input class="medium" type="text" name="l_' . $field . '[' . $lang_id . ']" value="' . ((isset($value[$lang_id])) ? $value[$lang_id] : $var) . '" /></dd>' : '<dd><textarea name="l_' . $field . '[' . $lang_id . ']" rows="3" cols="80">' . ((isset($value[$lang_id])) ? $value[$lang_id] : $var) . '</textarea></dd>'
					);

					if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
					{
						$lang_options[$lang_id]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
					}
				}
			}
		}

		return $lang_options;
	}

	/**
	* Save Profile Field
	*/
	function save_profile_field($cp, $field_type, $action = 'create')
	{
		global $db, $config, $user, $phpbb_container, $phpbb_log, $request, $phpbb_dispatcher;

		$field_id = $request->variable('field_id', 0);

		// Collect all information, if something is going wrong, abort the operation
		$profile_sql = $profile_lang = $empty_lang = $profile_lang_fields = array();

		$default_lang_id = (!empty($this->edit_lang_id)) ? $this->edit_lang_id : $this->lang_defs['iso'][$config['default_lang']];

		if ($action == 'create')
		{
			$sql = 'SELECT MAX(field_order) as max_field_order
				FROM ' . PROFILE_FIELDS_TABLE;
			$result = $db->sql_query($sql);
			$new_field_order = (int) $db->sql_fetchfield('max_field_order');
			$db->sql_freeresult($result);

			$field_ident = $cp->vars['field_ident'];
		}

		// Save the field
		$profile_fields = array(
			'field_length'			=> $cp->vars['field_length'],
			'field_minlen'			=> $cp->vars['field_minlen'],
			'field_maxlen'			=> $cp->vars['field_maxlen'],
			'field_novalue'			=> $cp->vars['field_novalue'],
			'field_default_value'	=> $cp->vars['field_default_value'],
			'field_validation'		=> $cp->vars['field_validation'],
			'field_required'		=> $cp->vars['field_required'],
			'field_show_novalue'	=> $cp->vars['field_show_novalue'],
			'field_show_on_reg'		=> $cp->vars['field_show_on_reg'],
			'field_show_on_pm'		=> $cp->vars['field_show_on_pm'],
			'field_show_on_vt'		=> $cp->vars['field_show_on_vt'],
			'field_show_on_ml'		=> $cp->vars['field_show_on_ml'],
			'field_hide'			=> $cp->vars['field_hide'],
			'field_show_profile'	=> $cp->vars['field_show_profile'],
			'field_no_view'			=> $cp->vars['field_no_view'],
			'field_is_contact'		=> $cp->vars['field_is_contact'],
			'field_contact_desc'	=> $cp->vars['field_contact_desc'],
			'field_contact_url'		=> $cp->vars['field_contact_url'],
		);

		$field_data = $cp->vars;
		/**
		* Event to modify profile field configuration data before saving to database
		*
		* @event core.acp_profile_create_edit_save_before
		* @var	string	action			create|edit
		* @var	string	field_type		Type of the field we are dealing with
		* @var	array	field_data		Array of data about the field
		* @var	array	profile_fields	Array of fields to be sent to the database
		* @since 3.1.6-RC1
		*/
		$vars = array(
			'action',
			'field_type',
			'field_data',
			'profile_fields',
		);
		extract($phpbb_dispatcher->trigger_event('core.acp_profile_create_edit_save_before', compact($vars)));

		if ($action == 'create')
		{
			$profile_fields += array(
				'field_type'		=> $field_type,
				'field_ident'		=> $field_ident,
				'field_name'		=> $field_ident,
				'field_order'		=> $new_field_order + 1,
				'field_active'		=> 1
			);

			$sql = 'INSERT INTO ' . PROFILE_FIELDS_TABLE . ' ' . $db->sql_build_array('INSERT', $profile_fields);
			$db->sql_query($sql);

			$field_id = $db->sql_nextid();
		}
		else
		{
			$sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . '
				SET ' . $db->sql_build_array('UPDATE', $profile_fields) . "
				WHERE field_id = $field_id";
			$db->sql_query($sql);
		}

		$profile_field = $this->type_collection[$field_type];

		if ($action == 'create')
		{
			$field_ident = 'pf_' . $field_ident;
			/* @var $db_tools \phpbb\db\tools\tools_interface */
			$db_tools = $phpbb_container->get('dbal.tools');
			$db_tools->sql_column_add(PROFILE_FIELDS_DATA_TABLE, $field_ident, array($profile_field->get_database_column_type(), null));
		}

		$sql_ary = array(
			'lang_name'				=> $cp->vars['lang_name'],
			'lang_explain'			=> $cp->vars['lang_explain'],
			'lang_default_value'	=> $cp->vars['lang_default_value']
		);

		if ($action == 'create')
		{
			$sql_ary['field_id'] = $field_id;
			$sql_ary['lang_id'] = $default_lang_id;

			$profile_sql[] = 'INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
		}
		else
		{
			$this->update_insert(PROFILE_LANG_TABLE, $sql_ary, array('field_id' => $field_id, 'lang_id' => $default_lang_id));
		}

		if (is_array($cp->vars['l_lang_name']) && count($cp->vars['l_lang_name']))
		{
			foreach ($cp->vars['l_lang_name'] as $lang_id => $data)
			{
				if (($cp->vars['lang_name'] != '' && $cp->vars['l_lang_name'][$lang_id] == '')
					|| ($cp->vars['lang_explain'] != '' && $cp->vars['l_lang_explain'][$lang_id] == '')
					|| ($cp->vars['lang_default_value'] != '' && $cp->vars['l_lang_default_value'][$lang_id] == ''))
				{
					$empty_lang[$lang_id] = true;
					break;
				}

				if (!isset($empty_lang[$lang_id]))
				{
					$profile_lang[] = array(
						'field_id'		=> $field_id,
						'lang_id'		=> $lang_id,
						'lang_name'		=> $cp->vars['l_lang_name'][$lang_id],
						'lang_explain'	=> (isset($cp->vars['l_lang_explain'][$lang_id])) ? $cp->vars['l_lang_explain'][$lang_id] : '',
						'lang_default_value'	=> (isset($cp->vars['l_lang_default_value'][$lang_id])) ? $cp->vars['l_lang_default_value'][$lang_id] : ''
					);
				}
			}

			foreach ($empty_lang as $lang_id => $NULL)
			{
				$sql = 'DELETE FROM ' . PROFILE_LANG_TABLE . "
					WHERE field_id = $field_id
					AND lang_id = " . (int) $lang_id;
				$db->sql_query($sql);
			}
		}

		$cp->vars = $profile_field->get_language_options_input($cp->vars);

		if ($cp->vars['lang_options'])
		{
			if (!is_array($cp->vars['lang_options']))
			{
				$cp->vars['lang_options'] = explode("\n", $cp->vars['lang_options']);
			}

			if ($action != 'create')
			{
				$sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . "
					WHERE field_id = $field_id
						AND lang_id = " . (int) $default_lang_id;
				$db->sql_query($sql);
			}

			foreach ($cp->vars['lang_options'] as $option_id => $value)
			{
				$sql_ary = array(
					'field_type'	=> $field_type,
					'lang_value'	=> $value
				);

				if ($action == 'create')
				{
					$sql_ary['field_id'] = $field_id;
					$sql_ary['lang_id'] = $default_lang_id;
					$sql_ary['option_id'] = (int) $option_id;

					$profile_sql[] = 'INSERT INTO ' . PROFILE_FIELDS_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
				}
				else
				{
					$this->update_insert(PROFILE_FIELDS_LANG_TABLE, $sql_ary, array(
						'field_id'	=> $field_id,
						'lang_id'	=> (int) $default_lang_id,
						'option_id'	=> (int) $option_id)
					);
				}
			}
		}

		if (is_array($cp->vars['l_lang_options']) && count($cp->vars['l_lang_options']))
		{
			$empty_lang = array();

			foreach ($cp->vars['l_lang_options'] as $lang_id => $lang_ary)
			{
				if (!is_array($lang_ary))
				{
					$lang_ary = explode("\n", $lang_ary);
				}

				if (count($lang_ary) != count($cp->vars['lang_options']))
				{
					$empty_lang[$lang_id] = true;
				}

				if (!isset($empty_lang[$lang_id]))
				{
					if ($action != 'create')
					{
						$sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . "
							WHERE field_id = $field_id
							AND lang_id = " . (int) $lang_id;
						$db->sql_query($sql);
					}

					foreach ($lang_ary as $option_id => $value)
					{
						$profile_lang_fields[] = array(
							'field_id'		=> (int) $field_id,
							'lang_id'		=> (int) $lang_id,
							'option_id'		=> (int) $option_id,
							'field_type'	=> $field_type,
							'lang_value'	=> $value
						);
					}
				}
			}

			foreach ($empty_lang as $lang_id => $NULL)
			{
				$sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . "
					WHERE field_id = $field_id
					AND lang_id = " . (int) $lang_id;
				$db->sql_query($sql);
			}
		}

		foreach ($profile_lang as $sql)
		{
			if ($action == 'create')
			{
				$profile_sql[] = 'INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql);
			}
			else
			{
				$lang_id = $sql['lang_id'];
				unset($sql['lang_id'], $sql['field_id']);

				$this->update_insert(PROFILE_LANG_TABLE, $sql, array('lang_id' => (int) $lang_id, 'field_id' => $field_id));
			}
		}

		if (count($profile_lang_fields))
		{
			foreach ($profile_lang_fields as $sql)
			{
				if ($action == 'create')
				{
					$profile_sql[] = 'INSERT INTO ' . PROFILE_FIELDS_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql);
				}
				else
				{
					$lang_id = $sql['lang_id'];
					$option_id = $sql['option_id'];
					unset($sql['lang_id'], $sql['field_id'], $sql['option_id']);

					$this->update_insert(PROFILE_FIELDS_LANG_TABLE, $sql, array(
						'lang_id'	=> $lang_id,
						'field_id'	=> $field_id,
						'option_id'	=> $option_id)
					);
				}
			}
		}

		$db->sql_transaction('begin');

		if ($action == 'create')
		{
			foreach ($profile_sql as $sql)
			{
				$db->sql_query($sql);
			}
		}

		$db->sql_transaction('commit');

		if ($action == 'edit')
		{
			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_EDIT', false, array($cp->vars['field_ident'] . ':' . $cp->vars['lang_name']));
			trigger_error($user->lang['CHANGED_PROFILE_FIELD'] . adm_back_link($this->u_action));
		}
		else
		{
			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_CREATE', false, array(substr($field_ident, 3) . ':' . $cp->vars['lang_name']));
			trigger_error($user->lang['ADDED_PROFILE_FIELD'] . adm_back_link($this->u_action));
		}
	}

	/**
	* Update, then insert if not successfull
	*/
	function update_insert($table, $sql_ary, $where_fields)
	{
		global $db;

		$where_sql = array();
		$check_key = '';

		foreach ($where_fields as $key => $value)
		{
			$check_key = (!$check_key) ? $key : $check_key;
			$where_sql[] = $key . ' = ' . ((is_string($value)) ? "'" . $db->sql_escape($value) . "'" : (int) $value);
		}

		if (!count($where_sql))
		{
			return;
		}

		$sql = "SELECT $check_key
			FROM $table
			WHERE " . implode(' AND ', $where_sql);
		$result = $db->sql_query($sql);
		$row = $db->sql_fetchrow($result);
		$db->sql_freeresult($result);

		if (!$row)
		{
			$sql_ary = array_merge($where_fields, $sql_ary);

			if (count($sql_ary))
			{
				$db->sql_query("INSERT INTO $table " . $db->sql_build_array('INSERT', $sql_ary));
			}
		}
		else
		{
			if (count($sql_ary))
			{
				$sql = "UPDATE $table SET " . $db->sql_build_array('UPDATE', $sql_ary) . '
					WHERE ' . implode(' AND ', $where_sql);
				$db->sql_query($sql);
			}
		}
	}
}
User avatar
warmweer
Jr. Extension Validator
Posts: 5835
Joined: Fri Jul 04, 2003 6:34 am
Location: Van Allen Bel ... gium

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by warmweer »

mhamza wrote:
Mon Nov 23, 2020 8:16 am
I could not find any file with this name.
It's not a file, but a table in your database
oxpus wrote:
Sun Nov 22, 2020 9:46 pm
I think your table phpbb_profile_lang is broken or incomplete.
The statements oxpus gave you contains 2 queries you should execute on that table (using phpMyAdmin) (for each language entry).
Spelling is freeware, which means you can use it for free.
On the other hand, it is not open source, which means you cannot change it or publish it in a modified form.
User avatar
oxpus
Registered User
Posts: 24
Joined: Mon Feb 03, 2003 11:43 am
Location: D - Bad Wildungen
Name: Karsten Ude
Contact:

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by oxpus »

Right.
I mean to run the commands in the database like phpmadmin as shown here.: https://www.phpbb.com/support/docs/en/3 ... hpmyadmin/
mhamza
Registered User
Posts: 40
Joined: Sun Oct 18, 2020 6:51 pm

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by mhamza »

oxpus wrote:
Mon Nov 23, 2020 9:39 am
Right.
I mean to run the commands in the database like phpmadmin as shown here.: https://www.phpbb.com/support/docs/en/3 ... hpmyadmin/
yes I managed to access my sql table but there is no phpbb_profile_lang table.
Attachments
Ekran Görüntüsü (292).png
User avatar
warmweer
Jr. Extension Validator
Posts: 5835
Joined: Fri Jul 04, 2003 6:34 am
Location: Van Allen Bel ... gium

Re: [phpBB Debug] PHP Warning: in file [ROOT]/includes/acp/acp_profile.php on line 779: count(): Parameter must be an ar

Post by warmweer »

mhamza wrote:
Mon Nov 23, 2020 10:20 am
yes I managed to access my sql table but there is no phpbb_profile_lang table.
You're only showing page 1 of 2 in the list on the left (it's on page 2).
BTW the table is visible in the part on the right.

Edit: phpbb_ is the (default) table_prefix: in your case the prefix = bb_ >>> table bb_profile_lang
Last edited by warmweer on Mon Nov 23, 2020 11:04 am, edited 1 time in total.
Spelling is freeware, which means you can use it for free.
On the other hand, it is not open source, which means you cannot change it or publish it in a modified form.
Post Reply

Return to “[3.3.x] Support Forum”