diff --git a/common/framework/Template.php b/common/framework/Template.php index 02a0e1357..9ad4a36d0 100644 --- a/common/framework/Template.php +++ b/common/framework/Template.php @@ -733,4 +733,22 @@ class Template return sprintf(' %s="%s"', $attribute, escape(implode($delimiters[$attribute], $values), false)); } + + /** + * Auth checker for v2. + * + * @param string $type + * @return bool + */ + protected function _v2_checkAuth(string $type = 'member'): bool + { + $grant = \Context::get('grant'); + switch ($type) + { + case 'admin': return $this->user->isAdmin(); + case 'manager': return $grant->manager ?? false; + case 'member': return $this->user->isMember(); + default: return $grant->$type ?? false; + } + } } diff --git a/common/framework/parsers/template/TemplateParser_v2.php b/common/framework/parsers/template/TemplateParser_v2.php index f47162f28..ac687dd45 100644 --- a/common/framework/parsers/template/TemplateParser_v2.php +++ b/common/framework/parsers/template/TemplateParser_v2.php @@ -66,8 +66,7 @@ class TemplateParser_v2 'unset' => ['if (!isset(%s)):', 'endif;'], 'empty' => ['if (empty(%s)):', 'endif;'], 'admin' => ['if ($this->user->isAdmin()):', 'endif;'], - 'auth' => ['if ($this->user->isMember()):', 'endif;'], - 'member' => ['if ($this->user->isMember()):', 'endif;'], + 'auth' => ['if ($this->_v2_checkAuth(%s)):', 'endif;'], 'guest' => ['if (!$this->user->isMember()):', 'endif;'], 'desktop' => ['if (!$__Context->m):', 'endif;'], 'mobile' => ['if ($__Context->m):', 'endif;'], @@ -495,7 +494,7 @@ class TemplateParser_v2 if (preg_match('#^end(.*)$#', $directive, $m)) { $stack = array_pop($this->_stack); - $directive = $m[1] ?: $stack['directive']; + $directive = $m[1] ?: ($stack ? $stack['directive'] : ''); } // Handle intermediate directives first. diff --git a/tests/unit/framework/parsers/TemplateParserV2Test.php b/tests/unit/framework/parsers/TemplateParserV2Test.php index f0f6c6ae9..0f7793380 100644 --- a/tests/unit/framework/parsers/TemplateParserV2Test.php +++ b/tests/unit/framework/parsers/TemplateParserV2Test.php @@ -746,20 +746,20 @@ class TemplateParserV2Test extends \Codeception\Test\Unit ]); $this->assertEquals($target, $this->_parse($source)); - // @auth, @member and @guest + // @auth and @guest $source = implode("\n", [ '@auth', - '@member', + '@auth(\'manager\')', '

Welcome back!

', - '@endmember', + '@endauth', '@end', '@guest', '

Please join!

', '@endguest', ]); $target = implode("\n", [ - 'user->isMember()): ?>', - 'user->isMember()): ?>', + '_v2_checkAuth()): ?>', + '_v2_checkAuth(\'manager\')): ?>', '

Welcome back!

', '', '',