Parse an existing JSON string in fluid template?

Deadly 提交于 2019-11-28 11:48:35

问题


I have a JSON string with some data I want to render in a template. As Fluid arrays are notated in JSON too, I thought I might just take that JSON string and hand it over to fluid, telling it to treat it just like some other array and use it in the template.

Thus gaining a lot of speed and losing overhead (don't have to split the JSON data up to save it in the DB, can template it easily in fluid).

It wouldn't work, at least not how I tried it.

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

It - of course - complained it had received a string, not an array.

Do I have to build a viewhelper and do json_decode before returning the array to fluid? Or is there a more native way?

Here's the basic controller action:

/**
 * 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);
}

回答1:


As an alternative to using a custom ViewHelper, you could use a transient property in your model. Let's assume your model has a property "jsonData" that is a JSON encoded string.

Now, you add another property $jsonArray and a getter for it:

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

And in the getter, you decode the data:

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

A transient property is like a virtual property. You don't need a DB field and TCA definition for it and you cannot do queries based on it, but you have the data available in your object:

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



回答2:


Yes you need to use own viewhelper or decode your JSON string in the controller (I prefer the last), depends which is more comfortable for you.

There is no way to decode JSON in Fluid, sorry




回答3:


In Fluid standalone and TYPO3v8 and up:

$this->view->assign('json', new \TYPO3Fluid\Fluid\Variables\JSONVariableProvider('path/to/my/fileOrUrl.json'));
// then in Fluid:
{json.any.path.inside.jsonfile}

See also the ChainedVariableProvider which will allow you to use for example a JSON file as base variables and variables from another array to overlay those. Using this VariableProvider causes Fluid to look for a (non-NULL) variable in the normal array first, then the JSON file (or vice versa if you order it thusly).




回答4:


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


来源:https://stackoverflow.com/questions/27274477/parse-an-existing-json-string-in-fluid-template

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!