【问题标题】:TYPO3 - how to get FE UID via ViewhelperTYPO3 - 如何通过 Viewhelper 获取 FE UID
【发布时间】:2016-09-16 16:49:14
【问题描述】:

如何通过 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);

}   

}

列表.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之后...现在可以正常工作了!

【问题讨论】:

  • 哪个 TYPO3 版本?在 7.x 及更高版本中,ViewHelpers 被编译,导致“render”方法仅被调用一次(用于编译)。之后,只调用“renderStatic”(一种静态方法)。您可以覆盖每次都会调用的“renderStatic”。当然,那时存储库不会那么容易获得。
  • 嗨 Jost ...我在上面更新了。我正在使用 7.6.11。你能展示一个样本吗?有太多?在我这边……
  • 您只想要用户 ID 还是完整的用户对象? ID 更容易,因为不需要存储库。
  • @Jost 请添加您的评论作为答案
  • @pgampe:太懒了......所有这些命名空间和东西让手头没有 IDE 真的很难。

标签: php typo3 typo3-7.6.x


【解决方案1】:

在 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 中使用某些服务,事情会变得更加复杂,因为依赖注入不适用于已编译的 ViewHelper。您需要获取对象管理器,并使用对象管理器获取服务实例。

这可能看起来像这样,假设您想使用 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;
    }
}

免责声明:所有代码都是在没有实际运行的情况下编写的,因此存在错误。

【讨论】:

    【解决方案2】:

    如果要在viewhelper中返回用户或者用户的uid,直接返回即可。

    而不是

    $this->view->assign('userIDTest', $userIDTest);
    

    这样做

    return $userIDTest;
    

    在您的流体中,您可以以不同的方式使用用户变量。最简单的一种是使用“别名”视图助手:https://fluidtypo3.org/viewhelpers/fluid/master/AliasViewHelper.html

    <f:alias map="{user: '{namespace:user()}'}">
        {user.uid} {user.username}
    </f:alias>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2015-10-11
      • 2023-03-26
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多