0

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

4 回答 4

5

作为使用自定义 ViewHelper 的替代方法,您可以在模型中使用瞬态属性。假设您的模型有一个属性“jsonData”,它是一个 JSON 编码的字符串。

现在,为它添加另一个属性 $jsonArray 和一个 getter:

/**
 * @var array
 * @transient
 */
protected $jsonArray;

在 getter 中,你解码数据:

/**
 * @return array
 */
public function getJsonArray() {
  return json_decode($this->jsonData);
}

瞬态属性类似于虚拟属性。您不需要 DB 字段和 TCA 定义,也不能基于它进行查询,但您的对象中有可用的数据:

<f:for each="{item.jsonArray}" as="value">
 {value}
</f:for>
于 2014-12-03T17:52:43.023 回答
1

是的,您需要使用自己的 viewhelper 或在控制器中解码您的 JSON 字符串(我更喜欢最后一个),这取决于哪个更适合您。

没有办法在 Fluid 中解码 JSON,对不起

于 2014-12-03T14:48:35.813 回答
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 文件(反之亦然,如果您如此订购)。

于 2016-09-03T00:53:00.933 回答
0
<script type="text/javascript">
  var json = '{f:format.htmlentitiesDecode(value:your_value)}';
  var your_value = jQuery.parseJSON(json);
</script>
于 2017-02-09T08:16:38.837 回答