[ticket/13713] Avoid same attributes for different types of IDs

PHPBB3-13713
This commit is contained in:
lavigor 2020-05-18 03:35:17 +03:00 committed by Marc Alexander
parent 9905e54013
commit e2c50eae68
No known key found for this signature in database
GPG key ID: 50E0D2423696F995
3 changed files with 24 additions and 27 deletions

View file

@ -85,8 +85,10 @@ class factory implements \phpbb\textformatter\cache_interface
'list' => '[LIST type={HASHMAP=1:decimal,a:lower-alpha,A:upper-alpha,i:lower-roman,I:upper-roman;optional;postFilter=#simpletext} #createChild=LI]{TEXT}[/LIST]',
'li' => '[* $tagName=LI]{TEXT}[/*]',
'mention' =>
"[MENTION={PARSE=/^(?<type>[ug]):(?<id>\d+)$/}
"[MENTION={PARSE=/^g:(?'group_id'\d+)|u:(?'user_id'\d+)$/}
group_id={UINT;optional}
profile_url={URL;optional;postFilter=#false}
user_id={UINT;optional}
]{TEXT}[/MENTION]",
'quote' =>
"[QUOTE

View file

@ -33,12 +33,12 @@ class mention_helper
protected $user;
/**
* @var string Base URL for a user profile link, uses {ID} as placeholder
* @var string Base URL for a user profile link, uses {USER_ID} as placeholder
*/
protected $user_profile_url;
/**
* @var string Base URL for a group profile link, uses {ID} as placeholder
* @var string Base URL for a group profile link, uses {GROUP_ID} as placeholder
*/
protected $group_profile_url;
@ -61,8 +61,8 @@ class mention_helper
$this->db = $db;
$this->auth = $auth;
$this->user = $user;
$this->user_profile_url = append_sid($root_path . 'memberlist.' . $php_ext, 'mode=viewprofile&u={ID}', false);
$this->group_profile_url = append_sid($root_path . 'memberlist.' . $php_ext, 'mode=group&g={ID}', false);
$this->user_profile_url = append_sid($root_path . 'memberlist.' . $php_ext, 'mode=viewprofile&u={USER_ID}', false);
$this->group_profile_url = append_sid($root_path . 'memberlist.' . $php_ext, 'mode=group&g={GROUP_ID}', false);
}
/**
@ -83,12 +83,13 @@ class mention_helper
'MENTION',
function ($attributes) use ($profile_urls)
{
if (isset($attributes['type']) && isset($attributes['id']))
if (isset($attributes['user_id']))
{
$type = $attributes['type'];
$id = $attributes['id'];
$attributes['profile_url'] = str_replace('{ID}', $id, $profile_urls[$type]);
$attributes['profile_url'] = str_replace('{USER_ID}', $attributes['user_id'], $profile_urls['u']);
}
else if (isset($attributes['group_id']))
{
$attributes['profile_url'] = str_replace('{GROUP_ID}', $attributes['group_id'], $profile_urls['g']);
}
return $attributes;
@ -186,21 +187,15 @@ class mention_helper
return $ids;
}
$dom = new \DOMDocument;
$dom->loadXML($xml);
$xpath = new \DOMXPath($dom);
// Add IDs of users mentioned directly
$user_ids = TextFormatterUtils::getAttributeValues($xml, 'MENTION', 'user_id');
$ids = array_merge($ids, array_map('intval', $user_ids));
/** @var \DOMElement $mention */
foreach ($xpath->query('//MENTION') as $mention)
// Add IDs of users mentioned as group members
$group_ids = TextFormatterUtils::getAttributeValues($xml, 'MENTION', 'group_id');
foreach ($group_ids as $group_id)
{
if ($mention->getAttribute('type') === 'u')
{
$ids[] = (int) $mention->getAttribute('id');
}
else if ($mention->getAttribute('type') === 'g')
{
$this->get_user_ids_for_group($ids, (int) $mention->getAttribute('id'));
}
$this->get_user_ids_for_group($ids, (int) $group_id);
}
return $ids;

View file

@ -80,11 +80,11 @@ class mention_helper_test extends phpbb_database_test_case
{
return [
[
'<r><MENTION id="3" type="u"><s>[mention=u:3]</s>test<e>[/mention]</e></MENTION></r>',
'<r><MENTION user_id="3"><s>[mention=u:3]</s>test<e>[/mention]</e></MENTION></r>',
'mode=viewprofile&amp;u=3',
],
[
'<r><MENTION id="3" type="g"><s>[mention=g:3]</s>test<e>[/mention]</e></MENTION></r>',
'<r><MENTION group_id="3"><s>[mention=g:3]</s>test<e>[/mention]</e></MENTION></r>',
'mode=group&amp;g=3',
],
];
@ -103,11 +103,11 @@ class mention_helper_test extends phpbb_database_test_case
{
return [
[
'<r><MENTION id="3" type="u"><s>[mention=u:3]</s>test<e>[/mention]</e></MENTION><MENTION id="4" type="u"><s>[mention=u:4]</s>test<e>[/mention]</e></MENTION><MENTION id="5" type="u"><s>[mention=u:5]</s>test<e>[/mention]</e></MENTION></r>',
'<r><MENTION user_id="3"><s>[mention=u:3]</s>test<e>[/mention]</e></MENTION><MENTION user_id="4"><s>[mention=u:4]</s>test<e>[/mention]</e></MENTION><MENTION user_id="5"><s>[mention=u:5]</s>test<e>[/mention]</e></MENTION></r>',
[3, 4, 5],
],
[
'<r><MENTION id="1" type="g"><s>[mention=g:1]</s>test<e>[/mention]</e></MENTION><MENTION id="2" type="g"><s>[mention=g:2]</s>test<e>[/mention]</e></MENTION><MENTION id="3" type="g"><s>[mention=g:3]</s>test<e>[/mention]</e></MENTION></r>',
'<r><MENTION group_id="1"><s>[mention=g:1]</s>test<e>[/mention]</e></MENTION><MENTION group_id="2"><s>[mention=g:2]</s>test<e>[/mention]</e></MENTION><MENTION group_id="3"><s>[mention=g:3]</s>test<e>[/mention]</e></MENTION></r>',
[4, 2, 6],
],
];