我有一个JSON字符串,其中包含我想在模板中呈现的一些数据。由于Fluid数组也以JSON标注,我想我可能只需要接受JSON字符串并将其交给流体,告诉它像处理其他数组一样处理它并在模板中使用它。
因此获得了大量的速度并且失去了开销(不必将JSON数据拆分以将其保存在数据库中,可以轻松地将其模板化为流畅的模板)。
它不会起作用,至少不是我如何尝试它。
<f:alias map="{item.jsonData}">
{fieldname}
</f:alias>
它 - 当然 - 抱怨它收到了一个字符串,而不是一个数组。
在将数组返回流体之前,是否必须构建一个viewhelper并执行json_decode
?还是有更原生的方式?
这是基本的控制器操作:
/**
* action show
*
* @param \NAMESPACE\Myext\Domain\Model\Item $item
* @return void
*/
public function showAction(\NAMESPACE\Myext\Domain\Model\Item $item) {
$this->view->assign('item', $item);
}
答案 0 :(得分:5)
作为使用自定义ViewHelper的替代方法,您可以在模型中使用瞬态属性。让我们假设你的模型有一个属性&#34; jsonData&#34;这是一个JSON编码的字符串。
现在,你为它添加另一个属性$ jsonArray和一个getter:
/**
* @var array
* @transient
*/
protected $jsonArray;
在getter中,您解码数据:
/**
* @return array
*/
public function getJsonArray() {
return json_decode($this->jsonData);
}
瞬态属性就像虚拟属性。您不需要数据库字段和TCA定义,也不能基于它进行查询,但您可以在对象中获得数据:
<f:for each="{item.jsonArray}" as="value">
{value}
</f:for>
答案 1 :(得分:1)
是的,您需要使用自己的viewhelper或解码控制器中的JSON字符串(我更喜欢最后一个),取决于哪个更适合您。
没有办法在Fluid中解码JSON,对不起
答案 2 :(得分:1)
在Fluid独立版和TYPO3v8及以上版本中:
$this->view->assign('json', new \TYPO3Fluid\Fluid\Variables\JSONVariableProvider('path/to/my/fileOrUrl.json'));
// then in Fluid:
{json.any.path.inside.jsonfile}
另请参阅ChainedVariableProvider
,它允许您使用例如JSON文件作为基本变量,并使用另一个数组中的变量来覆盖这些变量。使用此VariableProvider会导致Fluid首先在普通数组中查找(非NULL)变量,然后查找JSON文件(反之亦然,如果您这样订购)。
答案 3 :(得分:0)
<script type="text/javascript">
var json = '{f:format.htmlentitiesDecode(value:your_value)}';
var your_value = jQuery.parseJSON(json);
</script>