Foreach v šabloně na JSON z databáze
- ludek
- Člen | 83
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 | 1195
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.