2014-12-03 52 views
0

我有一个JSON字符串与我想要在模板中呈现的一些数据。由于流体数组在JSON中也有记号,所以我想我可能只是把这个JSON字符串交给流体,告诉它像对待其他数组一样处理它,并在模板中使用它。因此获得了大量的速度和开销(不必将JSON数据拆分到DB中,可以很容易地将其模板化)。解析流体模板中的现有JSON字符串?

它不会工作,至少不是我如何尝试它。

<f:alias map="{item.jsonData}"> 
    {fieldname} 
</f:alias> 

它 - 当然 - 抱怨它收到了一个字符串,而不是一个数组。

在将数组返回给fluid之前,我必须构建一个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); 
} 

回答

5

作为替代使用自定义视图助手,你可以在模型中使用的过渡性质。假设你的模型有一个属性“jsonData”,它是一个JSON编码的字符串。现在

,又添加了另一个属性$ jsonArray和getter方法吧:

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

而在吸气,你对数据进行解码:

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

瞬态特性就像一个虚拟的财产。你并不需要一个数据库字段,TCA定义它,你不能做此基础上查询,但你必须在你的对象提供的数据:

<f:for each="{item.jsonArray}" as="value"> 
{value} 
</f:for> 
+0

大声笑,我只是写...这;)只是为了注意 - 为瞬态字段跳过数据库字段和TCA声明。 – biesior 2014-12-03 17:55:44

+0

哈哈:-)。我用“DB领域和”澄清了我的答案。谢谢。 – lorenz 2014-12-03 18:00:10

+1

伙计们,这真棒!非常感谢! (我首先以为它可以直接在jsonData的getter中直接使用json_decoding,但由于数据类型不同,数组类型不同)。瞬态属性很棒!十分优雅。 – Urs 2014-12-03 21:06:15

1

是的,你需要用自己的视图助手或控制器(我喜欢最后一个),取决于它是你更舒适的解码你的JSON字符串。

有没有办法在流体解码JSON,对不起

+0

我宁愿在控制器中也这样做。你能给我一点点推动吗?我已经发布了上面的(标准)控制器操作。在将$ item分配给视图之前,我想解码$ item.jsonData,使其变成“流动的”。 – Urs 2014-12-03 14:55:11

+0

否则我就解析字符串较早,但我认为这将是很好的做到这一点:-) – Urs 2014-12-03 14:57:41

+1

我觉得这样(没试过),你可以做到这一点从EXT ViewHelpers:VHS。 ' v:format.json.decode()}”/>'。 EXT:vhs rulez。 – Jost 2014-12-03 15:32:58

1

流体独立和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文件(如果您这样命令,则反之亦然)。

+0

wohooo - 听起来不错!可能与瞬态场的表现更快,对吧? – Urs 2016-09-03 06:35:09

+1

大致相同的性能,主要区别是对象引用被转移而不是数组。你需要一个真正的大JSON数组(不是对象)来注意性能上的差异。好处是API和其他变量提供者的组合。 – 2016-09-03 12:57:42

0
<script type="text/javascript"> 
    var json = '{f:format.htmlentitiesDecode(value:your_value)}'; 
    var your_value = jQuery.parseJSON(json); 
</script> 
+3

欢迎来到堆栈溢出:-) 请看[answer]。您应该提供一些信息,说明为什么您的代码可以解决问题。 仅有代码的答案对社区没有用处。 – JimHawkins 2017-02-09 09:23:25