Component

Module

Bulk Action

To Select Multiple Records to Delete or Duplicate.

Directory

File Folder Link
backend.php \\SYNAS\Allan\DOCUMENTATION\Component\Bulk Action\rckuc\wolf\app\layouts
index.php \\SYNAS\Allan\DOCUMENTATION\Component\Bulk Action\rckuc\wolf\app\views\option
style.css \\SYNAS\Allan\DOCUMENTATION\Component\Bulk Action\rckuc\wolf\admin\themes\black_and_white
bulk_action.js \\SYNAS\Allan\DOCUMENTATION\Component\Bulk Action\rckuc\wolf\admin\javascript
OptionController.php \\SYNAS\Allan\DOCUMENTATION\Component\Bulk Action\rckuc\wolf\app\controllers

 

Step 1

Update: backend.php

Insert bulk_action.js in <head> section 

<head> <script type="text/javascript" src="<?php echo URI_PUBLIC; ?>wolf/admin/javascripts/bulk_action.js"></script> </head>
<head>
  <script type="text/javascript" src="<?php echo URI_PUBLIC; ?>wolf/admin/javascripts/bulk_action.js"></script>
</head>

Step 2

Update: index.php
Insert bulk action toolbar and bulk action form
Note :

1. Add an extra <th> for checkbox column in your <thead>

2. Add a checkbox for all your record

<!-- Bulk Action Form and Toolbar --> <form id="bulk_delete_form" method="post" action="<?php echo get_url('option/delete_multiple'); ?>"> <input type="hidden" name="ids" id="bulk_delete_ids"> </form> <form id="bulk_duplicate_form" method="post" action="<?php echo get_url('option/duplicate_multiple'); ?>"> <input type="hidden" name="ids" id="bulk_duplicate_ids"> </form> <div id="bulk_action_toolbar"> <div id="selection_info"></div> <div id="select_all" class="action_button">Select All</div> <div id="deselect_all" class="action_button">Deselect All</div> <img id="delete_multiple" title="Delete Record" src="<?php echo URL_PUBLIC ?>wolf/admin/images/icon-remove.gif" alt="remove icon" /> <img id="duplicate_multiple" title="Duplicate Record" src="<?php echo URL_PUBLIC ?>wolf/admin/images/duplicate.png" alt="duplicate icon" /> </div> <!-- In <thead> section --> <thead> <tr> <th></th> <!-- add an extra <th> for checkbox column --> <th class="files"><?php echo __('Name'); ?></th> ...... <!-- In <tbody> section --> <tbody> <?php while($option = $options->fetchObject()){ ?> <tr style="height:35px;" class="<?php echo odd_even(); ?>"> <td> <!-- add checkbok for each record --> <input type="checkbox" class="bulk_action_checkbox" data-id="<?php echo $option->id; ?>"> </td> ......
<!-- Bulk Action Form and Toolbar -->
<form id="bulk_delete_form" method="post" action="<?php echo get_url('option/delete_multiple'); ?>">
  <input type="hidden" name="ids" id="bulk_delete_ids">
</form>
<form id="bulk_duplicate_form" method="post" action="<?php echo get_url('option/duplicate_multiple'); ?>">
  <input type="hidden" name="ids" id="bulk_duplicate_ids">
</form>
<div id="bulk_action_toolbar">
    <div id="selection_info"></div>
    <div id="select_all" class="action_button">Select All</div>
    <div id="deselect_all" class="action_button">Deselect All</div>
    <img id="delete_multiple" title="Delete Record" src="<?php echo URL_PUBLIC ?>wolf/admin/images/icon-remove.gif" alt="remove icon" />
    <img id="duplicate_multiple" title="Duplicate Record" src="<?php echo URL_PUBLIC ?>wolf/admin/images/duplicate.png" alt="duplicate icon" />
</div>

<!-- In <thead> section -->
<thead>
  <tr>
    <th></th> <!-- add an extra <th> for checkbox column -->
    <th class="files"><?php echo __('Name'); ?></th>
    ......
        
<!-- In <tbody> section -->        
<tbody>
  <?php while($option = $options->fetchObject()){  ?>
  <tr style="height:35px;" class="<?php echo odd_even(); ?>">
    <td> <!-- add checkbok for each record -->
      <input type="checkbox" class="bulk_action_checkbox" data-id="<?php echo $option->id; ?>">
    </td>
    ......

Step 3

Update: style.css

/* FOR bulk_action_toolbar */ #bulk_delete_form, #bulk_duplicate_form { display: none; } #bulk_action_toolbar { display: none; align-items: center; gap: 1rem; background-color: #f9fafb; padding: 0.5rem 1rem; border: 1px solid #e5e7eb; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.04); margin: 1rem 0; } #selection_info { flex-grow: 1; } .action_button { cursor: pointer; padding: 6px 12px; background-color: #3b82f6; color: white; font-size: 13px; border-radius: 6px; transition: background-color 0.2s ease; } .action_button:hover { background-color: #2563eb; } #bulk_action_toolbar img { height: 18px; transition: opacity 0.2s ease; } #bulk_action_toolbar img:hover { opacity: 0.7; }
/* FOR bulk_action_toolbar */
#bulk_delete_form,
#bulk_duplicate_form {
  display: none;
}

#bulk_action_toolbar {
  display: none;
  align-items: center;
  gap: 1rem;
  background-color: #f9fafb;
  padding: 0.5rem 1rem;
  border: 1px solid #e5e7eb;
  border-radius: 8px;
  box-shadow: 0 2px 4px rgba(0,0,0,0.04);
  margin: 1rem 0;
}

