← Portal SIPASI R&D · Dokumentasi Teknis

# PEMETAAN CMS FRAMEWORK SIPASI (CODEIGNITER 4) Dokumen Arsitektur & Panduan Pengembangan Modul CMS Internal *Target Implementasi:* Modul Admin "Monitoring Telemetri & CCTV" *Lokasi Dokumen:* `/home/ubuntu/dss_sipasi/DOC_CMS_FRAMEWORK.md` *Sifat Dokumen:* Analisis Kode & Dokumentasi Arsitektur (Read-Only) ---

DAFTAR ISI

---

1. SIKLUS NAVIGASI (NAVIGATION LIFECYCLE)

1.1 Struktur Skema Tabel `cms_navigation`

Navigasi CMS SIPASI dikontrol secara terpusat oleh tabel database `cms_navigation` (`db_dump/DB_SIPASI_Oransbari.sql:1223-1243`).
sql
CREATE TABLE `cms_navigation` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lang_code` char(3) DEFAULT 'id',
  `web_id` char(10) DEFAULT '1',
  `position` char(20) DEFAULT 'top',
  `tabmenu` varchar(50) DEFAULT NULL,
  `sub_from_id` int(11) DEFAULT 0,         -- 0 = Menu Utama (Top-level), >0 = Submenu dari id induk
  `lis` int(11) DEFAULT 1,                 -- Urutan sorting tampilan menu (ORDER BY lis)
  `user_level` int(11) DEFAULT 0,          -- Hak akses level minimum (1=SuperAdmin, 2=Admin, 4=Publik)
  `title` varchar(50) NOT NULL,            -- Label teks yang muncul pada menu bar
  `sub_title` varchar(100) DEFAULT NULL,   -- Subtitle / deskripsi opsional
  `id_protab` int(11) DEFAULT NULL,        -- Relasi ke cms_table_property.id (jika view_mode = 'listing')
  `view_mode` varchar(50) DEFAULT 'listing', -- 'listing' | 'model' | 'list view'
  `val` varchar(255) DEFAULT NULL,         -- Path Class Model CI4 & method (jika view_mode = 'model')
  `inhome` int(11) DEFAULT NULL,
  `lisinhome` int(11) DEFAULT 0,
  `icon` varchar(150) DEFAULT NULL,        -- Class FontAwesome / icon HTML
  `description` varchar(200) DEFAULT NULL,
  `hidden` tinyint(1) DEFAULT 0,           -- 1 = disembunyikan
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
---

1.2 Alur Rendering Navigasi oleh Engine CMS

[User Request: /cms/{id}]
        │
        ▼
Controllers/Cms.php::index()
        │
        ├─► head_navigation() ──► App\Models\CmsNavigation::home()
        │                              │
        │                              ├─ Query cms_navigation (sub_from_id = 0, user_level)
        │                              ├─ Subnav query per menu (sub_from_id = nav.id)
        │                              ├─ Resolve active state ($this->idnav)
        │                              └─ Render ke Views/Cms/headNavigation.php
        │
        ├─► body_content() ─────► App\Models\CmsContent::home() (atau App\Models\Sipasi\Mdl_*)
        │
        └─► Parser::render('Cms/main_page')
                 │
                 ├─ {!HEAD_NAVIGATION!} ── Ditukar HTML navbar dari headNavigation.php
                 ├─ {!BODY_CONTENT!}     ── Ditukar HTML konten modul
                 └─ {!FOOTER!}           ── Ditukar HTML footer

Bukti Kode & Logika Eksekusi:

`Cms::index()` menyiapkan array data `$arrData` berisi placeholder `HEAD_NAVIGATION`, `BODY_CONTENT`, `FOOTER`, lalu memanggil template `Cms/main_page` melalui CodeIgniter Parser Service. Berisi tag `{ !HEAD_NAVIGATION! }` di atas `
{ !BODY_CONTENT! }
`.
html
     <li class="nav-item dropdown">
       <a class="nav-link dropdown-toggle {subactive}" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown">
         {title}
       </a>
       <ul class="dropdown-menu">
         <li><a class="dropdown-item {navActive}" href="{BASE_URL}cms/{id}/">{title}</a></li>
       </ul>
     </li>
     
html
     <li class="nav-item">
       <a class="nav-link {navActive}" href="{BASE_URL}cms/{id}/">{title}</a>
     </li>
     
---

1.3 Studi Kasus Perbandingan Menu Nyata di Database

| Atribut | Menu: Setting AWLMS (Listing Mode) | Menu: Skema Jaringan (Model Mode) | |---|---|---| | ID Menu | `41` | `37` | | Induk Menu (`sub_from_id`) | `29` (Submenu di bawah menu Pengaturan) | `29` (Submenu di bawah menu Pengaturan) | | Urutan (`lis`) | `23` | `22` | | Hak Akses (`user_level`)| `2` | `2` | | View Mode (`view_mode`) | `'listing'` | `'model'` | | ID Protab (`id_protab`) | `11` (merujuk `cms_table_property.id = 11`) | `0` / `NULL` | | Nilai Eksekusi (`val`) | `''` (kosong, dikendalikan tabel properti) | `'Sipasi\Mdl_skema_jaringan(membuat)'` | | URL Akses | `{BASE_URL}/cms/41/` | `{BASE_URL}/cms/37/` | ---

2. MODE 'MODEL' VS 'LISTING' (ARCHITECTURE & FLOW)

CMS SIPASI mendukung dua paradigma view mode utama yang diproses di `Models/Cms/CmsContent.php:150-178`:
                    ┌────────────────────────┐
                    │ cms_navigation.view_mode│
                    └───────────┬────────────┘
                                │
               ┌────────────────┴────────────────┐
               ▼                                 ▼
      [ view_mode = 'listing' ]         [ view_mode = 'model' ]
               │                                 │
               ▼                                 ▼
   CmsListing::listing(id_protab)      CmsContent membaca 'val'
               │                                 │
   ├─ cms_table_property               ├─ Parsing Class & Method:
   ├─ cms_listing_field                │  explode('(', $proNav['val'])
   ├─ CmsFormatField (tipe input/view) ├─ Instantiate: model('App\Models\' . $class)
   ├─ Dynamic CRUD & Pagination        └─ Eksekusi: $mdl->{$method}() atau home()
   └─ Render HTML tabel otomatis                 │
                                                 ▼
                                        Output View / HTML Kustom Bebas
---

2.1 Alur Lengkap Mode 'Model'

Mode `model` memberikan kontrol penuh kepada developer untuk membangun dashboard kompleks, canvas interaktif, atau manipulasi data multi-tabel.
php
   if ($viewMode == 'model') {
       $arrMdl = explode('(', $proNav['val']);
       $mdl = model('App\Models\\' . $arrMdl[0]);
       if (!empty($arrMdl[1])) {
           $fnc = substr($arrMdl[1], 0, -1); // Ambil nama method sebelum kurung tutup ')'
           $data = $mdl->{$fnc}();
       } else {
           $data = $mdl->home();
       }
       return $data;
   }
   
---

2.2 Alur Lengkap Mode 'Listing' (Engine CRUD Otomatis)

Mode `listing` merupakan generator antarmuka database dinamis berbasis metadata.

A. Tabel Properti: `cms_table_property` (`DB_SIPASI_Oransbari.sql:1294-1331`)

Mengatur tabel target, query dasar, tombol aksi, dan template. | Kolom | Tipe | Penjelasan & Fungsi | |---|---|---| | `id` | `int(11)` | Primary key (direferensikan oleh `cms_navigation.id_protab`). | | `table_name` | `varchar(100)` | Nama tabel fisik di database (contoh: `dts_device_node`). | | `title` | `varchar(150)` | Judul panel antarmuka listing. | | `custom_where` | `varchar(300)` | Klausa WHERE default SQL (contoh: `(device_type ='AWLMS' OR device_type ='AWLR')`). | | `order_by` | `varchar(60)` | Nama field untuk sorting default (contoh: `name` atau `id`). | | `sending` | `varchar(10)` | Arah sorting: `asc` atau `desc`. | | `id_key` | `varchar(60)` | Primary key tabel fisik (default: `id`). | | `entry_number` | `int(11)` | Jumlah baris data per halaman (pagination limit, default: `20`). | | `action` | `varchar(255)` | Semicolon-delimited action: `Insert;Update;Detail;Delete`. Mengatur kemunculan tombol Add Data di header dan tombol aksi per baris. | | `property` | `varchar(255)` | Semicolon-delimited: `Search;;;;;Zebra;Delete_All;Print;Save_Excel`. | | `use_listing_tpl` | `int(1)` | Flag `1` jika menggunakan template HTML kustom dari kolom `listing_tpl`. | | `use_update_tpl` | `int(1)` | Flag `1` jika menggunakan form input kustom dari kolom `update_tpl`. | | `use_detail_tpl` | `int(1)` | Flag `1` jika menggunakan modal/halaman detail kustom dari kolom `detail_tpl`. | | `js_listing` | `text` | Skrip JavaScript tambahan yang diinjeksi di kaki halaman listing. | | `plain_tpl` | `varchar(20)` | Mode rendering template form: `'1'` (plain cell) atau `'0'` (standar form table). | ---

B. Kolom Konfigurasi Field: `cms_listing_field` (`DB_SIPASI_Oransbari.sql:42-64`)

Mengatur perilaku visual, tipe input, validasi, dan konversi data setiap kolom tabel. | Kolom | Fungsi | |---|---| | `id_table_property` | Foreign key ke `cms_table_property.id`. | | `listing` | Urutan posisi kolom dalam tabel listing (ORDER BY listing). | | `field_name` | Nama fisik kolom pada tabel database. | | `label` | Label human-readable pada header tabel (``) dan form (`