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 %}{{ lang(TITLE) }}{% 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 ], [], [], - 'foo', + 'foo', [] ], [ @@ -171,7 +179,7 @@ class phpbb_template_extension_test extends phpbb_template_template_test_case ], [], [], - 'foo', + 'foo', [] ], [ @@ -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' + ], + [], + [], + '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, + ], + [], + [], + 'foo', + [] + ], + [ + '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) }}