What's new
[XB] Lessons

[XB] Lessons [Paid] 2.0.7 Patch Level 1

No permission to buy ($75.00)

Painbaker

Administrator
Painbaker submitted a new resource:

[XB] Lessons - Organize and Participate in Online Learning

View attachment 750

Provides a structured platform for managing online courses, with robust features for administrators, teachers, and students.

Admin features:​

  • 🌳 Category Tree: Create hierarchical course categories for better organization.
  • 🔐 Category-Specific Permissions: Control user access and roles at the category level.
  • 💬 Lesson Discussions: Assign discussion forums to each category for interaction.
  • ✅...

Read more about this resource...
 
Painbaker updated [XB] Lessons with a new update entry:

2.0.3

We now have a live demo! https://demo.xenbaker.com/lessons/

🚀 New Features:​

  • Added separate permissions for viewing unapproved/deleted, undeleting and approving/unapproving classrooms
  • Added new lesson inline moderation tool: move lessons to another classroom
  • Added ability to delete classroom enrolls and lesson completions from public interface
  • Added filter by username on classroom and lesson completions list in public interface
  • Added new...

Read the rest of this update entry...
 
Hi @Painbaker ,

it was really good to see a demo of this. if I can adjust my budget, I would like to have both lesson and quiz add-ons.
I have a question: how does quiz work in the lesson add-on, can we see it on the demo site?

thank you
 
Is there any way this can be used without requiring a YouTube video (or a video is general).

I'd like to set it up using media from the media gallery but also have some lessons where videos/media is not required at all.
 
Painbaker updated [XB] Lessons with a new update entry:

2.0.4

✏️ Changes:​

  • Now requires XF 2.3

🚀 New Features:​

  • Added tabs to options group for better organization
  • Added option to change lessons block display limit below classroom overview
  • Added option to change order of lessons in block below classroom overview (including random sorting)
  • Added Open Graph metadata for classrooms and lessons
  • Added structured data for search engines
  • Added trending classrooms widget...

Read the rest of this update entry...
 
Is there any way this can be used without requiring a YouTube video (or a video is general).

I'd like to set it up using media from the media gallery but also have some lessons where videos/media is not required at all.
Sorry for the wait
Added the ability to attach video attachments and create lessons without embedded video in last update
 
Painbaker updated [XB] Lessons with a new update entry:

2.0.5

  • Bring back XF 2.2.16 compatibility
  • Added featured content support
  • Added embed resolver support
  • Added missing featuring action phrases for moderator log
  • Cache ozzmodz_lessons_x_classroom and ozzmodz_lessons_latest_classrooms phrases to avoid extra DB query

Important Note: The recommended version is still XF 2.3 and will be the main focus of add-on development.

Read the rest of this update entry...
 
Painbaker updated [XB] Lessons with a new update entry:

2.0.6 Beta 1

This version brings some helpful new features and important fixes to improve user experience.

Now you can keep track of how often your classrooms and lessons are viewed, and even set up private or paid classrooms with access control and built-in payment support.

See the full details below 👇

🚀 What’s New​

  • View counters for classrooms and lessons
  • Private and paid classroom types
    • Supports payments via XF payment providers
    • Classroom owners can...

Read the rest of this update entry...
 
Hi @Painbaker I'm getting compatibility error when installing on xenforo 2.2
Line 45: Tag macro must have an attribute name. - Template name: public:ozzmodz_lessons_rating_macros

Also getting this error too when creating categories for lessons. I'm using [XB] Quizzes 2.0.6 Patch Level 2

