diff --git a/phpBB/config/default/container/services_twig.yml b/phpBB/config/default/container/services_twig.yml
index 17ca9c7503..e7a7155deb 100644
--- a/phpBB/config/default/container/services_twig.yml
+++ b/phpBB/config/default/container/services_twig.yml
@@ -45,6 +45,8 @@ services:
template.twig.extensions.avatar:
class: phpbb\template\twig\extension\avatar
+ arguments:
+ - '@avatar.helper'
tags:
- { name: twig.extension }
diff --git a/phpBB/phpbb/template/twig/extension/avatar.php b/phpBB/phpbb/template/twig/extension/avatar.php
index fb7ec92655..238caddaf5 100644
--- a/phpBB/phpbb/template/twig/extension/avatar.php
+++ b/phpBB/phpbb/template/twig/extension/avatar.php
@@ -13,16 +13,36 @@
namespace phpbb\template\twig\extension;
+use phpbb\avatar\helper;
+use phpbb\avatar\manager;
+use phpbb\template\twig\environment;
+use Twig\Error\Error;
use Twig\Extension\AbstractExtension;
+use Twig\TwigFunction;
class avatar extends AbstractExtension
{
+ /**
+ * @var helper
+ */
+ private $avatar_helper;
+
+ /**
+ * Constructor for avatar extension
+ *
+ * @param helper $avatar_helper
+ */
+ public function __construct(helper $avatar_helper)
+ {
+ $this->avatar_helper = $avatar_helper;
+ }
+
/**
* Get the name of this extension
*
* @return string
*/
- public function getName()
+ public function getName(): string
{
return 'avatar';
}
@@ -30,13 +50,13 @@ class avatar extends AbstractExtension
/**
* Returns a list of global functions to add to the existing list.
*
- * @return \Twig\TwigFunction[] An array of global functions
+ * @return TwigFunction[] An array of global functions
*/
public function getFunctions(): array
{
- return array(
- new \Twig\TwigFunction('avatar', array($this, 'get_avatar')),
- );
+ return [
+ new TwigFunction('avatar', [$this, 'get_avatar'], ['needs_environment' => true]),
+ ];
}
/**
@@ -48,35 +68,30 @@ class avatar extends AbstractExtension
* The mode and row (group_row or user_row) are required.
* The other fields (alt|ignore_config|lazy) are optional.
*
- * @uses \phpbb_get_group_avatar()
- * @uses \phpbb_get_user_avatar()
- *
* @return string The avatar HTML for the specified mode
*/
- public function get_avatar()
+ public function get_avatar(environment $environment, string $mode, array $row, ?string $alt, ?bool $ignore_config, ?bool $lazy): string
{
- $args = func_get_args();
+ $alt = $alt ?? false;
+ $ignore_config = $ignore_config ?? false;
+ $lazy = $lazy ?? false;
+ $row = manager::clean_row($row, $mode);
+ $avatar = $this->avatar_helper->get_avatar($row, $alt, $ignore_config, $lazy);
- $mode = (string) $args[0];
- $row = (array) $args[1];
- $alt = isset($args[2]) ? (string) $args[2] : false;
- $ignore_config = isset($args[3]) ? (bool) $args[3] : false;
- $lazy = isset($args[4]) ? (bool) $args[4] : false;
-
- // To prevent having to redefine alt attribute ('USER_AVATAR'|'GROUP_AVATAR'), we check if an alternative has been provided
- switch ($mode)
+ try
{
- case 'group':
- return $alt ? phpbb_get_group_avatar($row, $alt, $ignore_config, $lazy) : phpbb_get_group_avatar($row);
- break;
-
- case 'user':
- return $alt ? phpbb_get_user_avatar($row, $alt, $ignore_config, $lazy) : phpbb_get_user_avatar($row);
- break;
-
- default:
- return '';
- break;
+ return $environment->render('macros/avatar.twig', [
+ 'SRC' => $avatar['lazy'] ? $this->avatar_helper->get_no_avatar_source() : $avatar['src'],
+ 'DATA_SRC' => $avatar['lazy'] ? $avatar['src'] : '',
+ 'WIDTH' => $avatar['width'],
+ 'HEIGHT' => $avatar['height'],
+ 'TITLE' => $avatar['title'],
+ 'LAZY' => $avatar['lazy'],
+ ]);
+ }
+ catch (Error $e)
+ {
+ return '';
}
}
}
diff --git a/phpBB/styles/all/template/macros/avatar.twig b/phpBB/styles/all/template/macros/avatar.twig
new file mode 100644
index 0000000000..6c3a3809cd
--- /dev/null
+++ b/phpBB/styles/all/template/macros/avatar.twig
@@ -0,0 +1 @@
+{% if SRC %}
{% endif %}
diff --git a/tests/template/extension_test.php b/tests/template/extension_test.php
index 207aa5e99f..64da6b79b3 100644
--- a/tests/template/extension_test.php
+++ b/tests/template/extension_test.php
@@ -89,6 +89,14 @@ class phpbb_template_extension_test extends phpbb_template_template_test_case
$enabled_drivers = $class->getProperty('enabled_drivers');
$enabled_drivers->setAccessible(true);
$enabled_drivers->setValue($class, false);
+ $avatar_helper = new phpbb\avatar\helper(
+ $config,
+ $phpbb_dispatcher,
+ $lang,
+ $phpbb_container->get('avatar.manager'),
+ $phpbb_path_helper,
+ new \phpbb\user($lang, '\phpbb\datetime')
+ );
$this->template_path = $this->test_path . '/templates';
@@ -122,7 +130,7 @@ class phpbb_template_extension_test extends phpbb_template_template_test_case
$this->user,
[
new \phpbb\template\twig\extension($context, $twig, $this->lang),
- new \phpbb\template\twig\extension\avatar(),
+ new \phpbb\template\twig\extension\avatar($avatar_helper),
new \phpbb\template\twig\extension\config($config),
new \phpbb\template\twig\extension\icon($this->user),
new \phpbb\template\twig\extension\username(),
@@ -153,7 +161,7 @@ class phpbb_template_extension_test extends phpbb_template_template_test_case
],
[],
[],
- '
',
+ '
',
[]
],
[
@@ -171,7 +179,7 @@ class phpbb_template_extension_test extends phpbb_template_template_test_case
],
[],
[],
- '
',
+ '
',
[]
],
[
@@ -190,6 +198,56 @@ class phpbb_template_extension_test extends phpbb_template_template_test_case
'',
[]
],
+ [
+ 'avatar_group.html',
+ [
+ 'row' => [
+ 'group_avatar' => 'great_avatar.png',
+ 'group_avatar_type' => 'avatar.driver.upload',
+ 'group_avatar_width' => 90,
+ 'group_avatar_height' => 90,
+ ],
+ 'alt' => 'foo'
+ ],
+ [],
+ [],
+ '
',
+ []
+ ],
+ [
+ 'avatar_group.html',
+ [
+ 'row' => [
+ 'group_avatar' => 'great_avatar.png',
+ 'group_avatar_type' => 'avatar.driver.upload',
+ 'group_avatar_width' => 90,
+ 'group_avatar_height' => 90,
+ ],
+ 'alt' => 'foo',
+ 'ignore_config' => true,
+ 'lazy' => true,
+ ],
+ [],
+ [],
+ '
',
+ []
+ ],
+ [
+ 'avatar_group.html',
+ [
+ 'row' => [
+ 'group_avatar' => 'foo@bar.com',
+ 'group_avatar_type' => 'avatar.driver.gravatar',
+ 'group_avatar_width' => 90,
+ 'group_avatar_height' => 90,
+ ],
+ 'alt' => 'foo'
+ ],
+ [],
+ [],
+ '',
+ []
+ ],
[
'extension_username_test.html',
[
diff --git a/tests/template/templates/avatar_group.html b/tests/template/templates/avatar_group.html
new file mode 100644
index 0000000000..95ae9c08c0
--- /dev/null
+++ b/tests/template/templates/avatar_group.html
@@ -0,0 +1 @@
+{{ avatar('group', row, alt, ignore_config, lazy) }}