如何通过Viewhelper获取和呈现FE用户的uid?以下是通过控制器...而不是在Viewhelper中工作。区别在哪里?我正在使用7.6.11,最后我想拥有FE用户的uid和他的用户组uid,并进一步在扩展的html和一般的部分中使用它...
/typo3conf/ext/extension/Classes/ViewHelpers/UserViewHelper.php
<?php
namespace Vendor\Extension\ViewHelpers;
class UserViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper {
/**
* User Repository
*
* @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
* @inject
*/
protected $userRepository;
/**
* @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserGroupRepository
* @inject
*/
protected $frontendUserGroupRepository;
public function render() {
$userIDTest = $this->userRepository->findByUid($GLOBALS['TSFE']->fe_user->user['uid']);
$this->view->assign('userIDTest', $userIDTest);
}
}
List.html
<f:layout name="Default" />
<f:section name="main">
{userIDTest.uid}
</f:section>
根据Dimitry的建议,我更换了
$this->view->assign('userIDTest', $userIDTest);
带
return $userIDTest;
在List.html中我有这个:
{namespace custom=Vendor\Extension\ViewHelpers}
<f:layout name="Default" />
<f:section name="main">
<f:alias map="{user: '{custom:user()}'}">
{user.uid} {user.username}
</f:alias>
</f:section>
...清除所有缓存(FE / BE / Install)并删除typo3temp后...现在正在工作!
答案 0 :(得分:3)
在7.x及更高版本中编译ViewHelper,导致private void applyManyFilters(long[] initialData, LongPredicate... filters) {
long[] dataToUse = Arrays.stream(initialData)
.filter(combine(filters))
.toArray();
// Use filtered data
}
public static LongPredicate combine(LongPredicate... filters) {
return Arrays.stream(filters)
.reduce(LongPredicate::and)
.orElse(x -> true);
}
方法仅被调用一次进行编译。之后,只调用静态方法render
。您可以覆盖renderStatic()
,每次都会调用它:
renderStatic
如果您需要在ViewHelper中使用某些服务,事情会变得更复杂,因为依赖注入不能使用已编译的ViewHelper。您需要获取对象管理器,并使用对象管理器获取服务实例。
这可能看起来像这样,假设您希望使用<?php
namespace Vendor\Extension\ViewHelpers;
use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
class UserIdViewHelper extends AbstractViewHelper
{
public function render()
{
return static::renderStatic(
[],
$this->renderChildrenClosure,
$this->renderingContext
);
}
public static function renderStatic(
array $arguments,
\Closure $renderChildrenClosure,
RenderingContextInterface $renderingContext
) {
$userData = $GLOBALS['TSFE']->fe_user->user;
return null !== $userData ? (int)$userData['uid'] : null;
}
}
作为服务,因为您想要返回整个用户对象,而不仅仅是用户uid:
FrontendUserRepository
免责声明:所有代码都是在没有实际运行的情况下编写的,因此存在错误。
答案 1 :(得分:1)
如果要在viewhelper中返回用户或用户的uid,只需将其返回。
而不是
$this->view->assign('userIDTest', $userIDTest);
这样做
return $userIDTest;
在流体中,您可以以不同方式使用用户变量。最简单的方法是使用“别名”viewhelper:https://fluidtypo3.org/viewhelpers/fluid/master/AliasViewHelper.html
<f:alias map="{user: '{namespace:user()}'}">
{user.uid} {user.username}
</f:alias>