TYPO3 - 如何通过Viewhelper获取FE UID

时间:2016-09-16 16:49:15

标签: php typo3 typo3-7.6.x

如何通过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后...现在正在工作!

2 个答案:

答案 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>