TYPO3 - 如何通过Viewhelper获取FE UID
问题描述:
如何通过Viewhelper获取并呈现FE用户的uid?下面是通过控制器工作...但不是在Viewhelper中。区别在哪里?我使用的是7.6.11,最后我想有FE用户的用户名和他的用户组用户名,并将其用于扩展名的html和一般的偏分数中。TYPO3 - 如何通过Viewhelper获取FE UID
/typo3conf/EXT /扩展/类别/ 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>
如所建议的通过迪米特里我取代
$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 /安装)和删除typo3temp ......现在它的工作后, !
答
如果你想返回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>
答
在7.x及更高版本中,ViewHelpers被编译,导致render
方法仅被调用一次用于编译。之后,只调用静态方法renderStatic()
。你可以覆盖renderStatic
,它会被称为每次:
<?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;
}
}
如果您需要在您的视图助手使用一些服务,事情变得更加复杂,因为依赖注入不会编译ViewHelpers工作。您需要获取对象管理器,并使用对象管理器获取服务的实例。
这可能是这样的,假设你想使用FrontendUserRepository
为服务,因为要返回整个用户对象,不仅是用户的UID:
<?php
namespace Vendor\Extension\ViewHelpers;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
class UserViewHelper extends AbstractViewHelper
{
/**
* @var FrontendUserRepository
*/
private static $frontendUserRepository = null;
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;
if (null === $userData) {
return null;
}
return static::getFrontendUserRepository()->findByUid((int)$userData['uid']);
}
private static function getFrontendUserRepository()
{
if (null === static::$frontendUserRepository) {
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
static::$frontendUserRepository = $objectManager->get(FrontendUserRepository::class);
}
return static::$frontendUserRepository;
}
}
免责声明:所有代码写入时没有实际运行它,因此存在错误。
哪个TYPO3版本?在7.x及更高版本中,ViewHelpers被编译,导致“render”方法只被调用一次(用于编译)。之后,只调用“renderStatic”(一种静态方法)。您可以覆盖每次都会调用的“renderStatic”。当然,这个版本库不会那么容易获得。 – Jost
您好Jost ...我更新上面。我使用7.6.11。你能展示一个样本吗?有太多?在我身边... –
你只需要用户标识或完整的用户对象? ID使得它更容易,因为不需要存储库。 – Jost