Nxdom Framework

Nusantara eXtreme Development Object Model — dokumentasi resmi

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+child

3. 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_index jika perlu membedakan parent di logika lain atau gaya.

Lanjut

Search keyword · Section & kompresi · If / elseif · Loops & blok · Variabel blok · Indeks Helper · Beranda.