diff options
Diffstat (limited to 'phpBB/phpbb')
27 files changed, 858 insertions, 122 deletions
| diff --git a/phpBB/phpbb/db/driver/driver.php b/phpBB/phpbb/db/driver/driver.php index d721ed2eb7..b61800006f 100644 --- a/phpBB/phpbb/db/driver/driver.php +++ b/phpBB/phpbb/db/driver/driver.php @@ -388,7 +388,7 @@ class driver  	* Build sql statement from array for insert/update/select statements  	*  	* Idea for this from Ikonboard -	* Possible query values: INSERT, INSERT_SELECT, UPDATE, SELECT +	* Possible query values: INSERT, INSERT_SELECT, UPDATE, SELECT, DELETE  	*  	*/  	function sql_build_array($query, $assoc_ary = false) @@ -423,7 +423,7 @@ class driver  		{  			trigger_error('The MULTI_INSERT query value is no longer supported. Please use sql_multi_insert() instead.', E_USER_ERROR);  		} -		else if ($query == 'UPDATE' || $query == 'SELECT') +		else if ($query == 'UPDATE' || $query == 'SELECT' || $query == 'DELETE')  		{  			$values = array();  			foreach ($assoc_ary as $key => $var) diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_aol.php b/phpBB/phpbb/db/migration/data/v310/profilefield_aol.php new file mode 100644 index 0000000000..87574cb858 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_aol.php @@ -0,0 +1,51 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_aol extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_yahoo_cleanup', +		); +	} + +	protected $profilefield_name = 'phpbb_aol'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_aol', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_aol', +		'field_length'			=> '40', +		'field_minlen'			=> '5', +		'field_maxlen'			=> '255', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '.*', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_on_ml'		=> 0, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> '', +		'field_contact_url'		=> '', +	); + +	protected $user_column_name = 'user_aim'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_aol_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_aol_cleanup.php new file mode 100644 index 0000000000..a7088c6a7a --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_aol_cleanup.php @@ -0,0 +1,47 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_aol_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_aim'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_aol', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_aim', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_aim'	=> array('VCHAR_UNI', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_change_load_settings.php b/phpBB/phpbb/db/migration/data/v310/profilefield_change_load_settings.php new file mode 100644 index 0000000000..7d09d8149a --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_change_load_settings.php @@ -0,0 +1,30 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_change_load_settings extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_aol_cleanup', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('load_cpf_memberlist', '1')), +			array('config.update', array('load_cpf_pm', '1')), +			array('config.update', array('load_cpf_viewprofile', '1')), +			array('config.update', array('load_cpf_viewtopic', '1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_contact_field.php b/phpBB/phpbb/db/migration/data/v310/profilefield_contact_field.php new file mode 100644 index 0000000000..c7617813eb --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_contact_field.php @@ -0,0 +1,51 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_contact_field extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_column_exists($this->table_prefix . 'profile_fields', 'field_is_contact'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_on_memberlist', +		); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'profile_fields'	=> array( +					'field_is_contact'			=> array('BOOL', 0), +					'field_contact_desc'		=> array('VCHAR', ''), +					'field_contact_url'			=> array('VCHAR', ''), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'profile_fields'	=> array( +					'field_is_contact', +					'field_contact_desc', +					'field_contact_url', +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_icq.php b/phpBB/phpbb/db/migration/data/v310/profilefield_icq.php new file mode 100644 index 0000000000..2c8c8c511f --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_icq.php @@ -0,0 +1,50 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_icq extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_contact_field', +		); +	} + +	protected $profilefield_name = 'phpbb_icq'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_icq', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_icq', +		'field_length'			=> '20', +		'field_minlen'			=> '3', +		'field_maxlen'			=> '15', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '[0-9]+', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'SEND_ICQ_MESSAGE', +		'field_contact_url'		=> 'https://www.icq.com/people/%s/', +	); + +	protected $user_column_name = 'user_icq'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_icq_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_icq_cleanup.php new file mode 100644 index 0000000000..0129a7248f --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_icq_cleanup.php @@ -0,0 +1,47 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_icq_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_icq'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_icq', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_icq', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_icq'	=> array('VCHAR:20', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_interests.php b/phpBB/phpbb/db/migration/data/v310/profilefield_interests.php index d73bc78edb..2b943c5e53 100644 --- a/phpBB/phpbb/db/migration/data/v310/profilefield_interests.php +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_interests.php @@ -15,6 +15,7 @@ class profilefield_interests extends \phpbb\db\migration\profilefield_base_migra  	{  		return array(  			'\phpbb\db\migration\data\v310\profilefield_types', +			'\phpbb\db\migration\data\v310\profilefield_show_novalue',  		);  	} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_show_novalue.php b/phpBB/phpbb/db/migration/data/v310/profilefield_show_novalue.php new file mode 100644 index 0000000000..d37103e2ce --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_show_novalue.php @@ -0,0 +1,45 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_show_novalue extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_column_exists($this->table_prefix . 'profile_fields', 'field_show_novalue'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\profilefield_types'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns' => array( +				$this->table_prefix . 'profile_fields' => array( +					'field_show_novalue' => array('BOOL', 0), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns' => array( +				$this->table_prefix . 'profile_fields' => array( +					'field_show_novalue', +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_website.php b/phpBB/phpbb/db/migration/data/v310/profilefield_website.php new file mode 100644 index 0000000000..818b66d2e4 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_website.php @@ -0,0 +1,52 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_website extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_on_memberlist', +			'\phpbb\db\migration\data\v310\profilefield_icq_cleanup', +		); +	} + +	protected $profilefield_name = 'phpbb_website'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_website', +		'field_type'			=> 'profilefields.type.url', +		'field_ident'			=> 'phpbb_website', +		'field_length'			=> '40', +		'field_minlen'			=> '12', +		'field_maxlen'			=> '255', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_on_ml'		=> 1, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'VISIT_WEBSITE', +		'field_contact_url'		=> '%s', +	); + +	protected $user_column_name = 'user_website'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_website_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_website_cleanup.php new file mode 100644 index 0000000000..35cc92199e --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_website_cleanup.php @@ -0,0 +1,47 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_website_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_website'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_website', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_website', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_website'	=> array('VCHAR_UNI:200', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_wlm.php b/phpBB/phpbb/db/migration/data/v310/profilefield_wlm.php new file mode 100644 index 0000000000..8a42f1fea1 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_wlm.php @@ -0,0 +1,51 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_wlm extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_website_cleanup', +		); +	} + +	protected $profilefield_name = 'phpbb_wlm'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_wlm', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_wlm', +		'field_length'			=> '40', +		'field_minlen'			=> '5', +		'field_maxlen'			=> '255', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '.*', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_on_ml'		=> 0, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> '', +		'field_contact_url'		=> '', +	); + +	protected $user_column_name = 'user_msnm'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_wlm_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_wlm_cleanup.php new file mode 100644 index 0000000000..98b92eb188 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_wlm_cleanup.php @@ -0,0 +1,47 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_wlm_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_msnm'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_wlm', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_msnm', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_msnm'	=> array('VCHAR_UNI', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo.php b/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo.php new file mode 100644 index 0000000000..808aec8099 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo.php @@ -0,0 +1,51 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_yahoo extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_wlm_cleanup', +		); +	} + +	protected $profilefield_name = 'phpbb_yahoo'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_yahoo', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_yahoo', +		'field_length'			=> '40', +		'field_minlen'			=> '5', +		'field_maxlen'			=> '255', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '.*', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_on_ml'		=> 0, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'SEND_YIM_MESSAGE', +		'field_contact_url'		=> 'http://edit.yahoo.com/config/send_webmesg?.target=%s&.src=pg', +	); + +	protected $user_column_name = 'user_yim'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo_cleanup.php new file mode 100644 index 0000000000..c11d06576f --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo_cleanup.php @@ -0,0 +1,47 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_yahoo_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_yim'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_yahoo', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_yim', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_yim'	=> array('VCHAR_UNI', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/notification/type/admin_activate_user.php b/phpBB/phpbb/notification/type/admin_activate_user.php index 5f146e18ff..426da4db03 100644 --- a/phpBB/phpbb/notification/type/admin_activate_user.php +++ b/phpBB/phpbb/notification/type/admin_activate_user.php @@ -81,7 +81,7 @@ class admin_activate_user extends \phpbb\notification\type\base  			WHERE user_type = ' . USER_FOUNDER;  		$result = $this->db->sql_query($sql); -		while ($row = $this->db->sql_fetchrow($sql)) +		while ($row = $this->db->sql_fetchrow($result))  		{  			$users[] = (int) $row['user_id'];  		} diff --git a/phpBB/phpbb/profilefields/manager.php b/phpBB/phpbb/profilefields/manager.php index ac2542a6d4..a4626bc5de 100644 --- a/phpBB/phpbb/profilefields/manager.php +++ b/phpBB/phpbb/profilefields/manager.php @@ -278,106 +278,132 @@ class manager  	}  	/** -	* 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 +	* Grab the user specific profile fields data +	* +	* @param	int|array	$user_ids	Single user id or an array of ids +	* @return array		Users profile fields data  	*/ -	public function generate_profile_fields_template($mode, $user_id = 0, $profile_row = false) +	public function grab_profile_fields_data($user_ids = 0)  	{ -		if ($mode == 'grab') +		if (!is_array($user_ids))  		{ -			if (!is_array($user_id)) -			{ -				$user_id = array($user_id); -			} +			$user_ids = array($user_ids); +		} -			if (!sizeof($this->profile_cache)) -			{ -				$this->build_cache(); -			} +		if (!sizeof($this->profile_cache)) +		{ +			$this->build_cache(); +		} -			if (!sizeof($user_id)) -			{ -				return array(); -			} +		if (!sizeof($user_ids)) +		{ +			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); +		$sql = 'SELECT * +			FROM ' . $this->fields_data_table . ' +			WHERE ' . $this->db->sql_in_set('user_id', array_map('intval', $user_ids)); +		$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); +		$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_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]; +			} -			// Go through the fields in correct order -			foreach (array_keys($this->profile_cache) as $used_ident) +			foreach ($user_ids as $user_id)  			{ -				foreach ($field_data as $user_id => $row) +				if (!isset($user_fields[$user_id][$used_ident]) && $this->profile_cache[$used_ident]['field_show_novalue'])  				{ -					$user_fields[$user_id][$used_ident]['value'] = $row['pf_' . $used_ident]; +					$user_fields[$user_id][$used_ident]['value'] = '';  					$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') + +		return $user_fields; +	} + +	/** +	* Assign the user's profile fields data to the template +	* +	* @param array	$profile_row		Array with users profile field data +	* @param bool	$use_contact_fields	Should we display contact fields as such? +	*			This requires special treatments (links should not be parsed in the values, and more) +	* @return array +	*/ +	public function generate_profile_fields_template_data($profile_row, $use_contact_fields = true) +	{ +		// $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_row == $user_fields[$row['user_id']]; -			$tpl_fields = array(); -			$tpl_fields['row'] = $tpl_fields['blockrow'] = array(); +			$profile_field = $this->type_collection[$ident_ary['data']['field_type']]; +			$value = $profile_field->get_profile_value($ident_ary['value'], $ident_ary['data']); -			foreach ($profile_row as $ident => $ident_ary) +			if ($value === null)  			{ -				$profile_field = $this->type_collection[$ident_ary['data']['field_type']]; -				$value = $profile_field->get_profile_value($ident_ary['value'], $ident_ary['data']); +				continue; +			} -				if ($value === null) +			$field_desc = $contact_url = ''; +			if ($use_contact_fields) +			{ +				$value = $profile_field->get_profile_contact_value($ident_ary['value'], $ident_ary['data']); +				$field_desc = $this->user->lang($ident_ary['data']['field_contact_desc']); +				if (strpos($field_desc, '%s') !== false)  				{ -					continue; +					$field_desc = sprintf($field_desc, $value); +				} +				$contact_url = ''; +				if (strpos($ident_ary['data']['field_contact_url'], '%s') !== false) +				{ +					$contact_url = sprintf($ident_ary['data']['field_contact_url'], $value);  				} - -				$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); +			$tpl_fields['row'] += array( +				'PROFILE_' . strtoupper($ident) . '_IDENT'	=> $ident, +				'PROFILE_' . strtoupper($ident) . '_VALUE'	=> $value, +				'PROFILE_' . strtoupper($ident) . '_CONTACT'=> $contact_url, +				'PROFILE_' . strtoupper($ident) . '_DESC'	=> $field_desc, +				'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) . '_CONTACT'	=> $ident_ary['data']['field_is_contact'], +				'S_PROFILE_' . strtoupper($ident)			=> true, +			); + +			$tpl_fields['blockrow'][] = array( +				'PROFILE_FIELD_IDENT'	=> $ident, +				'PROFILE_FIELD_VALUE'	=> $value, +				'PROFILE_FIELD_CONTACT'	=> $contact_url, +				'PROFILE_FIELD_DESC'	=> $field_desc, +				'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_CONTACT'						=> $ident_ary['data']['field_is_contact'], +				'S_PROFILE_' . strtoupper($ident)		=> true, +			);  		} + +		return $tpl_fields;  	}  	/** diff --git a/phpBB/phpbb/profilefields/type/type_base.php b/phpBB/phpbb/profilefields/type/type_base.php index 9c363a7b4e..a96196674d 100644 --- a/phpBB/phpbb/profilefields/type/type_base.php +++ b/phpBB/phpbb/profilefields/type/type_base.php @@ -87,6 +87,14 @@ abstract class type_base implements type_interface  	/**  	* {@inheritDoc}  	*/ +	public function get_profile_contact_value($field_value, $field_data) +	{ +		return $this->get_profile_value($field_value, $field_data); +	} + +	/** +	* {@inheritDoc} +	*/  	public function get_language_options_input($field_data)  	{  		$field_data['l_lang_name']			= $this->request->variable('l_lang_name', array(0 => ''), true); diff --git a/phpBB/phpbb/profilefields/type/type_date.php b/phpBB/phpbb/profilefields/type/type_date.php index fc012dd97a..af3d65c9b6 100644 --- a/phpBB/phpbb/profilefields/type/type_date.php +++ b/phpBB/phpbb/profilefields/type/type_date.php @@ -66,6 +66,7 @@ class type_date extends type_base  			'field_ident'			=> 'field_default_value',  			'field_type'			=> $this->get_service_name(),  			'field_length'			=> $field_data['field_length'], +			'lang_options'			=> $field_data['lang_options'],  		);  		$always_now = request_var('always_now', -1); diff --git a/phpBB/phpbb/profilefields/type/type_int.php b/phpBB/phpbb/profilefields/type/type_int.php index b89faca018..c98c863e13 100644 --- a/phpBB/phpbb/profilefields/type/type_int.php +++ b/phpBB/phpbb/profilefields/type/type_int.php @@ -61,7 +61,7 @@ class type_int extends type_base  			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'] . '" />'), +			3 => array('TITLE' => $this->user->lang['DEFAULT_VALUE'],		'FIELD' => '<input type="number" name="field_default_value" value="' . $field_data['field_default_value'] . '" />'),  		);  		return $options; @@ -141,7 +141,7 @@ class type_int extends type_base  	*/  	public function get_profile_value($field_value, $field_data)  	{ -		if ($field_value === '' && !$field_data['field_show_novalue']) +		if (($field_value === '' || $field_value === null) && !$field_data['field_show_novalue'])  		{  			return null;  		} diff --git a/phpBB/phpbb/profilefields/type/type_interface.php b/phpBB/phpbb/profilefields/type/type_interface.php index 94f6882524..a1c3d879c8 100644 --- a/phpBB/phpbb/profilefields/type/type_interface.php +++ b/phpBB/phpbb/profilefields/type/type_interface.php @@ -90,6 +90,17 @@ interface type_interface  	public function get_profile_value($field_value, $field_data);  	/** +	* Get Profile Value for display +	* +	* When displaying a contact field, we don't want to have links already parsed and more +	* +	* @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_contact_value($field_value, $field_data); + +	/**  	* Generate the input field for display  	*  	* @param array	$profile_row		Array with data for this field diff --git a/phpBB/phpbb/profilefields/type/type_string.php b/phpBB/phpbb/profilefields/type/type_string.php index 9d241c49ef..9dada592eb 100644 --- a/phpBB/phpbb/profilefields/type/type_string.php +++ b/phpBB/phpbb/profilefields/type/type_string.php @@ -109,7 +109,7 @@ class type_string extends type_string_common  		$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)); +		$this->template->assign_block_vars($this->get_name_short(), array_change_key_case($profile_row, CASE_UPPER));  	}  	/** diff --git a/phpBB/phpbb/profilefields/type/type_string_common.php b/phpBB/phpbb/profilefields/type/type_string_common.php index f00a7e6a08..0738cbdafd 100644 --- a/phpBB/phpbb/profilefields/type/type_string_common.php +++ b/phpBB/phpbb/profilefields/type/type_string_common.php @@ -11,15 +11,21 @@ namespace phpbb\profilefields\type;  abstract class type_string_common extends type_base  { +	protected $validation_options = array( +		'CHARS_ANY'			=> '.*', +		'NUMBERS_ONLY'		=> '[0-9]+', +		'ALPHA_ONLY'		=> '[\w]+', +		'ALPHA_UNDERSCORE'	=> '[\w_]+', +		'ALPHA_SPACERS'		=> '[\w_\+\. \-\[\]]+', +	); +  	/**  	* Return possible validation options  	*/ -	function validate_options($field_data) +	public 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) +		foreach ($this->validation_options as $lang => $value)  		{  			$selected = ($field_data['field_validation'] == $value) ? ' selected="selected"' : '';  			$validate_options .= '<option value="' . $value . '"' . $selected . '>' . $this->user->lang[$lang] . '</option>'; @@ -69,17 +75,12 @@ abstract class type_string_common extends type_base  			$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']) +				$validation = array_search($field_data['field_validation'], $this->validation_options); +				if ($validation)  				{ -					case '[0-9]+': -						return $this->user->lang('FIELD_INVALID_CHARS_NUMBERS_ONLY', $this->get_field_name($field_data['lang_name'])); - -					case '[\w]+': -						return $this->user->lang('FIELD_INVALID_CHARS_ALPHA_ONLY', $this->get_field_name($field_data['lang_name'])); - -					case '[\w_\+\. \-\[\]]+': -						return $this->user->lang('FIELD_INVALID_CHARS_SPACERS_ONLY', $this->get_field_name($field_data['lang_name'])); +					return $this->user->lang('FIELD_INVALID_CHARS_' . $validation, $this->get_field_name($field_data['lang_name']));  				} +				return $this->user->lang('FIELD_INVALID_CHARS_INVALID', $this->get_field_name($field_data['lang_name']));  			}  		} @@ -105,6 +106,19 @@ abstract class type_string_common extends type_base  	/**  	* {@inheritDoc}  	*/ +	public function get_profile_contact_value($field_value, $field_data) +	{ +		if (!$field_value && !$field_data['field_show_novalue']) +		{ +			return null; +		} + +		return $field_value; +	} + +	/** +	* {@inheritDoc} +	*/  	public function prepare_options_form(&$exclude_options, &$visibility_options)  	{  		$exclude_options[1][] = 'lang_default_value'; diff --git a/phpBB/phpbb/profilefields/type/type_url.php b/phpBB/phpbb/profilefields/type/type_url.php new file mode 100644 index 0000000000..b1523b9355 --- /dev/null +++ b/phpBB/phpbb/profilefields/type/type_url.php @@ -0,0 +1,70 @@ +<?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_url extends type_string +{ +	/** +	* {@inheritDoc} +	*/ +	public function get_name_short() +	{ +		return 'url'; +	} + +	/** +	* {@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" name="field_maxlen" size="5" value="' . $field_data['field_maxlen'] . '" />'), +		); + +		return $options; +	} + +	/** +	* {@inheritDoc} +	*/ +	public function get_default_option_values() +	{ +		return array( +			'field_length'		=> 40, +			'field_minlen'		=> 0, +			'field_maxlen'		=> 200, +			'field_validation'	=> '', +			'field_novalue'		=> '', +			'field_default_value'	=> '', +		); +	} + +	/** +	* {@inheritDoc} +	*/ +	public function validate_profile_field(&$field_value, $field_data) +	{ +		$field_value = trim($field_value); + +		if ($field_value === '' && !$field_data['field_required']) +		{ +			return false; +		} + +		if (!preg_match('#^' . get_preg_expression('url') . '$#i', $field_value)) +		{ +			return $this->user->lang('FIELD_INVALID_URL', $this->get_field_name($field_data['lang_name'])); +		} + +		return false; +	} +} diff --git a/phpBB/phpbb/search/fulltext_native.php b/phpBB/phpbb/search/fulltext_native.php index 1a89182978..fb3726c957 100644 --- a/phpBB/phpbb/search/fulltext_native.php +++ b/phpBB/phpbb/search/fulltext_native.php @@ -325,7 +325,6 @@ class fulltext_native extends \phpbb\search\base  			}  			$this->db->sql_freeresult($result);  		} -		unset($exact_words);  		// now analyse the search query, first split it using the spaces  		$query = explode(' ', $keywords); @@ -451,39 +450,21 @@ class fulltext_native extends \phpbb\search\base  					$this->{$mode . '_ids'}[] = $words[$word];  				}  			} -			// throw an error if we shall not ignore unexistant words -			else if (!$ignore_no_id) +			else  			{  				if (!isset($common_ids[$word]))  				{  					$len = utf8_strlen($word); -					if ($len >= $this->word_length['min'] && $len <= $this->word_length['max']) -					{ -						trigger_error(sprintf($this->user->lang['WORD_IN_NO_POST'], $word)); -					} -					else +					if ($len < $this->word_length['min'] || $len > $this->word_length['max'])  					{  						$this->common_words[] = $word;  					}  				}  			} -			else -			{ -				$len = utf8_strlen($word); -				if ($len < $this->word_length['min'] || $len > $this->word_length['max']) -				{ -					$this->common_words[] = $word; -				} -			}  		} -		// we can't search for negatives only -		if (!sizeof($this->must_contain_ids)) -		{ -			return false; -		} - -		if (!empty($this->search_query)) +		// Return true if all words are not common words +		if (sizeof($exact_words) - sizeof($this->common_words) > 0)  		{  			return true;  		} @@ -518,6 +499,12 @@ class fulltext_native extends \phpbb\search\base  			return false;  		} +		// we can't search for negatives only +		if (empty($this->must_contain_ids)) +		{ +			return false; +		} +  		$must_contain_ids = $this->must_contain_ids;  		$must_not_contain_ids = $this->must_not_contain_ids;  		$must_exclude_one_ids = $this->must_exclude_one_ids; diff --git a/phpBB/phpbb/search/fulltext_sphinx.php b/phpBB/phpbb/search/fulltext_sphinx.php index acbfad9474..d86a394326 100644 --- a/phpBB/phpbb/search/fulltext_sphinx.php +++ b/phpBB/phpbb/search/fulltext_sphinx.php @@ -282,9 +282,9 @@ class fulltext_sphinx  				array('sql_attr_uint',				'post_visibility'),  				array('sql_attr_bool',				'topic_first_post'),  				array('sql_attr_bool',				'deleted'), -				array('sql_attr_timestamp'	,		'post_time'), -				array('sql_attr_timestamp'	,		'topic_last_post_time'), -				array('sql_attr_str2ordinal',		'post_subject'), +				array('sql_attr_timestamp',			'post_time'), +				array('sql_attr_timestamp',			'topic_last_post_time'), +				array('sql_attr_string',			'post_subject'),  			),  			'source source_phpbb_' . $this->id . '_delta : source_phpbb_' . $this->id . '_main' => array(  				array('sql_query_pre',				''), diff --git a/phpBB/phpbb/template/context.php b/phpBB/phpbb/template/context.php index af186c2215..a222fbb69e 100644 --- a/phpBB/phpbb/template/context.php +++ b/phpBB/phpbb/template/context.php @@ -155,11 +155,12 @@ class context  			// We're adding a new iteration to this block with the given  			// variable assignments.  			$str[$blocks[$blockcount]][] = $vararray; +			$s_num_rows = sizeof($str[$blocks[$blockcount]]);  			// Set S_NUM_ROWS  			foreach ($str[$blocks[$blockcount]] as &$mod_block)  			{ -				$mod_block['S_NUM_ROWS'] = sizeof($str[$blocks[$blockcount]]); +				$mod_block['S_NUM_ROWS'] = $s_num_rows;  			}  		}  		else @@ -186,11 +187,12 @@ class context  			// Add a new iteration to this block with the variable assignments we were given.  			$this->tpldata[$blockname][] = $vararray; +			$s_num_rows = sizeof($this->tpldata[$blockname]);  			// Set S_NUM_ROWS  			foreach ($this->tpldata[$blockname] as &$mod_block)  			{ -				$mod_block['S_NUM_ROWS'] = sizeof($this->tpldata[$blockname]); +				$mod_block['S_NUM_ROWS'] = $s_num_rows;  			}  		} | 