#selection_info {
    flex-grow: 1;
}

.action_button {
  cursor: pointer;
  padding: 6px 12px;
  background-color: #3b82f6;
  color: white;
  font-size: 13px;
  border-radius: 6px;
  transition: background-color 0.2s ease;
}

.action_button:hover {
  background-color: #2563eb;
}

#bulk_action_toolbar img {
  height: 18px;
  transition: opacity 0.2s ease;
}

#bulk_action_toolbar img:hover {
  opacity: 0.7;
}

Step 4

Update: OptionController.php
Add 2 new functions:
1. delete_multiple()
2. duplicate_multiple()

function delete_multiple() { $this->_checkPermission(); if (!isset($_POST['ids']) || empty($_POST['ids'])) { Flash::set('error', __('No options selected for deletion.')); redirect(get_url('option')); } $ids = explode(',', $_POST['ids']); $deleted = 0; foreach ($ids as $id) { $option = Option::findById((int)$id); if ($option && $option->delete()) { $deleted++; } } if ($deleted > 0) { Flash::set('success', "$deleted option(s) deleted successfully."); } else { Flash::set('error', 'No options were deleted.'); } redirect(get_url('option')); } function duplicate_multiple() { $this->_checkPermission(); if (!isset($_POST['ids']) || empty($_POST['ids'])) { Flash::set('error', __('No options selected for duplication.')); redirect(get_url('option')); } $ids = explode(',', $_POST['ids']); $duplicated = 0; foreach ($ids as $id) { $option = Option::findById((int)$id); $option->name = '(Copy of) ' . $option->name; $option->code = '(Copy of) ' . $option->code; $option->created_by_id = AuthUser::getId(); $option->created_on = date('Y-m-d H:i:s'); $option->updated_by_id = null; $option->updated_on = null; if ($option && $option->duplicate()) { $duplicated++; } } if ($duplicated > 0) { Flash::set('success', "$duplicated option(s) duplicated successfully."); } else { Flash::set('error', 'No options were duplicated.'); } redirect(get_url('option')); }
function delete_multiple() {
    $this->_checkPermission();

    if (!isset($_POST['ids']) || empty($_POST['ids'])) {
        Flash::set('error', __('No options selected for deletion.'));
        redirect(get_url('option'));
    }

    $ids = explode(',', $_POST['ids']);
    $deleted = 0;

    foreach ($ids as $id) {
        $option = Option::findById((int)$id);
        if ($option && $option->delete()) {
            $deleted++;
        }
    }

    if ($deleted > 0) {
        Flash::set('success', "$deleted option(s) deleted successfully.");
    } else {
        Flash::set('error', 'No options were deleted.');
    }

    redirect(get_url('option'));
}

function duplicate_multiple() {
    $this->_checkPermission();

    if (!isset($_POST['ids']) || empty($_POST['ids'])) {
        Flash::set('error', __('No options selected for duplication.'));
        redirect(get_url('option'));
    }

    $ids = explode(',', $_POST['ids']);
    $duplicated = 0;

    foreach ($ids as $id) {
        $option = Option::findById((int)$id);
        $option->name = '(Copy of) ' . $option->name;
        $option->code = '(Copy of) ' . $option->code;
        $option->created_by_id = AuthUser::getId();
        $option->created_on = date('Y-m-d H:i:s');
        $option->updated_by_id = null;
        $option->updated_on = null;
        if ($option && $option->duplicate()) {
            $duplicated++;
        }
    }

    if ($duplicated > 0) {
        Flash::set('success', "$duplicated option(s) duplicated successfully.");
    } else {
        Flash::set('error', 'No options were duplicated.');
    }

    redirect(get_url('option'));
}
Code Copied To Clipboard!