在USER_INT userFunc中返回数组会导致<!-INT_SCRIPT输出

时间:2019-06-05 11:56:08

标签: typo3 fluid

我有一个userFunc,可以通过

调用
lib.random = USER_INT
lib.random {
  userFunc = My\Plugin\UserFunc\Functions->random
}

当我返回一个数组并尝试访问它时失败。

<v:variable.set name="random" value="{f:cObject(typoscriptObjectPath: 'lib.random')}" />
{random.max}

当我尝试调试它时,我得到了一些<!--INT_SCRIPT字符串

有人知道这个问题和解决方案吗?

/ e:

我想通过描述Szenario使问题更清楚。

我有一个带有登录表单的插件。当用户登录时,我为JWT设置了各种基本信息(名称,电子邮件)。 此信息必须显示在网站周围的各个地方,而不仅是一页(例如个人资料页)。有些情况是预填表格,或者只是愚蠢的“ Hello,Paul”之类的东西。

因此,当我第一次登录(新鲜的浏览器,没有缓存)时,我注销并使用另一个帐户登录(让我们称之为“ Peter”)后读“ Hello,Paul”,然后仍然写为“ Hello” ,保罗”或“你好,彼得”。当我清除浏览器缓存后,一切正常。

也许这有助于解决我的困境。 :)

2 个答案:

答案 0 :(得分:0)

USER_INT没有被缓存,因此在建立缓存后将替换其值。

我认为f:cObject是错误的方法。实施自己的ViewHelper以获取相同的数据应该是更好的方法。

<?php
namespace My\Plugin\ViewHelpers;

use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;

class RandomViewHelper extends AbstractViewHelper
{
    use CompileWithRenderStatic;

    /**
     * @var boolean
     */
    protected $escapeOutput = false;

    /**
     * @param array $arguments
     * @param \Closure $renderChildrenClosure
     * @param RenderingContextInterface $renderingContext
     * @return string
     */
    public static function renderStatic(
        array $arguments,
        \Closure $renderChildrenClosure,
        RenderingContextInterface $renderingContext
    ) {
        return rand();
    }

}

现在您可以像下面这样使用它:

{my:random()} or <my:random />

答案 1 :(得分:0)

TL; DR:使用标记将TYPO3中未缓存的部分替换为生成的页面输出字符串中的内容,并且无法按照此处预期的方向进行通信。选择性地缓存,禁用缓存或从主请求中分离数据(使用XHR或其他方法)是唯一可能的方法。

应该清楚,USER_INT通过在生成的页面正文中替换字符串来实现其功能。除其他外,这意味着:

  • 即使整个页面都未缓存,也永远不能将USER_INT的输出传递给Fluid中的任何内容。您将有效地传递包含<!---INT_SCRIPT...(整个标记)的字符串。
  • 但是,您可以从Fluid中生成USER_INT,该用户最终在生成的页面中,然后将其替换为渲染的对象(使用f:cObject渲染USER_INT或COA_INT)。

然后是用例上下文注意事项。首先,cookie(实际上)会更改请求参数,并且应该是页面使用的缓存标识符的一部分(默认情况下不是这种方式)。其次,如果所说的cookie改变了页面的呈现方式(并且在给定用例的情况下确实如此),那么在缓存页面时,这将会引起麻烦。第三,基于cookie的页面输出更改可能指示敏感信息,或者至少指示用户特定信息。

考虑到上述情况,您应该执行以下操作之一:

  1. 要么将整个基于cookie更改的输出块都呈现为USER_INT。这意味着包装整个Fluid输出并将其全部呈现而无需缓存。请注意,模板编译仍然会发生(如果某些部分从未根据请求参数进行更改,则可以使用f:cache.static对其进行硬缓存)。
  2. 或将cookie值添加到cHash(页面哈希值)中,以便设置cookie意味着您请求与cookie匹配的特定缓存版本。如果您的Cookie的值对于许多用户而言通常是相同的(例如,它包含从有限列表中选择的联系人并将其存储在Cookie中),则这是首选方式。
  3. 或者,在您的输出包含实际敏感信息的情况下,要求 content元素或页面仅在使用特定组登录时才可用。这有两个目的:首先,它保护页面在未经身份验证的情况下不被查看-但其次,它还使页面内容不被缓存,或者使用前端用户组ID作为缓存身份的一部分进行缓存。 。
  4. 重构XHR请求并使其使用的端点(USER_INT或手动禁用的缓存上下文),然后加载数据。或在Cookie中设置实际数据,然后使用JS在需要的地方插入值。

希望能阐明不同的上下文以及为什么它们无法按照您尝试的方向进行交流;即使他们一直在交换字符串而不是数组。

另请参见:TypoScript中的.cache子对象,您可以在其中为上述用例2设计唯一的缓存标识符。