/**
* Get all FN Site Groups. If a course is specified, and the course is using the FN Site
* Groups enrolment plug-in, then return the groups currently in use in the course.
*
* @param int $courseid The id of the requested course
* @param int $userid The id of the requested user or all.
* @param int $groupingid The id of the requested grouping or all.
* @param string $fields The fields to return or all.
* @return array
*/
function fn_sg_get_all_groups($courseid = SITEID, $userid = 0, $groupingid = 0, $fields = 'g.*')
{
global $CFG;
if (!($course = get_record('course', 'id', $courseid, null, null, null, null, 'id,enrol'))) {
return false;
}
if ($courseid != SITEID && fn_sg_course_uses_sgenrol($course)) {
/// Get site groups used in course.
$agroups = false;
} else {
$agroups = groups_get_all_groups(SITEID, $userid, $groupingid, $fields);
}
if (!is_array($agroups)) {
$agroups = array();
}
if (!($groupings = groups_get_all_groupings(SITEID))) {
$groupings = array();
}
$groups = array();
foreach ($groupings as $groupingid => $grouping) {
$groups['g_' . $groupingid] = $grouping;
if ($ggroups = groups_get_all_groups(SITEID, $userid, $groupingid, $fields)) {
foreach ($ggroups as $ggroupid => $ggroup) {
$ggroup->name = ' - ' . $ggroup->name;
$groups[$ggroupid] = $ggroup;
unset($agroups[$ggroupid]);
}
}
}
$nogrouping = new Object();
$nogrouping->id = 0;
$nogrouping->name = 'NOT IN GROUPING';
foreach ($agroups as $agroup) {
$agroup->name = ' - ' . $agroup->name;
}
if (!empty($agroups)) {
$groups = $groups + array('g_0' => $nogrouping) + $agroups;
}
return $groups;
}
/**
* Send the details of the newly created activity back to the client browser
*
* @param cm_info $mod details of the mod just created
*/
protected function send_response($mod)
{
global $OUTPUT;
$resp = new stdClass();
$resp->error = self::ERROR_OK;
$resp->icon = $mod->get_icon_url()->out();
$resp->name = $mod->name;
$resp->link = $mod->get_url()->out();
$resp->elementid = 'module-' . $mod->id;
$resp->commands = make_editing_buttons($mod, true, true, 0, $mod->sectionnum);
$resp->onclick = $mod->get_on_click();
// if using groupings, then display grouping name
if (!empty($mod->groupingid) && has_capability('moodle/course:managegroups', $this->context)) {
$groupings = groups_get_all_groupings($this->course->id);
$resp->groupingname = format_string($groupings[$mod->groupingid]->name);
}
echo $OUTPUT->header();
echo json_encode($resp);
die;
}
/**
* Renders html to display a name with the link to the course module on a course page
*
* If module is unavailable for user but still needs to be displayed
* in the list, just the name is returned without a link
*
* Note, that for course modules that never have separate pages (i.e. labels)
* this function return an empty string
*
* @param cm_info $mod
* @param array $displayoptions
* @return string
*/
public function course_section_cm_name(cm_info $mod, $displayoptions = array())
{
global $CFG;
$output = '';
if (!$mod->uservisible && (empty($mod->showavailability) || empty($mod->availableinfo))) {
// nothing to be displayed to the user
return $output;
}
$url = $mod->get_url();
if (!$url) {
return $output;
}
//Accessibility: for files get description via icon, this is very ugly hack!
$instancename = $mod->get_formatted_name();
$altname = $mod->modfullname;
// Avoid unnecessary duplication: if e.g. a forum name already
// includes the word forum (or Forum, etc) then it is unhelpful
// to include that in the accessible description that is added.
if (false !== strpos(core_text::strtolower($instancename), core_text::strtolower($altname))) {
$altname = '';
}
// File type after name, for alphabetic lists (screen reader).
if ($altname) {
$altname = get_accesshide(' ' . $altname);
}
// For items which are hidden but available to current user
// ($mod->uservisible), we show those as dimmed only if the user has
// viewhiddenactivities, so that teachers see 'items which might not
// be available to some students' dimmed but students do not see 'item
// which is actually available to current student' dimmed.
$linkclasses = '';
$accesstext = '';
$textclasses = '';
if ($mod->uservisible) {
$conditionalhidden = $this->is_cm_conditionally_hidden($mod);
$accessiblebutdim = (!$mod->visible || $conditionalhidden) && has_capability('moodle/course:viewhiddenactivities', context_course::instance($mod->course));
if ($accessiblebutdim) {
$linkclasses .= ' dimmed';
$textclasses .= ' dimmed_text';
if ($conditionalhidden) {
$linkclasses .= ' conditionalhidden';
$textclasses .= ' conditionalhidden';
}
// Show accessibility note only if user can access the module himself.
$accesstext = get_accesshide(get_string('hiddenfromstudents') . ':' . $mod->modfullname);
}
} else {
$linkclasses .= ' dimmed';
$textclasses .= ' dimmed_text';
}
// Get on-click attribute value if specified and decode the onclick - it
// has already been encoded for display (puke).
$onclick = htmlspecialchars_decode($mod->get_on_click(), ENT_QUOTES);
$groupinglabel = '';
if (!empty($mod->groupingid) && has_capability('moodle/course:managegroups', context_course::instance($mod->course))) {
$groupings = groups_get_all_groupings($mod->course);
$groupinglabel = html_writer::tag('span', '(' . format_string($groupings[$mod->groupingid]->name) . ')', array('class' => 'groupinglabel ' . $textclasses));
}
// Display link itself.
$activitylink = html_writer::empty_tag('img', array('src' => $mod->get_icon_url(), 'class' => 'iconlarge activityicon', 'alt' => ' ', 'role' => 'presentation')) . $accesstext . html_writer::tag('span', $instancename . $altname, array('class' => 'instancename'));
if ($mod->uservisible) {
$output .= html_writer::link($url, $activitylink, array('class' => $linkclasses, 'onclick' => $onclick)) . $groupinglabel;
} else {
// We may be displaying this just in order to show information
// about visibility, without the actual link ($mod->uservisible)
$output .= html_writer::tag('div', $activitylink, array('class' => $textclasses)) . $groupinglabel;
}
return $output;
}
/**
* Renders HTML to display one course module in a course section
*
* This includes link, content, availability, completion info and additional information
* that module type wants to display (i.e. number of unread forum posts)
*
* This function calls:
* {@link core_course_renderer::course_section_cm_name()}
* {@link cm_info::get_after_link()}
* {@link core_course_renderer::course_section_cm_text()}
* {@link core_course_renderer::course_section_cm_availability()}
* {@link core_course_renderer::course_section_cm_completion()}
* {@link course_get_cm_edit_actions()}
* {@link core_course_renderer::course_section_cm_edit_actions()}
*
* @param \stdClass $course
* @param \completion_info $completioninfo
* @param \cm_info $mod
* @param int|null $sectionreturn
* @param array $displayoptions
* @return string
*/
public function course_section_cm($course, &$completioninfo, cm_info $mod, $sectionreturn, $displayoptions = array())
{
global $COURSE;
$output = '';
// We return empty string (because course module will not be displayed at all)
// if:
// 1) The activity is not visible to users
// and
// 2) The 'availableinfo' is empty, i.e. the activity was
// hidden in a way that leaves no info, such as using the
// eye icon.
if (!$mod->uservisible && empty($mod->availableinfo)) {
return $output;
}
$output .= '<div class="asset-wrapper">';
// TODO - add if can edit.
// Drop section notice.
$output .= '<a class="snap-move-note" href="#">' . get_string('movehere', 'theme_snap') . '</a>';
// Start the div for the activity content.
$output .= "<div class='activityinstance'>";
// Display the link to the module (or do nothing if module has no url).
$cmname = $this->course_section_cm_name($mod, $displayoptions);
$assetlink = '';
// SHAME - For moodles ajax show/hide call to work it needs activityinstance > a to add a class of dimmed to.
// This dimmed class is of course inaccessible junk.
if (!empty($cmname)) {
$assetlink = '<a></a><h4 class="snap-asset-link">' . $cmname . '</h4>';
}
// Asset content.
$contentpart = $this->course_section_cm_text($mod, $displayoptions);
// Activity/resource type.
$snapmodtype = $this->get_mod_type($mod)[0];
$assetmeta = "<span class='snap-assettype'>" . $snapmodtype . "</span>";
// Groups, Restriction and all that jazz metadata.
// Completion tracking.
$completiontracking = $this->course_section_cm_completion($course, $completioninfo, $mod, $displayoptions);
// Due date, feedback available and all the nice snap things.
$snapcompletiondata = $this->module_meta_html($mod);
$assetcompletionmeta = "<div class='snap-completion-meta'>" . $completiontracking . $snapcompletiondata . "</div>";
// Draft status - always output, shown via css of parent.
$assetrestrictions = "<div class='draft-tag text text-warning'>" . get_string('draft', 'theme_snap') . "</div>";
$canmanagegroups = has_capability('moodle/course:managegroups', context_course::instance($mod->course));
if ($canmanagegroups && $mod->effectivegroupmode != NOGROUPS) {
if ($mod->effectivegroupmode == VISIBLEGROUPS) {
$groupinfo = get_string('groupsvisible');
} else {
if ($mod->effectivegroupmode == SEPARATEGROUPS) {
$groupinfo = get_string('groupsseparate');
}
}
$assetrestrictions .= "<div class='text'>{$groupinfo}</div>";
}
// TODO - ask what this is...
if (!empty($mod->groupingid) && $canmanagegroups) {
// Grouping label.
$groupings = groups_get_all_groupings($mod->course);
$assetrestrictions .= "<div class='text text-danger'>" . format_string($groupings[$mod->groupingid]->name) . "</div>";
// TBD - add a title to show this is the Grouping...
}
$canviewhidden = has_capability('moodle/course:viewhiddenactivities', $mod->context);
// If the module isn't available, or we are a teacher (can view hidden activities) then get availability
// info.
$availabilityinfo = '';
if (!$mod->available || $canviewhidden) {
$availabilityinfo = $this->course_section_cm_availability($mod, $displayoptions);
}
if ($availabilityinfo !== '') {
$conditionalinfo = get_string('conditional', 'theme_snap');
$assetrestrictions .= "<div class='text text-danger'>{$conditionalinfo}.{$availabilityinfo}</div>";
}
$assetrestrictions = "<div class='snap-restrictions-meta'>{$assetrestrictions}</div>";
$assetmeta .= $assetcompletionmeta . $assetrestrictions;
// Build output.
$postcontent = '<div class="snap-asset-meta" data-cmid="' . $mod->id . '">' . $mod->afterlink . $assetmeta . '</div>';
$output .= $assetlink . $contentpart . $postcontent;
// Bail at this point if we aren't using a supported format. (Folder view is only partially supported).
$supported = ['folderview', 'topics', 'weeks', 'site'];
if (!in_array($COURSE->format, $supported)) {
//.........这里部分代码省略.........
/**
* Gets a grouping array for display
*
* @return array
*/
protected function get_groupings()
{
// get the courseid from the module's course context
if (get_class($this->context) == 'context_course') {
// if the context defined for the form is a context course just get its id
$courseid = $this->context->instanceid;
} else {
$cmcontext = context_module::instance($this->_cm->id);
$coursecontext = $cmcontext->get_course_context(false);
$courseid = $coursecontext->instanceid;
}
$groupings = groups_get_all_groupings($courseid);
// create an array with just the grouping id and name
$retgroupings = array();
$retgroupings[''] = get_string('none');
foreach ($groupings as $grouping) {
$retgroupings[$grouping->id] = $grouping->name;
}
return $retgroupings;
}
请发表评论