Array bersarang (flatten)
Blok NEXA di NexaDom mengulang satu baris data pada satu waktu (pparse_block per elemen di assign_block_vars). Tidak ada pemetaan otomatis dari “array di dalam kolom” menjadi sub-loop kedua. Untuk parent + banyak child, pola umum: ratakan jadi satu array berindeks, tiap elemen punya flag (misalnya is_parent_header, is_child_item), lalu di template pakai {if flag} agar baris yang tepat yang mengeluarkan HTML pembuka, isi, atau penutup.
NexaDom.php · assign_block_vars process_nexa_blocks_optimized pparse_block
1. Apa yang diharapkan NexaDom?
Data blok disimpan sebagai daftar baris: _tpldata['nama_blok'] = [ baris1, baris2, … ]. Setiap baris adalah array asosiatif skalar (string, angka, boolean) untuk mengisi {nama_field}. Saat template di-render, setiap baris diproses terpisah — tidak ada langkah tambahan yang memecah field bertipe array menjadi loop anak secara otomatis.
Jadi jika Anda punya 'item' => [ … ] di dalam satu produk, satu baris itu tidak otomatis menjadi banyak baris template; Anda yang harus mengekspansinya di PHP menjadi banyak baris di array flat (satu baris per child, dengan flag).
2. Kenapa nexaBlock('produk', $produkNested) tidak cukup?
Contoh struktur sumber: tiap elemen top-level punya item berisi array varian. Itu adalah nested array, bukan daftar baris “datar” yang sama bentuknya.
$produkNested = [
[
'id' => 101,
'nama' => 'Laptop',
'harga' => 7500000,
'item' => [
['kode' => 'LP-01', 'warna' => 'Hitam', 'stok' => 10],
['kode' => 'LP-02', 'warna' => 'Silver', 'stok' => 5],
],
],
[
'id' => 102,
'nama' => 'Mouse',
'harga' => 150000,
'item' => [
['kode' => 'MS-01', 'warna' => 'Hitam', 'stok' => 25],
],
],
];
// $this->nexaBlock('produk', $produkNested); // bukan pola yang diinginkan untuk tampilan parent+child3. Solusi: satu antrian “peran” + flag
Flatten = ubah nested menjadi satu array linear: tiap elemen adalah satu “langkah” tampilan — buka kartu, tambah baris tabel, tampilkan kosong, tutup kartu. Pembedanya field boolean seperti is_parent_header, is_child_item, is_no_data, is_parent_footer. Hanya satu peran yang relevan per baris; field lain (nama, kode, …) diset sesuai peran itu.
Secara mental: bayangkan satu tape yang dibaca dari atas ke bawah; template masih satu pasangan <!-- NEXA produk --> … <!-- END produk -->, tetapi isinya banyak potongan HTML yang muncul bergantian lewat {if …}.
4. Controller: flatten lengkap (contoh kerja)
Contoh berikut menunjukkan pola flatten dari $produkNested ke $produkFlat:
$produkFlat = [];
foreach ($produkNested as $index => $parent) {
$produkFlat[] = [
'is_parent_header' => true,
'parent_index' => $index,
'id' => $parent['id'],
'nama' => $parent['nama'],
'harga' => number_format($parent['harga'], 0, ',', '.'),
'has_items' => !empty($parent['item']),
];
if (!empty($parent['item'])) {
foreach ($parent['item'] as $child) {
$produkFlat[] = [
'is_child_item' => true,
'parent_index' => $index,
'kode' => $child['kode'],
'warna' => $child['warna'],
'stok' => $child['stok'],
];
}
} else {
$produkFlat[] = [
'is_no_data' => true,
'parent_index' => $index,
];
}
$produkFlat[] = [
'is_parent_footer' => true,
'parent_index' => $index,
];
}
$this->nexaBlock('produk', $produkFlat);Setelah flatten, urutan indeks kira-kira: header Laptop → tiga child → footer Laptop → header Mouse → dua child → footer Mouse.
5. Template: satu NEXA, beberapa cabang if
Tag HTML yang dibuka di baris is_parent_header ditutup di baris is_parent_footer. Baris is_child_item hanya mengisi <tr>. Urutan blok {if} di bawah mengikuti pola di atas.
<!-- NEXA produk -->
{if is_parent_header}
<div class="product-card">
<h3>{nama}</h3>
<p>Harga: Rp {harga}</p>
<table><thead>…</thead><tbody>
{endif}
{if is_child_item}
<tr><td>{kode}</td>…</tr>
{endif}
{if is_no_data}
<tr><td colspan="3">Tidak ada item</td></tr>
{endif}
{if is_parent_footer}
</tbody></table>
</div>
{endif}
<!-- END produk -->6. Variasi nama flag (order tracking)
Pola sama dengan flag lain: is_order_header, is_tracking_item, is_no_data, is_order_footer — satu baris per peristiwa (header order, baris tracking, kosong, penutup).
7. Checklist cepat
- Array flat: setiap elemen = satu “peran” tampilan.
- Satu
nexaBlock('nama', $flat)atau$this->template->assign_block_vars('nama', …)untuk data yang sudah diratakan. - Template: satu blok NEXA; bedakan dengan
{if is_…}(bukan nested<!-- NEXA-->untuk child). - Tambahkan
parent_indexjika perlu membedakan parent di logika lain atau gaya.
Lanjut
Search keyword · Section & kompresi · If / elseif · Loops & blok · Variabel blok · Indeks Helper · Beranda.