在流体模板中解析现有的JSON字符串?

时间:2014-12-03 14:42:03

标签: typo3 fluid extbase typo3-6.2.x

我有一个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);
}

4 个答案:

答案 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>