Moodle plugins directory: Filtered course list | Moodle.org
Filtered course list
The Filtered Course List block displays a configurable list of courses. It is intended as a replacement for the My Courses block, although both may be used. It is maintained by the Collaborative Liberal Arts Moodle Project (CLAMP).
An administrator can apply various filters by which to organize a user's course listing in the block. Courses can be sorted by category, shortname matches or completion status. If all of the courses in a given semester have a shortname ending in a semester code, for instance, then the administrator can designate those courses to appear under "Current courses," "Future courses" or any other heading. Regex matching is supported.
Administrators can designate multiple collapsible headings and choose which of those headings, if any, should be expanded by default.
Other options include the ability to hide the block from guests or anonymous visitors, to choose whether an admin sees all courses or her own, and to hide or reveal a link to a more comprehensive course search.
To the general issue: Throughout its history, the primary intent of the Filtered course list block has been to organize and present the courses a user has access to. (Typically this means the courses a user is enrolled in, but I'll address a couple exceptions below.) Nearly all of the filters therefore start from the list of a user's enrolled courses and then return a subset of that already limited list. This principle is at the core of the block's behaviour, so it is no surprise that that is what you are seeing for most of the filter types. The line that you have suggested changing is indeed where that initial limitation applies. Changing it in the way you suggest fundamentally alters the behaviour of the block in exactly the way you describe, but that changed behaviour is at odds with the main intent of the block, so it is not something that I would include in a future version.
Admittedly, there are a couple exceptions to the general principle that a user sees only their own courses. 1) Anonymous users and admins (depending on certain settings) may see a "generic" list. A generic list shows either a list of all the courses or (if the number of courses is above a configurable threshold) all of the top-level categories on a site. The rationale behind showing a generic list is that anonymous users by definition do not have any enrolments while admins have access to all courses regardless of their enrolments. If you want everyone to see a generic list you can add this line to your filter `generic | expanded`. Please note, though, that unless you have disabled it, the Filtered course list block already automatically includes a link to Moodle's native "All courses" page where users can view and search all courses in the way that you seem to be looking for. Maybe that even solves your main issue?
To your specific issue: The other place where the Filtered course list block might show courses that a user is not enrolled in is with the `enrolment` filter. The rationale here is that a user may have access to (and so should see) certain courses they are not yet enrolled in. In particular, this is true for courses with `guest` or `self` enrolments, and that is why the documentation and examples emphasize those two types. That being said, what you are trying to do *should* also work, so I consider it a bug that you are seeing that error message, and I would love to get to the bottom of it. Unfortunately I cannot reproduce the error. I've tried using exactly the versions you specify. I've tried on sites with no courses, with only a few courses, and with thousands of courses. I've tried on fresh installations as well as old ones, viewing them as an admin and as a regular user. I would really appreciate any additional information you can offer me on how to reproduce the error. If you have debugging set to full are you getting any kind of stack trace? Approximately how many courses/users/enrolments are on your site? Have you changed any other Filtered course list settings? Does the manual enrolment filter work correctly when you change line 133? Does the problem come back with your restore that line? Sorry to come back with questions rather than answers, and thanks in advance for any help you can offer.
Great plugin! I was just wondering if the plugin is compatible with a Multi language Moodle? My categories and courses are translated into many language and when I expand a category I see course name like this:
{mlang en}Day 1 - Course Content{mlang}{mlang ms}Hari 1 - Isi Kandungan Kursus{mlang}
Tell me how I can help further
Thx
I'll be happy to look into this. Can you let me know which plugins you are using? It seems there is more than one that works with the {mlang} tags. It may not matter, but I may as well try to work with the same one you are using.
Cheers,
Kevin
In reading that line of code, i realized exactly what you wrote, that the filter will always get the courses that the user is enrolled in. That being said, due to some specifics of the site i work in, i have to show the combo list in the dashboard, instead of the Site Home, where said setting does exist. So i changed it to fetch all the courses in the site, then used your simplest example filter (category | collapsed | 0 (= top level) | 0 (= all decendants)) and it worked perfectly. My "suggestion" (i have no idea if it's even a suggestion) would be: is it possible to create a setting, a general setting, in which the user fetches all the courses, or just the enrolled ones? Something in the lines of :
if ($setting == 1){
$this->mycourses = enrol_get_my_courses(null, "$sortstring");
}
else{
$this->mycourses = coursecat::get(0)->get_courses(array('recursive' => true));
}
However, i don't know if it would impact a lot your plugin.
Anyway....thanks a lot!
I have the organization for my courses
SCHOOL / YEAR / UNIT / courses
I can only display with the plugin the level UNIT
I'd like to display the SCHOOL and the YEAR ! Is it possible ?
1. If your course short names are systematic, you could probably create shortname or regex filters based on those. You would have to supply the SCHOOL / YEAR as the label. Depending on how many of those you need this might be impractical.
2. If you are using a category filter, you could try setting the "Category rubric template" to include "ANCESTRY". That could work very well, perhaps in combination with including "CATEGORY" in the "Course name template."
The second choice will perhaps be exactly what you want if you don't have any courses above the UNIT level.
SCHOOL 1
- YEAR 1
- UNIT 1
Course 1
Course 2
- UNIT 2
Course 3
Course 4
- YEAR 2
...
SCHOOL 2
...
Give that a try and let me know if you have any other questions.
Cheers,
Kevin
I have two things to say, one comment and one question:
Comment: Regarding our discussion a few months back, I tried your solution, but it wouldn't work, as the plugin would sort the data after it has already been fetched, and it only fetches the courses the user is already logged in. That being said, if it's just me who would benefit from a solution of those sorts, then i'll keep doing it on my end.
Question:
For a different site, i'm trying to use your solution but i'm running short in understanding your documentation. My categories are as follows
Category 1
- Sub category 1
-- course 1
Category 2
- Sub category 2
- Course 2
However, i tried building it using your documentation (and i need to replicate the structure), using
category | collapsed | 0 | 0
which should fetch all the subcategories from the top category, but only creates
-sub category 1
-- course 1
- Sub category 2
-- course 2
and i tried using ancestries or
category | collapsed | 2 | 0
What am i doing wrong?
thanks!!
About your comment:
I'm afraid I'm not sure which suggestion of mine you're referring to. Did you try creating a filter of your own? If that is what you're doing then you should be able to fetch the courses any way you like. Or are you doing something else? I'll be happy to help, but I don't yet understand what you are describing.
About your question:
The results that you are describing are expected if your structure is like this:
Category 1
- Sub category 1
-- course 1
Category 2
- Sub category 2
-- Course 2
What I've listed above is slightly different from your version, but maybe it's what you meant, because that would explain the output. It often trips people up that the filtered course list does not recreate a category hierarchy. It's just not what it does. It can scan down into categories to find a user's courses, but it doesn't try to represent the whole tree. When it finds a course, it will show that course under a rubric based on the category it is in, even if that category is several levels deep. In your case, if the user is not enrolled in any courses directly in Category 1 or Category 2, then those categories will not show up. If the hierarchy is important then it may help to modify your "Category rubric template." If you change that template to "ANCESTRY / NAME", for instance, you are asking the block to display the rubric title as a string that consists of the category's ancestry and then the category name. Applied to the example above you ought to get:
Category 1 / Sub category 1
- course 1
Category 2 / Sub category 2
- Course 2
It's still not a tree; it won't ever be, but at least in the label for the rubric you can see the hierarchy. The main idea behind the configurable templates is to help resolve ambiguities. Imagine you had a structure like the following:
2019
- History
-- History 101
2020
- History
-- History 101
In a case like this the default templates would yield:
History
- History 101
History
- History 101
That's not so helpful, but you can change the category template to something like "NAME (PARENT)" to yield:
History (2019)
- History 101
History (2020)
- History 101
Does that help?
If the behavior you're seeing is different, please give me as many details as you can, and I will do my best to help sort it out.
Ok now I understand, but this issue seems to be something that i've seen several user asked (the ancestry question). Can we make this into a request for a future version? (version 4.1.3 for example? - I joke)
As usual, thanks for your support.