title
  • 02 June 2026
  • Admin
title

<?= $this->include('layout/header') ?>
<?= $this->include('layout/sidebar') ?>

<div class="page-body">
<div class="container-fluid">

   <!-- PAGE TITLE -->
   <div class="page-title">
      <div class="row">
         <div class="col-6">
            <h4>Create Article</h4>
         </div>
         <div class="col-6 text-end">
            <a href="<?= base_url('admin/articles') ?>" class="btn btn-primary btn-sm">
               Back
            </a>
         </div>
      </div>
   </div>

</div>

<div class="container-fluid">
<div class="row">
<div class="col-xl-9 col-lg-10 col-md-12 mx-auto">

<div class="card">
<div class="card-header">
   <h5>Add New Article</h5>
</div>

<div class="card-body">

<form class="row g-3 needs-validation"
      method="post"
      action="<?= base_url('admin/articles/store') ?>"
      enctype="multipart/form-data"
      novalidate>

<?= csrf_field() ?>

<!-- TITLE -->
<div class="col-md-12">
   <label class="form-label">Title <span class="text-danger">*</span></label>
   <input type="text" name="title" class="form-control" required>
   <div class="invalid-feedback">Title is required</div>
</div>

<!-- SHORT DESCRIPTION -->
<div class="col-12">
   <label class="form-label">Short Description <span class="text-danger">*</span></label>
   <textarea name="short_description" id="short_description" class="form-control" rows="3" required></textarea>
   <div class="invalid-feedback">Short description is required</div>
</div>

<!-- CONTENT (WYSIWYG Editor) -->
<div class="col-12">
   <label class="form-label">Content</label>
   <textarea name="content" id="editor" class="form-control"></textarea>
</div>

<!-- FEATURED IMAGE -->
<div class="col-12">
   <label class="form-label">Featured Image</label>
   <input type="file" name="featured_image" class="form-control" accept="image/*">
   <small class="text-muted">Upload a featured image for the article</small>
</div>

<!-- STATUS -->
<div class="col-md-6">
   <label class="form-label">Status</label>
   <select name="status" class="form-select">
      <option value="1">Active</option>
      <option value="0">Inactive</option>
   </select>
</div>

<!-- SUBMIT -->
<div class="col-12 text-end">
   <button class="btn btn-success px-4">Save Article</button>
</div>

</form>

</div>
</div>
</div>
</div>
</div>
</div>
</div>

<!-- ===================================================== -->
<!-- TinyMCE CLOUD (FOR CONTENT EDITOR) -->
<!-- ===================================================== -->
<script src="https://cdn.tiny.cloud/1/w2o6sz03wpl1ef954fpf1ku5ejf24ri2i8ssh8sw3mku45kw/tinymce/8/tinymce.min.js"
        referrerpolicy="origin"
        crossorigin="anonymous"></script>

<!-- Fallback to self-hosted if CDN fails -->
<script>
if (typeof tinymce === "undefined") {
    document.write('<script src="<?= base_url('assets/tinymce/tinymce.min.js') ?>"><\/script>');
}
</script>

<!-- ===================================================== -->
<!-- TinyMCE INIT (WITH IMAGE UPLOAD) -->
<!-- ===================================================== -->
<script>
document.addEventListener("DOMContentLoaded", function () {

tinymce.init({
    selector: '#editor',
    height: 420,

    plugins: 'image link lists table code media',

    toolbar: 'undo redo | bold italic | alignleft aligncenter alignright | bullist numlist | image media link table | code',

    /* IMAGE UPLOAD */
    automatic_uploads: true,
    images_upload_url: "<?= base_url('admin/articles/upload-editor-image') ?>",
    images_upload_credentials: true,

    /* enable drag & paste */
    paste_data_images: true,

    /* show upload options */
    image_title: true,
    file_picker_types: 'image',

    /* guaranteed upload dialog */
    file_picker_callback: function (callback, value, meta) {
        if (meta.filetype === 'image') {
            const input = document.createElement('input');
            input.setAttribute('type', 'file');
            input.setAttribute('accept', 'image/*');

            input.onchange = function () {
                const file = this.files[0];
                const formData = new FormData();
                formData.append('file', file);

                fetch("<?= base_url('admin/articles/upload-editor-image') ?>", {
                    method: "POST",
                    body: formData
                })
                .then(res => res.json())
                .then(data => callback(data.location));
            };

            input.click();
        }
    },

    branding: false,
    promotion: false
});

});
</script>

<!-- Bootstrap Validation -->
<script>
(() => {
'use strict'
const forms = document.querySelectorAll('.needs-validation')
Array.from(forms).forEach(form => {
form.addEventListener('submit', event => {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false)
})
})()
</script>

<?= $this->include('layout/footer') ?>