PHP

CodeSphere — LMS & Training Platform

A fully-featured Learning Management System (LMS) built with CodeIgniter 4 and deployed at training.teamodigitalsolutions.com for TeamO Digital Solutions. The platform supports a complete three-role ecosystem — admins manage the platform, instructors author and review course content, and trainees enroll, learn, and earn verifiable certificates.

Every course is structured into modules and lessons that support YouTube, Vimeo, uploaded, and embedded video formats. Trainees progress through lessons, take auto-graded quizzes (multiple-choice, true/false, short-answer), submit capstone projects for instructor review, and earn a downloadable PDF certificate generated by DomPDF — gated by 100% lesson completion and a configurable minimum quiz pass score. Payment is handled through Paystack, with both browser callback and server-side webhook handlers ensuring enrollment is activated reliably even when the browser callback fails.

The platform also ships a full scholarship workflow: trainees apply with a written reason, instructors review and approve or reject applications from a dedicated dashboard, and approved applicants are automatically enrolled and notified by email. All enrollment paths — paid, free, and scholarship — trigger automated Hostinger SMTP email notifications. An SEO layer generates dynamic XML sitemaps, JSON-LD structured data (Course schema, Organisation schema, Breadcrumb schema), Open Graph tags, and Twitter Card meta for every course page. A public JSON API exposes featured and paginated courses for embedding on the company main website.


CodeSphere — LMS & Training Platform screenshot

Key Features

50 features built into this project

Three-role access control: admin
instructor
and trainee with role-based dashboards and middleware enforcement
Course catalog with search
category filter
and level filter (beginner
intermediate
advanced)
Module and lesson hierarchy with configurable display order
Video lesson support: YouTube
Vimeo
self-hosted upload
and embed types — video IDs extracted automatically from URLs
Auto-graded quiz engine: multiple-choice
true/false
and short-answer questions with per-question marks and explanations
Project submission system: file upload or external URL with instructor review
grading
and written feedback
PDF certificate generation via DomPDF — gated by 100% lesson completion and configurable minimum quiz pass score
Unique verifiable certificate numbers (CERT-[hex]-[year]) with a public verification page requiring no login
Paystack payment integration with browser callback and server-side webhook for guaranteed enrollment activation
Free course enrollment with single-click enrol flow
Full scholarship workflow: trainee application with written reason
instructor review
approve/reject
auto-enrollment on approval
Automated SMTP email notifications for paid
free
and scholarship enrollments via Hostinger
Real-time lesson progress tracking (0–100%) with automatic course completion at 100% lessons done
Instructor dashboard: course analytics
enrolled student list
submission review and grading
scholarship management
Admin dashboard: platform-wide user
course
category
and content management
Testimonial system: public star-rating submission
admin approval
and featured showcase on homepage
Dynamic XML sitemap and robots.txt generation for SEO
JSON-LD structured data: Course schema
Organisation schema
and Breadcrumb schema on every page
Open Graph and Twitter Card meta tags per course
Public JSON API for featured and paginated course listings (CORS-enabled
used on the main company website)
Upgrade detection on checkout — existing free/scholarship enrollments are handled correctly when a user later pays

Challenges & Solutions

Technical problems encountered during development and how each was resolved.

1

Making payment enrollment bulletproof was the most critical challenge. Paystack provides a browser callback URL, but browsers can close before the callback fires — leaving a completed payment with no enrollment. I solved this by building a parallel Paystack webhook handler that activates the enrollment from Paystack's server regardless of what happens on the client, and by de-duplicating both handlers so a double-fire never creates two enrollments.

2

The quiz-to-certificate pipeline required careful eligibility logic. A certificate should only generate when the trainee has completed every lesson AND passed every quiz above the course's configured pass percentage. I built the eligibility check across LessonProgressModel and QuizAttemptModel before passing control to DomPDF, which renders an HTML certificate template to a downloadable PDF stored on the server with a unique certificate number that can be verified publicly without a login.

3

The scholarship workflow introduced a three-way enrollment type problem: paid, free, and scholarship all result in an enrollment row, but they must be tracked and displayed differently. I added an enrollment_type enum and scholarship-specific columns (scholarship_by, scholarship_note, scholarship_granted_at) to the enrollments table, and routed all three paths through a shared EmailService helper that selects the correct email template per type — keeping controller logic clean and email formatting consistent.

4

Building SEO into a CodeIgniter 4 project with no built-in SEO package required writing a custom seo_helper that generates JSON-LD Course schema, Organisation schema, and Breadcrumb schema as inline script blocks, alongside Open Graph and Twitter Card meta tags, from a single function call per view. The SitemapController dynamically queries published courses and categories and outputs a valid XML sitemap, keeping search engine coverage automatic as new courses are published.