Files
igny8/igny8-wp-plugin-for-reference-olny/modules/components/pagination-tpl.php
2025-11-09 10:27:02 +00:00

137 lines
5.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* ==========================
* 🔐 IGNY8 FILE RULE HEADER
* ==========================
* @file : pagination-tpl.php
* @location : /modules/components/pagination-tpl.php
* @type : Component
* @scope : Cross-Module
* @allowed : Pagination rendering, navigation controls
* @reusability : Shared
* @notes : Dynamic pagination component for all modules
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
// Render pagination function
function igny8_render_pagination($table_id, $pagination = []) {
// Set variables for component
$module = explode('_', $table_id)[0];
$tab = explode('_', $table_id)[1] ?? '';
// Set default pagination values
$pagination = array_merge([
'current_page' => 1,
'total_pages' => 1,
'per_page' => 10,
'total_items' => 0
], $pagination);
// Start output buffering to capture HTML
ob_start();
?>
<!-- Pagination -->
<div class="igny8-pagination igny8-mt-20"
data-table="<?php echo esc_attr($table_id); ?>"
data-current-page="<?php echo esc_attr($pagination['current_page']); ?>"
data-per-page="<?php echo esc_attr($pagination['per_page']); ?>"
data-total-items="<?php echo esc_attr($pagination['total_items']); ?>"
data-module="<?php echo esc_attr($module); ?>"
data-tab="<?php echo esc_attr($tab); ?>">
<button class="igny8-btn igny8-btn-sm igny8-btn-outline igny8-page-btn"
data-page="<?php echo max(1, $pagination['current_page'] - 1); ?>"
<?php echo $pagination['current_page'] <= 1 ? 'disabled' : ''; ?>>
Previous
</button>
<?php if ($pagination['total_items'] > 20): ?>
<?php
$current = $pagination['current_page'];
$total = $pagination['total_pages'];
?>
<?php // Always show first 2 pages ?>
<?php for ($i = 1; $i <= min(2, $total); $i++): ?>
<button class="igny8-btn igny8-btn-sm igny8-page-btn <?php echo $i === $current ? 'igny8-btn-primary' : 'igny8-btn-outline'; ?>"
data-page="<?php echo $i; ?>">
<?php echo $i; ?>
</button>
<?php endfor; ?>
<?php // Add ellipsis if there's a gap ?>
<?php if ($total > 4 && $current > 3): ?>
<span style="margin: 0 8px; color: #666;">...</span>
<?php endif; ?>
<?php // Show current page if it's not in first 2 or last 2 ?>
<?php if ($current > 2 && $current < $total - 1): ?>
<button class="igny8-btn igny8-btn-sm igny8-page-btn igny8-btn-primary"
data-page="<?php echo $current; ?>">
<?php echo $current; ?>
</button>
<?php endif; ?>
<?php // Add ellipsis before last 2 if there's a gap ?>
<?php if ($total > 4 && $current < $total - 2): ?>
<span style="margin: 0 8px; color: #666;">...</span>
<?php endif; ?>
<?php // Always show last 2 pages (if different from first 2) ?>
<?php for ($i = max(3, $total - 1); $i <= $total; $i++): ?>
<?php if ($i > 2): // Don't duplicate first 2 pages ?>
<button class="igny8-btn igny8-btn-sm igny8-page-btn <?php echo $i === $current ? 'igny8-btn-primary' : 'igny8-btn-outline'; ?>"
data-page="<?php echo $i; ?>">
<?php echo $i; ?>
</button>
<?php endif; ?>
<?php endfor; ?>
<?php endif; ?>
<button class="igny8-btn igny8-btn-sm igny8-btn-outline igny8-page-btn"
data-page="<?php echo min($pagination['total_pages'], $pagination['current_page'] + 1); ?>"
<?php echo $pagination['current_page'] >= $pagination['total_pages'] ? 'disabled' : ''; ?>>
Next
</button>
<!-- Records per page selector -->
<div class="igny8-per-page-selector" style="margin-left: 20px; display: inline-flex; align-items: center; gap: 8px;">
<label for="<?php echo esc_attr($table_id); ?>_per_page" style="font-size: 12px; color: #666;">Show:</label>
<select id="<?php echo esc_attr($table_id); ?>_per_page" class="igny8-per-page-select" data-table="<?php echo esc_attr($table_id); ?>" style="padding: 4px 8px; font-size: 12px; border: 1px solid #ddd; border-radius: 4px;">
<option value="10" <?php selected($pagination['per_page'], 10); ?>>10</option>
<option value="20" <?php selected($pagination['per_page'], 20); ?>>20</option>
<option value="50" <?php selected($pagination['per_page'], 50); ?>>50</option>
<option value="100" <?php selected($pagination['per_page'], 100); ?>>100</option>
</select>
<span style="font-size: 12px; color: #666;">per page</span>
</div>
<span style="margin-left: 12px; font-size: 12px; color: #666;">
Showing <?php echo (($pagination['current_page'] - 1) * $pagination['per_page']) + 1; ?>-<?php echo min($pagination['current_page'] * $pagination['per_page'], $pagination['total_items']); ?> of <?php echo $pagination['total_items']; ?> items
</span>
</div>
<?php
return ob_get_clean();
}
// Set default values
$table_id = $table_id ?? 'data_table';
$pagination = $pagination ?? [
'current_page' => 1,
'total_pages' => 1,
'per_page' => 10,
'total_items' => 0
];
$module = $module ?? '';
$tab = $tab ?? '';
// Debug state: Pagination HTML rendered
if (function_exists('igny8_debug_state')) {
igny8_debug_state('PAGINATION_HTML_RENDERED', true, 'Pagination HTML rendered for ' . $table_id);
}
?>