Foreach v šabloně na JSON z databáze

ludek
Člen | 76
+
0
-

Zdravím,

mám v tabulce některá pole uložená jako JSON struktury. Příklad:

`data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`data`)):
// obsahuje:
[
{"polozka":"Název položky","cena":20.0,"pozice":30.0},
{"polozka":"Druhý název","cena":10.0,"pozice":80.0}
]`

Pak je potřebuji vypsat v šabloně společně s ostatními ne-JSON poli. Předem v presenteru musím předpřipravit:

$this->template->items = $this->repository->table('table'); // všechno

$data = $this->repository->table('table')->fetchPairs('id', 'data'); // jen JSON

foreach ($data as $key => $val) {
	if($val) { $this->template->data[$key] = Json::decode($val); }
	}

A pak teprve můžu v šabloně

{foreach $items as $i}
	{$i->text}
		{ifset $data[$i->id]}
			{foreach $data[$i->id] as $d}
			    {$d->polozka} {$d->cena} {$d->pozice} <br>
			{/foreach}
		{/ifset}
{/foreach}

Jde to nějak jednodušeji?
Může Nette Database při selectu převést JSON položky rovnou na pole?
Nebo by bylo zajímavé nějaké makro pro Latte, které by nejdřív převedlo na stdClass. Něco jako

	{foreachJson $data as $d}
	{/foreachJson}

Díky.

Pavel Kravčík
Člen | 1016
+
0
-

Možná inspirace… v ORM entitě jsme si udělali datový typ JSON. Při zápisu nebo čtení tam máme něco podobného:

if($property->getAnnotation()->getType() == 'json')
{
  return Json::decode($value, FORCE_ARRAY);
}

Tj. používáme jako pole vždy, překlad na JSON řeší entity.