StudentSubjects Documentation
Student Subjects Controller Documentation
File: /controllers/studentSubjectsController.php
Purpose: Manages academic subjects, groups, schedules, and income types for student management system
Last Updated: December 21, 2024
Total Functions: 5
Lines of Code: ~316
---
๐ Overview
The Student Subjects Controller handles the creation and management of academic subjects and their associated groups and schedules. It provides functionality for:
- โข Subject creation and management
- โข Subject group configuration with pricing
- โข Class scheduling with days and times
- โข Income type integration for billing
- โข Subject usage tracking
- โข Hierarchical subject organization (Subject โ Groups โ Days/Times)
- โข AJAX-powered data tables for subject listing
- โข Cascade deletion of related records
Primary Functions
- โ Create and edit academic subjects
- โ Manage subject groups with pricing
- โ Configure class schedules (days and times)
- โ Track subject usage and status
- โ Handle income type creation for billing
- โ Process cascade deletions
- โ AJAX data table functionality
- โ Dynamic form row management
Related Controllers
- โข studentSettings.php - System configuration
- โข studentsAddSubject.php - Student-subject assignments
- โข studentsExamsController.php - Subject exams
- โข studentAbsence.php - Class attendance
---
๐๏ธ Database Tables
Primary Tables (Direct Operations)
| Table Name | Purpose | Key Columns | |
|---|---|---|---|
| **studentsubjects** | Main subjects | id, subjectname, subjectprice, deviceid, ipaddress, incometypeid, useit, del | |
| **studentsubjectgroups** | Subject groups/classes | id, studentsubjectid, subjectgroupname, subjectgroupprice, useit, del | |
| **studentsubjectgroupdays** | Class schedules | id, studentsubjectid, studentsubjectgroupid, day, dayar, dayen, timeform, timeto, useit, del | |
| **incometype** | Income categories for billing | incometypeid, incomeTypeName, defaultValue, parent, studentsubjectid |
| Table Name | Purpose | Key Columns | |
|---|---|---|---|
| **studentaddsubjects** | Student assignments | studentaddsubjectid, studentsubjectid, studentsubjectgroupid, del | |
| **studentaddsubjectdetails** | Assignment details | studentaddsubjectdetailid, studentsubjectid, studentsubjectgroupid, del | |
| **studentsexams** | Subject exams | studentsexamid, studentsubjectid, studentsubjectgroupid, del | |
| **studentsexamsval** | Exam values | studentsexamsvalid, studentsubjectid, studentsubjectgroupid, del | |
| **studentspaymentsystems** | Payment systems | studentspaymentsystemid, studentsubjectid, del | |
| **studentspays** | Student payments | studentspayid, studentsubjectid, studentsubjectgroupid, del | |
| **user** | System users | userid, employeename |
๐ Key Functions
1. Default Action - Add Subject Form
Location: Lines 7-11
Purpose: Display the subject creation form
Process Flow:
1. Display header template
2. Show subject add form
3. Set student flag for navigation
4. Display footer template
---
2. savedata() - Subject and Schedule Management
Location: Lines 55-163
Purpose: Create or update subjects with groups and schedules
Function Signature:
function savedata()
Process Flow:
1. Extract subject data from POST
2. Create/update subject record
3. Create/update income type for billing
4. Process each subject group iteration
5. Process each schedule day iteration
6. Handle Arabic/English day names
7. Set usage flags and audit information
Subject Processing:
if (!$subjectid) {
$subjects = R::dispense('studentsubjects');
// Set creation fields
} else {
$subjects = R::load('studentsubjects', $subjectid);
// Set update fields
}
Income Type Integration:
if (!$incometype) {
R::exec("INSERT INTO `incometype`(`incomeTypeName`, `defaultValue`, `parent`, `incomeTypeDate`, `userid`, `conditions`, `studentsubjectid`)
VALUES ('$subjectname', '$subjectprice', 0, '$date', $userid, 0, $subjectid)");
} else {
R::exec("UPDATE `incometype` SET `incomeTypeName`='$subjectname', `defaultValue`='$subjectprice'
WHERE incometypeid = $subjects->incometypeid");
}
Schedule Processing:
$dayar = ['','ุงูุณุจุช','ุงูุฃุญุฏ','ุงูุงุซููู','ุงูุซูุงุซุงุก','ุงูุงุฑุจุนุงุก','ุงูุฎู
ูุณ','ุงูุฌู
ุนุฉ'];
$dayen = ['','Saturday','Sunday','Monday','Tuesday','Wednesday','Thursday','Friday'];
---
3. showajax() - AJAX Data Table
Location: Lines 167-251
Purpose: Provide data for DataTables AJAX listing
Function Signature:
function showajax()
Process Flow:
1. Define column mappings for sorting
2. Build search query with filters
3. Apply date range filters
4. Process search terms
5. Execute query with pagination
6. Format results for DataTables
7. Return JSON response
Search Query Building:
if ($data1 != '') {
$searchQuery .= " and studentsubjects.id = " . $data1 . " ";
}
if ($del == '') {
$searchQuery .= " and studentsubjects.del < 2 ";
}
Action Buttons:
if ($row["del"] < 2) {
$sub_array[] = '<a href="studentSubjectsController.php?do=edit&id='. $row["id"] .'"
type="button" class="btn btn-default btn-lg editicon"></a>';
$sub_array[] = '<a href="javascript:;" data-id="'. $row["id"] .'"
data-controll="studentSubjectsController"
type="button" class="btn btn-default btn-lg deleteicon removecontroller"></a>';
}
---
4. removecontroller() - Cascade Deletion
Location: Lines 254-278
Purpose: Soft delete subject and all related records
Function Signature:
function removecontroller()
Process Flow:
1. Load subject record
2. Set deletion flags and audit info
3. Cascade delete all related records
4. Disable related income type
5. Return success status
Cascade Deletion Logic:
R::exec("UPDATE `studentsubjectgroups` SET `del`= 3, `deltoday`= '$today', `deluserid`= $userid
WHERE studentsubjectid = '" . $id . "' ");
R::exec("UPDATE `studentsubjectgroupdays` SET `del`= 3, `deltoday`= '$today', `deluserid`= $userid
WHERE studentsubjectid = '" . $id . "' ");
R::exec("UPDATE `studentaddsubjects` SET `del`= 3, `deltoday`= '$today', `deluserid`= $userid
WHERE studentsubjectid = '" . $id . "' ");
// ... more related tables
R::exec("UPDATE `incometype` SET `conditions`= 1 WHERE studentsubjectid = '" . $id . "' ");
---
5. removeappend() - Group/Schedule Deletion
Location: Lines 281-305
Purpose: Remove specific groups or schedule entries
Function Signature:
function removeappend()
Process Flow:
1. Get record ID and table type
2. Load and mark record as deleted
3. If group deletion, cascade to related records
4. Return success status
Conditional Cascading:
if ($table == 'studentsubjectgroups') {
R::exec("UPDATE `studentsubjectgroupdays` SET `del`= 3 WHERE studentsubjectgroupid = '" . $id . "' ");
R::exec("UPDATE `studentaddsubjects` SET `del`= 3 WHERE studentsubjectgroupid = '" . $id . "' ");
// ... more related tables
}
---
๐ Workflows
Workflow 1: Subject Creation with Groups and Schedules
---
Workflow 2: Subject Deletion Cascade
---
๐ URL Routes & Actions
| URL Parameter | Function Called | Description | |
|---|---|---|---|
| `do=` (empty) | Default action | Display subject creation form | |
| `do=addappend` | Row generator | Generate additional form rows | |
| `do=show` | Show view | Display subject listing interface | |
| `do=edit` | Edit form | Load subject data for editing | |
| `do=savedata` | `savedata()` | Process subject creation/update | |
| `do=showajax` | `showajax()` | AJAX data for DataTables | |
| `do=removecontroller` | `removecontroller()` | Delete subject | |
| `do=removeappend` | `removeappend()` | Delete group/schedule |
Subject Creation/Edit (do=savedata):
- โข
subjectname- Subject name - โข
subjectprice- Default price - โข
deviceid- Device identifier - โข
ipaddress- IP address - โข
studentsubjectgroupsitr- Number of groups - โข
incometype- Existing income type ID (for updates)
Group Configuration (dynamic):
- โข
subjectgroupname{N}- Group name - โข
subjectgroupprice{N}- Group price - โข
studentsubjectgroupdaysitr{N}- Number of schedule days
Schedule Configuration (dynamic):
- โข
day{N}{M}- Day number (1-7) - โข
timeform{N}{M}- Start time - โข
timeto{N}{M}- End time
AJAX Data Table:
- โข
start_date- Filter start date - โข
end_date- Filter end date - โข
del- Deletion status filter - โข
data1- Subject ID filter
---
๐งฎ Calculation Methods
Day Name Mapping
$dayar = ['','ุงูุณุจุช','ุงูุฃุญุฏ','ุงูุงุซููู','ุงูุซูุงุซุงุก','ุงูุงุฑุจุนุงุก','ุงูุฎู
ูุณ','ุงูุฌู
ุนุฉ'];
$dayen = ['','Saturday','Sunday','Monday','Tuesday','Wednesday','Thursday','Friday'];
$subjectgroupdays->dayar = $dayar[$day];
$subjectgroupdays->dayen = $dayen[$day];
Price Inheritance
// If no group price specified, use subject price
$subjectgroupprice = empty($subjectgroupprice) ? $subjectprice : $subjectgroupprice;
Usage Flag Management
// New records start as unused (useit = 0)
$subjects->useit = 0;
$subjectgroups->useit = 0;
$subjectgroupdays->useit = 0;
---
๐ Security & Permissions
Input Validation
// Skip groups without required data
if (!$subjectgroupname || $subjectgroupsdayitr < 1) {continue;}
// Skip schedule entries without required data
if (!$day || !$timeform || !$timeto) {continue;}
Authentication Check
include_once("../public/authentication.php");
Audit Trail
- โข All records include comprehensive audit fields:
- addtoday / updatetoday - Timestamp tracking
- adduserid / updateuserid - User tracking
- deltoday / deluserid - Deletion tracking
- del - Soft deletion status
---
๐ Performance Considerations
Database Optimization
1. Efficient Queries: Direct primary key loads where possible
2. Soft Deletion: Uses del flags instead of hard deletes
3. Cascade Updates: Single SQL statements for bulk updates
Potential Issues
- โข N+1 Queries: Group and schedule iterations create many individual inserts
- โข Large Forms: Complex subjects with many groups/schedules may impact performance
- โข Cascade Operations: Mass deletions affect multiple tables
Optimization Recommendations
-- Recommended indexes
CREATE INDEX idx_studentsubjects_del ON studentsubjects(del);
CREATE INDEX idx_studentsubjectgroups_subject_del ON studentsubjectgroups(studentsubjectid, del);
CREATE INDEX idx_studentsubjectgroupdays_group_del ON studentsubjectgroupdays(studentsubjectgroupid, del);
---
๐ Common Issues & Troubleshooting
1. Groups Not Saving
Issue: Subject groups don't appear after creation
Cause: Group name validation or day iteration count = 0
Debug:
if (!$subjectgroupname || $subjectgroupsdayitr < 1) {
echo "Group skipped - Name: " . $subjectgroupname . " Days: " . $subjectgroupsdayitr;
continue;
}
2. Schedule Times Invalid
Issue: Class schedule entries missing or incorrect
Cause: Time format validation fails
Fix:
// Ensure proper time format
if (!$day || !$timeform || !$timeto) {
echo "Schedule invalid - Day: " . $day . " From: " . $timeform . " To: " . $timeto;
continue;
}
3. Income Type Creation Fails
Issue: Billing integration broken
Cause: SQL injection or missing data
Debug:
-- Check income type creation
SELECT * FROM incometype WHERE studentsubjectid = [SUBJECT_ID];
4. Cascade Deletion Issues
Issue: Related records not properly deleted
Cause: Foreign key constraints or deletion level inconsistency
Fix:
// Verify deletion levels
// Level 2: Primary record deleted
// Level 3: Related records deleted
---
๐งช Testing Scenarios
Test Case 1: Complete Subject Creation
1. Create subject with basic info
2. Add multiple groups with different prices
3. Set various schedules for each group
4. Verify all records created correctly
5. Check income type integration
Test Case 2: Subject Edit and Update
1. Load existing subject for editing
2. Modify groups and schedules
3. Add new groups/remove existing
4. Save changes
5. Verify updates applied correctly
Test Case 3: Cascade Deletion
1. Create subject with full hierarchy
2. Delete subject
3. Verify all related records marked as deleted
4. Check income type disabled
5. Confirm no orphaned records
Test Case 4: AJAX Data Table
1. Create multiple subjects
2. Test search functionality
3. Test date range filtering
4. Test sorting and pagination
5. Verify action buttons work
---
๐ Related Documentation
- โข CLAUDE.md - PHP 8.2 migration guide
- โข studentSettings.md - System configuration
- โข studentsAddSubject.md - Student assignments
- โข studentsExamsController.md - Exam management
- โข Database Schema Documentation - Table relationships
---
Documented By: AI Assistant
Review Status: โ Complete
Next Review: When major changes occur