PHP Classes

File: docs/CHANGELOG-CRUD-PAGINATION.md

Recommend this page to a friend!
  Packages of Adrian M   upMVC   docs/CHANGELOG-CRUD-PAGINATION.md   Download  
File: docs/CHANGELOG-CRUD-PAGINATION.md
Role: Auxiliary data
Content type: text/markdown
Description: Auxiliary data
Class: upMVC
Pure PHP web development without other frameworks
Author: By
Last change:
Date: 2 months ago
Size: 6,844 bytes
 

Contents

Class file image Download

CRUD & Dashboard Enhancement - Complete Implementation

Date: 2024-11-15 Branch: Structure-Security Commit: cc8d999

? Summary

Successfully implemented full-featured CRUD and Dashboard module types with pagination, input sanitization, and security improvements inspired by the old crudgenerator.

? What Was Implemented

1. Pagination System

Model Layer

  • `getAllPaginated($page, $pageSize)` - Returns paginated results
  • `getTotalCount()` - Returns total record count
  • Works with both database and demo data

Controller Layer

$page = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT) ?: 1;
$items = $this->model->getAllPaginated($page, 10);
$totalPages = ceil($totalItems / $pageSize);

View Layer (Bootstrap 5 UI)

  • Previous/Next buttons with Font Awesome icons
  • Numbered page links with active state
  • Footer showing "page X of Y (Z total items)"
  • Only displays if `total_pages > 1`

Locations: 13 references in views/index.php

2. Input Sanitization

All user inputs now sanitized with filter_input():

// Type-aware sanitization in getPostData()
$filter = FILTER_SANITIZE_SPECIAL_CHARS; // Default

if (in_array($htmlType, ['number', 'range'])) {
    $filter = FILTER_SANITIZE_NUMBER_INT;
} elseif ($htmlType === 'email') {
    $filter = FILTER_SANITIZE_EMAIL;
}

$data[$fieldName] = filter_input(INPUT_POST, $fieldName, $filter) ?? '';

All IDs sanitized: - Page numbers: FILTER_SANITIZE_NUMBER_INT - Edit IDs (GET): FILTER_SANITIZE_NUMBER_INT - Update IDs (POST): FILTER_SANITIZE_NUMBER_INT - Delete IDs (GET): FILTER_SANITIZE_NUMBER_INT

Security Benefits: - ? XSS Prevention - ? SQL Injection Protection - ? Type-safe data processing

3. Complete CRUD Operations

Controller Methods

display()   // Action router + list view with pagination
create()    // Show create form
store()     // CREATE operation
edit()      // Show edit form
update()    // UPDATE operation
delete()    // DELETE operation (with confirmation)

Model Methods

getAll()              // All records
getAllPaginated()     // Paginated results
getTotalCount()       // Count for pagination
getById($id)          // Single record
create($data)         // INSERT
update($id, $data)    // UPDATE
delete($id)           // DELETE

Routes (All Registered)

GET  /products                  ? List (paginated)
GET  /products?action=create    ? Create form
POST /products?action=store     ? Save new
GET  /products?action=edit&id=1 ? Edit form
POST /products?action=update    ? Save changes
GET  /products?action=delete&id=1 ? Delete (confirm)

4. Dashboard Implementation

New Separate Model

getDashboardStats()    // Returns 4 stat values
getRecentItems($limit) // Returns recent records
checkConnection()      // Database availability check
getDemoStats()         // Fallback stats [127, 98, 23, 6]
getDemoItems($limit)   // Fallback items with realistic data

Separate View Class

  • `render('dashboard', $data)` - Renders dashboard template (not 'index')
  • `renderFlashMessages()` - Displays session messages

Dashboard Template (views/dashboard.php)

  • 4 Bootstrap stat cards with icons - Total Items (database icon) - Active Items (check-circle) - Recent Activity (chart-line) - Pending Items (clock)
  • Recent items table (5 most recent)
  • Debug panel (development mode only)

5. Database Fallback System

Connection Checking

private function checkConnection(): bool
{
    return $this->db !== null && $this->db instanceof PDO;
}

Demo Data (Field-Aware)

private function getDemoData(): array
{
    $demoData = [];
    foreach ($this->configuredFields as $field) {
        // Generate appropriate data based on field name/type
        if (stripos($fieldName, 'name') !== false) {
            $row[$fieldName] = "Demo {$fieldName} {$i}";
        } elseif (stripos($fieldName, 'price') !== false) {
            $row[$fieldName] = number_format(rand(10, 999), 2);
        }
        // ... more intelligent defaults
    }
    return $demoData;
}

Warning Messages

$_SESSION['warning'] = 'Demo mode: Database not connected. Changes will not be saved.';

6. Dynamic Form Generation

Forms adapt to configured fields:

<?php foreach ($fields as $field): ?>
    <?php if ($field['html_type'] === 'textarea'): ?>
        <textarea name="<?php echo $field['name']; ?>" rows="4"><?php echo $item[$field['name']] ?? ''; ?></textarea>
    
    <?php elseif ($field['html_type'] === 'select'): ?>
        <select name="<?php echo $field['name']; ?>">
            <option value="active">Active</option>
            <option value="inactive">Inactive</option>
        </select>
    
    <?php else: ?>
        <input type="<?php echo $field['html_type']; ?>" 
               name="<?php echo $field['name']; ?>" 
               value="<?php echo $item[$field['name']] ?? ''; ?>">
    <?php endif; ?>
<?php endforeach; ?>

Supported Input Types: - text ? Text input - textarea ? Multiline text - number ? Number input - email ? Email input - select ? Dropdown (active/inactive) - date ? Date picker - checkbox ? Checkbox

7. Flash Messages

Session-based messaging system:

// Setting messages
$_SESSION['success'] = 'Product created successfully!';
$_SESSION['error'] = 'Failed to update Product';
$_SESSION['warning'] = 'Database not connected';

// View rendering
public function renderFlashMessages(): void
{
    foreach (['success', 'error', 'warning'] as $type) {
        if (isset($_SESSION[$type])) {
            echo "<div class='alert alert-{$type}'>...";
            unset($_SESSION[$type]); // Auto-clear
        }
    }
}

Bootstrap Alert Classes: - alert-success (green) - alert-danger (red) - alert-warning (yellow)

8. SQL Table Generation

Automatic table creation with all fields:

CREATE TABLE IF NOT EXISTS `products` (
  id INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(255) NOT NULL,
  `description` TEXT NOT NULL,
  `price` DECIMAL(10,2) NOT NULL,
  `status` ENUM("active","inactive") NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Auto-added Fields: - id (AUTO_INCREMENT PRIMARY KEY) - created_at (TIMESTAMP) - updated_at (TIMESTAMP with ON UPDATE)

? Old Crudgenerator Analysis

Features Adopted ?

  1. Pagination: - OLD: `readWithPagination($table, $page, $pageSize)` - NEW: `getAllPaginated($page, $pageSize)` + Bootstrap UI