2014-12-03 56 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