mirror of
https://github.com/phpbb/phpbb.git
synced 2025-08-06 16:56:44 +02:00
208 lines
5.5 KiB
PHP
208 lines
5.5 KiB
PHP
<?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.
|
|
*
|
|
*/
|
|
|
|
namespace phpbb\db\migration\data\v33x;
|
|
|
|
class profilefields_update extends \phpbb\db\migration\migration
|
|
{
|
|
/** @var string YouTube URLs matcher: handle or custom URL or channel URL */
|
|
protected $youtube_url_matcher = '(@[a-zA-Z0-9_.-]{3,30}|c/[a-zA-Z][\w\.,\-_]+|(channel|user)/[a-zA-Z][\w\.,\-_]+)';
|
|
|
|
public static function depends_on(): array
|
|
{
|
|
return [
|
|
'\phpbb\db\migration\data\v33x\v3310',
|
|
'\phpbb\db\migration\data\v33x\profilefield_youtube_update',
|
|
];
|
|
}
|
|
|
|
public function update_schema(): array
|
|
{
|
|
return [
|
|
'change_columns' => [
|
|
$this->table_prefix . 'profile_fields' => [
|
|
'field_validation' => ['VCHAR_UNI:128', ''],
|
|
],
|
|
]
|
|
];
|
|
}
|
|
|
|
public function revert_schema(): array
|
|
{
|
|
return [
|
|
'change_columns' => [
|
|
$this->table_prefix . 'profile_fields' => [
|
|
'field_validation' => ['VCHAR_UNI:64', ''],
|
|
],
|
|
]
|
|
];
|
|
}
|
|
|
|
public function update_data(): array
|
|
{
|
|
return [
|
|
['custom', [[$this, 'update_youtube_profile_field']]],
|
|
['custom', [[$this, 'update_other_profile_fields']]],
|
|
];
|
|
}
|
|
|
|
public function revert_data(): array
|
|
{
|
|
return [
|
|
['custom', [[$this, 'revert_youtube_profile_field']]],
|
|
['custom', [[$this, 'revert_other_profile_fields']]],
|
|
];
|
|
}
|
|
|
|
public function update_youtube_profile_field(): bool
|
|
{
|
|
$profile_fields = $this->table_prefix . 'profile_fields';
|
|
$profile_fields_data = $this->table_prefix . 'profile_fields_data';
|
|
$end_time = time() + 5; // allow up to 5 seconds for migration to run
|
|
|
|
$field_data = [
|
|
'field_length' => 20,
|
|
'field_minlen' => 3,
|
|
'field_maxlen' => 60,
|
|
'field_validation' => $this->youtube_url_matcher,
|
|
'field_contact_url' => 'https://youtube.com/%s',
|
|
'field_contact_desc' => 'VIEW_YOUTUBE_PROFILE',
|
|
];
|
|
|
|
$sql = 'UPDATE ' . $profile_fields . '
|
|
SET ' . $this->db->sql_build_array('UPDATE', $field_data) . "
|
|
WHERE field_name = 'phpbb_youtube'";
|
|
$this->db->sql_query($sql);
|
|
|
|
$yt_profile_field = 'pf_phpbb_youtube';
|
|
$has_youtube_url = $this->db->sql_like_expression($this->db->get_any_char() . 'youtube.com/' . $this->db->get_any_char());
|
|
|
|
// We're done if the profile field doesn't exist
|
|
if (!$this->db_tools->sql_column_exists($profile_fields_data, $yt_profile_field))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
$update_aborted = false;
|
|
|
|
$sql = 'SELECT user_id, pf_phpbb_youtube
|
|
FROM ' . $profile_fields_data . "
|
|
WHERE $yt_profile_field <> ''
|
|
AND $yt_profile_field $has_youtube_url";
|
|
$result = $this->db->sql_query($sql);
|
|
while ($row = $this->db->sql_fetchrow($result))
|
|
{
|
|
$updated_youtube_url_part = $this->get_youtube_url_part($row['pf_phpbb_youtube']);
|
|
if ($updated_youtube_url_part != $row['pf_phpbb_youtube'])
|
|
{
|
|
$this->db->sql_query(
|
|
"UPDATE $profile_fields_data
|
|
SET $yt_profile_field = '$updated_youtube_url_part'
|
|
WHERE user_id = {$row['user_id']}"
|
|
);
|
|
}
|
|
|
|
if (time() > $end_time)
|
|
{
|
|
$update_aborted = true;
|
|
break;
|
|
}
|
|
}
|
|
$this->db->sql_freeresult($result);
|
|
|
|
return $update_aborted != true;
|
|
}
|
|
|
|
public function update_other_profile_fields(): void
|
|
{
|
|
$profile_fields = $this->table_prefix . 'profile_fields';
|
|
|
|
$this->db->sql_query(
|
|
"UPDATE $profile_fields
|
|
SET field_contact_url = 'https://facebook.com/%s/'
|
|
WHERE field_name = 'phpbb_facebook'"
|
|
);
|
|
|
|
$this->db->sql_query(
|
|
"UPDATE $profile_fields
|
|
SET field_contact_url = 'https://twitter.com/%s'
|
|
WHERE field_name = 'phpbb_twitter'"
|
|
);
|
|
}
|
|
|
|
public function revert_youtube_profile_field(): void
|
|
{
|
|
$profile_fields = $this->table_prefix . 'profile_fields';
|
|
$profile_fields_data = $this->table_prefix . 'profile_fields_data';
|
|
|
|
$field_data = [
|
|
'field_length' => 40,
|
|
'field_minlen' => strlen('https://youtube.com/c/') + 1,
|
|
'field_maxlen' => 255,
|
|
'field_validation' => profilefield_youtube_update::$youtube_url_matcher,
|
|
'field_contact_url' => '%s'
|
|
];
|
|
|
|
$sql = 'UPDATE ' . $profile_fields . '
|
|
SET ' . $this->db->sql_build_array('UPDATE', $field_data) . "
|
|
WHERE field_name = 'phpbb_youtube'";
|
|
$this->db->sql_query($sql);
|
|
|
|
$yt_profile_field = 'pf_phpbb_youtube';
|
|
|
|
// We're done if the profile field doesn't exist
|
|
if (!$this->db_tools->sql_column_exists($profile_fields_data, $yt_profile_field))
|
|
{
|
|
return;
|
|
}
|
|
|
|
$prepend_legacy_youtube_url = $this->db->sql_concatenate(
|
|
"'https://youtube.com/'", $yt_profile_field
|
|
);
|
|
$is_not_already_youtube_url = $this->db->sql_not_like_expression(
|
|
$this->db->get_any_char()
|
|
. 'youtube.com/'
|
|
. $this->db->get_any_char()
|
|
);
|
|
|
|
$this->db->sql_query(
|
|
"UPDATE $profile_fields_data SET
|
|
$yt_profile_field = $prepend_legacy_youtube_url
|
|
WHERE $yt_profile_field <> ''
|
|
AND $yt_profile_field $is_not_already_youtube_url"
|
|
);
|
|
}
|
|
|
|
public function revert_other_profile_fields(): void
|
|
{
|
|
$profile_fields = $this->table_prefix . 'profile_fields';
|
|
|
|
$this->db->sql_query(
|
|
"UPDATE $profile_fields
|
|
SET field_contact_url = 'http://facebook.com/%s/'
|
|
WHERE field_name = 'phpbb_facebook'"
|
|
);
|
|
|
|
$this->db->sql_query(
|
|
"UPDATE $profile_fields
|
|
SET field_contact_url = 'http://twitter.com/%s'
|
|
WHERE field_name = 'phpbb_twitter'"
|
|
);
|
|
}
|
|
|
|
protected function get_youtube_url_part(string $profile_field_string): string
|
|
{
|
|
return preg_replace('#^https://(?:www\.)?youtube\.com/(.+)$#iu', '$1', $profile_field_string);
|
|
}
|
|
}
|