2016-09-16 4 views
0

Как я могу получить и отобразить uid пользователя FE через Viewhelper? Нижеследующее работает через контроллер ... но не в Viewhelper. Где разница? Я использую 7.6.11, и в конце я хотел бы иметь uid пользователя FE и его пользовательскую группу, а затем использовать его в html расширения и, в общем, частичном ...TYPO3 - как получить FE UID через Viewhelper

/typo3conf/внутр/удлинители/Классы/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

Привет, Йост ... Я обновил выше. Я использую 7.6.11. Можете ли вы показать образец? Слишком много ? на моей стороне ... –

+0

Вам просто нужен идентификатор пользователя или полный пользовательский объект? ID упрощает работу, поскольку репозиторий не требуется. – Jost

ответ

1

Если вы хотите вернуть пользователя или пользователя в пользовательский режим, просто верните его.

вместо

$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> 
2

В 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; 
    } 
} 

Если вам нужно использовать некоторые услуги в вашем ViewHelper, все становится более сложным, так как инъекции зависимостей не будет работать с составленным 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; 
    } 
} 

Отказ от ответственности: Все коды написанных без фактического запуска, поэтому в нем есть ошибки.