我有一个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” ,保罗”或“你好,彼得”。当我清除浏览器缓存后,一切正常。
也许这有助于解决我的困境。 :)
答案 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通过在生成的页面正文中替换字符串来实现其功能。除其他外,这意味着:
<!---INT_SCRIPT...
(整个标记)的字符串。然后是用例上下文注意事项。首先,cookie(实际上)会更改请求参数,并且应该是页面使用的缓存标识符的一部分(默认情况下不是这种方式)。其次,如果所说的cookie改变了页面的呈现方式(并且在给定用例的情况下确实如此),那么在缓存页面时,这将会引起麻烦。第三,基于cookie的页面输出更改可能指示敏感信息,或者至少指示用户特定信息。
考虑到上述情况,您应该执行以下操作之一:
cHash
(页面哈希值)中,以便设置cookie意味着您请求与cookie匹配的特定缓存版本。如果您的Cookie的值对于许多用户而言通常是相同的(例如,它包含从有限列表中选择的联系人并将其存储在Cookie中),则这是首选方式。希望能阐明不同的上下文以及为什么它们无法按照您尝试的方向进行交流;即使他们一直在交换字符串而不是数组。
另请参见:TypoScript中的.cache
子对象,您可以在其中为上述用例2设计唯一的缓存标识符。