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.
50 features built into this project
Technical problems encountered during development and how each was resolved.
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.
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.
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.
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.
Other work in the PHP category
An institutional-grade academic integrity platform that detects plagiarism and AI-generated content in student…
A production-ready classified advertising platform built with Laravel 11, supporting a full three-sided market…
TeamO Ranch is a sustainable farm e-commerce and service-booking website for an agricultural business based in…