# Safe Native XML Export for OJS 3.3.x

Plugin import/export OJS untuk menyelamatkan export Issue dan Artikel ketika Native XML export biasa berhenti karena satu record bermasalah.

## Fitur

- Export Issue atau Artikel terbit.
- Bisa export semua atau berdasarkan daftar ID.
- Memproses record satu per satu sehingga satu record rusak tidak menghentikan seluruh batch.
- Membersihkan byte UTF-8 rusak, NUL, karakter kontrol ilegal XML 1.0, dan bare ampersand pada hasil XML.
- Menangkap Exception, Error/TypeError dan warning PHP yang masih dapat ditangani.
- Menambahkan laporan `REPAIRED`, `WARNING`, dan `SKIPPED` sebagai komentar XML.
- Perbaikan metadata dilakukan **di memori**, tidak menulis perubahan ke database OJS.
- Memakai filter Native XML bawaan OJS (`article=>native-xml` dan `issue=>native-xml`).

## Kompatibilitas

Versi paket ini ditargetkan untuk OJS 3.3.x. Struktur plugin OJS 3.4/3.5 berubah cukup besar sehingga perlu build terpisah.

## Instalasi cPanel

1. Backup database dan `files_dir` OJS.
2. Extract folder `safeNativeExport` ke:
   `plugins/importexport/safeNativeExport`
3. Pastikan owner dan permission sama dengan plugin OJS lain.
4. Masuk Dashboard OJS sebagai Journal Manager/Admin.
5. Buka **Tools > Import/Export**.
6. Buka **Safe Native XML Export**.
7. Pilih Issue atau Artikel lalu klik **Export XML Aman**.

Jika plugin tidak muncul, hapus cache template OJS melalui Administration atau bersihkan isi folder cache yang aman untuk diregenerasi sesuai prosedur instalasi Anda.

## Arti laporan di awal XML

- `REPAIRED ID`: metadata pada objek export dibersihkan di memori.
- `WARNING ID`: PHP/libxml menghasilkan warning, tetapi record berhasil dipertahankan.
- `SKIPPED ID`: record tersebut tetap gagal setelah isolasi/sanitasi, sehingga dilewati agar batch lainnya tetap selesai.

## Batasan penting

Tidak ada plugin PHP yang dapat menjamin tetap berjalan pada kondisi fatal server seperti kehabisan memory, proses dibunuh hosting, disk penuh, atau file core OJS rusak. Plugin ini dirancang supaya error yang dapat ditangkap pada level record tidak menggagalkan seluruh batch.

Untuk Issue yang gagal karena salah satu artikel di dalamnya rusak, gunakan mode **Artikel** untuk mengekspor artikel satu per satu. Ini membantu menyelamatkan artikel sehat walaupun export satu Issue penuh gagal.

## Lisensi

GPL-3.0-or-later
