【问题标题】:Parse an existing JSON string in fluid template?解析流体模板中的现有 JSON 字符串?
【发布时间】:2014-12-03 14:42:02
【问题描述】:

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

【问题讨论】:

    标签: typo3 fluid extbase typo3-6.2.x


    【解决方案1】:

    作为使用自定义 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>
    

    【讨论】:

    • 大声笑,我只是在写...这个 ;) 只是为了注意 - 对于瞬态字段,请跳过 DB 字段和 TCA 声明。
    • 哈哈 :-)。我用“数据库字段和”澄清了我的答案。谢谢。
    • 伙计们,这太棒了!非常感谢! (我首先认为它可以通过 json_decoding 直接在 jsonData 的 getter 中工作,但由于不同的数据类型字符串/数组,这将不起作用)。瞬态属性很棒!非常优雅。
    • Jost 提到的 vhs viewhelper v:format.json.decode() 也可以完成这项工作
    【解决方案2】:

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

    Fluid 中无法解码 JSON,抱歉

    【讨论】:

    • 我宁愿在控制器中也这样做。你能给我一点推动吗?我已经在上面发布了(标准)控制器操作。在将 $item 分配给视图之前,我想解码 $item.jsonData 使其变得“可流动”。
    • 否则我会更早地解析字符串,但我认为这样做会很好:-)
    • 我认为(尚未尝试)您可以使用 EXT:vhs 中的 ViewHelpers 来做到这一点。 &lt;v:variable.set name="decodedJson" value="{insertYourJsonStringHere -&gt; v:format.json.decode()}"/&gt;。 EXT:vhs rulez.
    • @Urs lorenz 提供了一个瞬态字段的示例,所以我不会复制它,因为实际上这是您正在寻找的解决方案;)
    • @Jost 这也有效,也非常感谢! @biesior - 所以严格来说它不是流动的,但非常接近。
    【解决方案3】:

    在 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 文件(反之亦然,如果您如此订购)。

    【讨论】:

    • 哇——听起来不错!可能瞬态场的性能更快,对吧?
    • 性能大致相同,主要区别在于传输的是对象引用而不是数组。您需要一个非常大的 JSON 数组(而不是对象)才能注意到性能上的任何差异。好处是 API 和与其他变量提供程序的组合。
    【解决方案4】:
    <script type="text/javascript">
      var json = '{f:format.htmlentitiesDecode(value:your_value)}';
      var your_value = jQuery.parseJSON(json);
    </script>
    

    【讨论】:

    • 欢迎来到堆栈溢出 :-) 请看How to Answer。您应该提供一些信息为什么您的代码可以解决问题。纯代码答案对社区没有用处。
    猜你喜欢
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2015-11-11
    • 2010-12-11
    • 2020-02-24
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多