Setting an activity availability condition in code

Setting an activity availability condition in code

by Tim Hunt -
Number of replies: 3
Core developers को तस्बिर Documentation writers को तस्बिर Particularly helpful Moodlers को तस्बिर Peer reviewers को तस्बिर Plugin developers को तस्बिर

I just had to learn this by asking sam. Since not everyone is lucky enough to share an office with sam, I thought I would put it here:

If you want to programmatically set up an availability condition (e.g. set an activity to only be available to users of a particular group, the best code to do that is:

$restriction = \core_availability\tree::get_root_json(
[\availability_group\condition::get_json($group->id)]);
$DB->set_field('course_modules', 'availability',
json_encode($restriction), ['id' => $cmid]);
rebuild_course_cache($course->id, true);
I also added this to https://docs.moodle.org/dev/Availability_API. I hope that helps somebody.
Average of ratings: Useful (4)
In reply to Tim Hunt

Re: Setting an activity availability condition in code

by Mihir J -

Hi Tim

This is great!

I have one query - the above code part is actually removes all existing condition and add only the group one.

Rather than replacing, how can I add a new restriction along with existing one.

Say, i already have a date condition for a cm, now programming i want to add an AND condition of group along with that.

How do i do this?

Thanks again!

Mihir

In reply to Mihir J

Re: Setting an activity availability condition in code

by Tim Hunt -
Core developers को तस्बिर Documentation writers को तस्बिर Particularly helpful Moodlers को तस्बिर Peer reviewers को तस्बिर Plugin developers को तस्बिर
I don't know. Have a look at the other methods on the \core_availability\tree class. I guess you need to start with the current value of the setting, and parse it into a tree structure, then modify the structure to add the new rules, then save it again.
In reply to Tim Hunt

Re: Setting an activity availability condition in code

by Mihir J -
Hi Tim,

Thank you, yes, we can do that using tree class and parsing. Then by json encode, save it back only that particular new children

Thanks again!
Mihir