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 ......现在它的工作后, !

+0

哪个TYPO3版本?在7.x及更高版本中,ViewHelpers被编译,导致“render”方法只被调用一次(用于编译)。之后,只调用“renderStatic”(一种静态方法)。您可以覆盖每次都会调用的“renderStatic”。当然,这个版本库不会那么容易获得。 – Jost

+0

您好Jost ...我更新上面。我使用7.6.11。你能展示一个样本吗?有太多?在我身边... –

+0

你只需要用户标识或完整的用户对象? ID使得它更容易,因为不需要存储库。 – Jost

如果你想返回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; 
    } 
} 

免责声明:所有代码写入时没有实际运行它,因此存在错误。