Code:
XF\Db\Exception: MySQL statement prepare error [1054]: Unknown column 'ozzmodz_quiz_category_id' in 'field list' in src/XF/Db/AbstractStatement.php at line 230
[LIST=1]
[*]XF\Db\AbstractStatement->getException() in src/XF/Db/Mysqli/Statement.php at line 198
[*]XF\Db\Mysqli\Statement->getException() in src/XF/Db/Mysqli/Statement.php at line 41
[*]XF\Db\Mysqli\Statement->prepare() in src/XF/Db/Mysqli/Statement.php at line 56
[*]XF\Db\Mysqli\Statement->execute() in src/XF/Db/AbstractAdapter.php at line 96
[*]XF\Db\AbstractAdapter->query() in src/XF/Db/AbstractAdapter.php at line 324
[*]XF\Db\AbstractAdapter->update() in src/XF/Mvc/Entity/Entity.php at line 1531
[*]XF\Mvc\Entity\Entity->_saveToSource() in src/XF/Mvc/Entity/Entity.php at line 1258
[*]XF\Mvc\Entity\Entity->save() in src/XF/Mvc/FormAction.php at line 71
[*]XF\Mvc\FormAction->XF\Mvc\{closure}() in src/XF/Mvc/FormAction.php at line 189
[*]XF\Mvc\FormAction->run() in src/addons/OzzModz/Lessons/Admin/Controller/Category.php at line 157
[*]OzzModz\Lessons\Admin\Controller\Category->actionSave() in src/XF/Mvc/Dispatcher.php at line 352
[*]XF\Mvc\Dispatcher->dispatchClass() in src/XF/Mvc/Dispatcher.php at line 259
[*]XF\Mvc\Dispatcher->dispatchFromMatch() in src/XF/Mvc/Dispatcher.php at line 115
[*]XF\Mvc\Dispatcher->dispatchLoop() in src/XF/Mvc/Dispatcher.php at line 57
[*]XF\Mvc\Dispatcher->run() in src/XF/App.php at line 2513
[*]XF\App->run() in src/XF.php at line 524
[*]XF::runApp() in admin.php at line 13
[*][/co
[/LIST]
 
Last edited:
Painbaker updated [XB] Lessons with a new update entry:

2.0.7

  • Added classroom/lesson thumbnail optimization rebuild tool
  • Added separate action to edit classroom thumbnail
  • Added IP logging on classroom/lesson creation
  • Added IP logging for classroom/lesson thumbnail actions
  • Added storing of additional classroom/lesson thumbnail versions (small, medium, large)
  • Moved thumbnails from ozzmodz/lessons/classroom/thumbnails to the lessons_classroom_thumbnails folder
  • Fixed template macro ID call causing installation error on XF 2.2...

Read the rest of this update entry...
 
I'm getting this error with latest update!

Code:
[LIST]
[*]Error: Macro public:ozzmodz_lessons_classroom_edit_macros :: classroom_type() error: Class 'XF\Util\Str' not found
[*]src/addons/OzzModz/Lessons/Entity/Category.php:116
[*]Generated by: Admin
[*]Oct 3, 2025 at 9:29 AM
[/LIST]
[HEADING=2]Stack trace[/HEADING]
#0 [internal function]: OzzModz\Lessons\Entity\Category->OzzModz\Lessons\Entity\{closure}('usd')
#1 src/addons/OzzModz/Lessons/Entity/Category.php(115): array_map(Object(Closure), Array)
#2 src/addons/OzzModz/Lessons/Entity/Classroom.php(521): OzzModz\Lessons\Entity\Category->getAvailableCurrencies()
#3 src/XF/Template/Templater.php(1195): OzzModz\Lessons\Entity\Classroom->getAvailableCurrencies()
#4 internal_data/code_cache/templates/l1/s4/public/ozzmodz_lessons_classroom_edit_macros.php(56): XF\Template\Templater->method(Object(OzzModz\Lessons\Entity\Classroom), 'getAvailableCur...', Array)
#5 src/XF/Template/Templater.php(828): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#6 internal_data/code_cache/templates/l1/s4/public/ozzmodz_lessons_category_add_classroom.php(68): XF\Template\Templater->callMacro('ozzmodz_lessons...', 'classroom_type', Array, Array)
#7 src/XF/Template/Templater.php(1655): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#8 src/XF/Template/Template.php(24): XF\Template\Templater->renderTemplate('ozzmodz_lessons...', Array)
#9 src/XF/Mvc/Renderer/Html.php(50): XF\Template\Template->render()
#10 src/XF/Mvc/Dispatcher.php(460): XF\Mvc\Renderer\Html->renderView('OzzModz\\Lessons...', 'public:ozzmodz_...', Array)
#11 src/XF/Mvc/Dispatcher.php(442): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#12 src/XF/Mvc/Dispatcher.php(402): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#13 src/XF/Mvc/Dispatcher.php(60): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'html')
#14 src/XF/App.php(2513): XF\Mvc\Dispatcher->run()
#15 src/XF.php(524): XF\App->run()
#16 index.php(20): XF::runApp('XF\\Pub\\App')
#17 {main}
 
I'm getting this error with latest update!

Code:
[LIST]
[*]Error: Macro public:ozzmodz_lessons_classroom_edit_macros :: classroom_type() error: Class 'XF\Util\Str' not found
[*]src/addons/OzzModz/Lessons/Entity/Category.php:116
[*]Generated by: Admin
[*]Oct 3, 2025 at 9:29 AM
[/LIST]
[HEADING=2]Stack trace[/HEADING]
#0 [internal function]: OzzModz\Lessons\Entity\Category->OzzModz\Lessons\Entity\{closure}('usd')
#1 src/addons/OzzModz/Lessons/Entity/Category.php(115): array_map(Object(Closure), Array)
#2 src/addons/OzzModz/Lessons/Entity/Classroom.php(521): OzzModz\Lessons\Entity\Category->getAvailableCurrencies()
#3 src/XF/Template/Templater.php(1195): OzzModz\Lessons\Entity\Classroom->getAvailableCurrencies()
#4 internal_data/code_cache/templates/l1/s4/public/ozzmodz_lessons_classroom_edit_macros.php(56): XF\Template\Templater->method(Object(OzzModz\Lessons\Entity\Classroom), 'getAvailableCur...', Array)
#5 src/XF/Template/Templater.php(828): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#6 internal_data/code_cache/templates/l1/s4/public/ozzmodz_lessons_category_add_classroom.php(68): XF\Template\Templater->callMacro('ozzmodz_lessons...', 'classroom_type', Array, Array)
#7 src/XF/Template/Templater.php(1655): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#8 src/XF/Template/Template.php(24): XF\Template\Templater->renderTemplate('ozzmodz_lessons...', Array)
#9 src/XF/Mvc/Renderer/Html.php(50): XF\Template\Template->render()
#10 src/XF/Mvc/Dispatcher.php(460): XF\Mvc\Renderer\Html->renderView('OzzModz\\Lessons...', 'public:ozzmodz_...', Array)
#11 src/XF/Mvc/Dispatcher.php(442): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#12 src/XF/Mvc/Dispatcher.php(402): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#13 src/XF/Mvc/Dispatcher.php(60): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'html')
#14 src/XF/App.php(2513): XF\Mvc\Dispatcher->run()
#15 src/XF.php(524): XF\App->run()
#16 index.php(20): XF::runApp('XF\\Pub\\App')
#17 {main}
I have uploaded a new build that fixes this error.
Please note that the officially supported version is XF 2.3. XF 2.2 has minimal support priority.
 
When clicking my results on completed quiz, I noticed it goes to my results page but this page is using quiz wrapper rather than lesson wrapper confusing the UI. Basically we start here, https://demo.xenbaker.com/lessons/lesson-with-quiz-support.5/quiz/
Then when quiz is completed, and view results, user gets lost in the quiz wrapper


Also, when using articles instead of videos, the table of contents do not bold font currently viewed page.
Screenshot_20251003_205151_Chrome.webp
Also some errors for me.

Code:
[LIST]
[*]ErrorException: [E_NOTICE] Trying to get property 'oembed_url_scheme' of non-object
[*]src/XF/Repository/Oembed.php:56
[*]Generated by:  Admin
[*]Oct 3, 2025 at 8:42 PM
[/LIST]
[HEADING=2]Stack trace[/HEADING]
#0 src/XF/Repository/Oembed.php(56): XF::handlePhpError(8, '[E_NOTICE] Tryi...', '/home/teacherpl...', 56, Array)
#1 src/XF/Service/Oembed.php(127): XF\Repository\Oembed->getOembedUrl('youtubeimproved', 'Q8kEFV_XmP0')
#2 src/XF/Service/Oembed.php(89): XF\Service\Oembed->fetchJsonData('youtubeimproved', 'Q8kEFV_XmP0')
#3 src/XF/Service/Oembed.php(44): XF\Service\Oembed->fetchNewOembed('youtubeimproved', 'Q8kEFV_XmP0')
#4 src/addons/OzzModz/Lessons/Service/AbstractThumbnailImageService.php(70): XF\Service\Oembed->getOembed('youtubeimproved', 'Q8kEFV_XmP0')
#5 src/addons/OzzModz/Lessons/ControllerPlugin/LessonThumbnail.php(44): OzzModz\Lessons\Service\AbstractThumbnailImageService->setImageFromMediaSite()
#6 src/addons/OzzModz/Lessons/Pub/Controller/Lesson.php(365): OzzModz\Lessons\ControllerPlugin\LessonThumbnail->actionUpload(Object(OzzModz\Quiz\OzzModz\Lessons\Entity\Lesson))
#7 src/XF/Mvc/Dispatcher.php(352): OzzModz\Lessons\Pub\Controller\Lesson->actionEdit(Object(XF\Mvc\ParameterBag))
#8 src/XF/Mvc/Dispatcher.php(259): XF\Mvc\Dispatcher->dispatchClass('OzzModz\\Lessons...', 'Edit', Object(XF\Mvc\RouteMatch), Object(OzzModz\Quiz\OzzModz\Lessons\Pub\Controller\Lesson), NULL)
#9 src/XF/Mvc/Dispatcher.php(115): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(OzzModz\Quiz\OzzModz\Lessons\Pub\Controller\Lesson), NULL)
#10 src/XF/Mvc/Dispatcher.php(57): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#11 src/XF/App.php(2513): XF\Mvc\Dispatcher->run()
#12 src/XF.php(524): XF\App->run()
#13 index.php(20): XF::runApp('XF\\Pub\\App')
#14 {main}

Code:
LogicException: Could not find repository 'XF\Repository\ActivityLog' for 'XF:ActivityLog' src/XF/Mvc/Entity/Manager.php:260
Generated by: Unknown account Oct 3, 2025 at 8:00 PM
Stack trace
#0 src/XF/Mvc/Entity/Repository.php(45): XF\Mvc\Entity\Manager->getRepository('XF:ActivityLog')
#1 src/addons/OzzModz/Quiz/Repository/QuizItem.php(222): XF\Mvc\Entity\Repository->repository('XF:ActivityLog')
#2 src/addons/OzzModz/Quiz/Cron/Views.php(15): OzzModz\Quiz\Repository\QuizItem->batchUpdateQuizViews()
#3 src/XF/Job/Cron.php(37): OzzModz\Quiz\Cron\Views::runViewUpdate(Object(XF\Entity\CronEntry))
#4 src/XF/Job/Manager.php(260): XF\Job\Cron->run(8)
#5 src/XF/Job/Manager.php(202): XF\Job\Manager->runJobInternal(Array, 8)
#6 src/XF/Job/Manager.php(86): XF\Job\Manager->runJobEntry(Array, 8)
#7 job.php(43): XF\Job\Manager->runQueue(false, 8)
#8 {main}

Code:
[LIST]
[*]ErrorException: [E_NOTICE] Trying to access array offset on value of type null
[*]src/addons/OzzModz/Lessons/Service/AbstractThumbnailImageService.php:62
[*]Generated by:  Admin
[*]Oct 3, 2025 at 6:11 PM
[/LIST]
[HEADING=2]Stack trace[/HEADING]
#0 src/addons/OzzModz/Lessons/Service/AbstractThumbnailImageService.php(62): XF::handlePhpError(8, '[E_NOTICE] Tryi...', '/home/teacherpl...', 62, Array)
#1 src/addons/OzzModz/Lessons/ControllerPlugin/LessonThumbnail.php(44): OzzModz\Lessons\Service\AbstractThumbnailImageService->setImageFromMediaSite()
#2 src/addons/OzzModz/Lessons/Pub/Controller/Classroom.php(822): OzzModz\Lessons\ControllerPlugin\LessonThumbnail->actionUpload(Object(OzzModz\Quiz\OzzModz\Lessons\Entity\Lesson))
#3 src/XF/Mvc/Dispatcher.php(352): OzzModz\Lessons\Pub\Controller\Classroom->actionAddLesson(Object(XF\Mvc\ParameterBag))
#4 src/XF/Mvc/Dispatcher.php(259): XF\Mvc\Dispatcher->dispatchClass('OzzModz\\Lessons...', 'AddLesson', Object(XF\Mvc\RouteMatch), Object(OzzModz\Lessons\Pub\Controller\Classroom), NULL)
#5 src/XF/Mvc/Dispatcher.php(115): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(OzzModz\Lessons\Pub\Controller\Classroom), NULL)
#6 src/XF/Mvc/Dispatcher.php(57): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#7 src/XF/App.php(2513): XF\Mvc\Dispatcher->run()
#8 src/XF.php(524): XF\App->run()
#9 index.php(20): XF::runApp('XF\\Pub\\App')
#10 {main}

ErrorException: [E_NOTICE] Trying to get property 'oembed_api_endpoint' of non-object src/XF/Repository/Oembed.php:54

ErrorException: [E_NOTICE] Trying to get property 'media_site_id' of non-object src/addons/OzzModz/Lessons/Service/AbstractThumbnailImageService.php:70
 
Last edited:

Oops! We ran into some problems.​


This add-on cannot be installed/upgraded because the following files are missing: js/ozzmodz/lessons/classroom.js, js/ozzmodz/lessons/classroom.min.js, js/ozzmodz/lessons/progressbar.min.js.

I had to deactivate all the add-ons on my site. Then, when I tried to reactivate them, I got an error message. Even though I downloaded and installed them again, I can't activate the add-on :(
 
Back
Top