To Select Multiple Records to Delete or Duplicate.
| 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 |
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>
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>
......
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;
}
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'));
}