get('mnetuser')
&& safe_require_plugin('auth', 'xmlrpc')
) {
auth_xmlrpc_mnet_view_access($mnetviewid, $mnetcollid);
}
// access key for roaming teachers
// TODO: The mt token is used by the old token-based Mahara assignment submission
// access system, which is now deprecated. Remove eventually.
$mnettoken = $SESSION->get('mnetuser') ? param_alphanum('mt', null) : null;
// access key for logged out users
$usertoken = (is_null($mnettoken) && get_config('allowpublicviews')) ? param_alphanum('t', null) : null;
if ($mnettoken) {
if (!$viewid = get_view_from_token($mnettoken, false)) {
throw new AccessDeniedException(get_string('accessdenied', 'error'));
}
}
else if ($usertoken) {
if (!$viewid = get_view_from_token($usertoken, true)) {
throw new AccessDeniedException(get_string('accessdenied', 'error'));
}
}
else if ($pageurl = param_alphanumext('page', null)) {
if ($profile = param_alphanumext('profile', null)) {
$view = new View(array('urlid' => $pageurl, 'ownerurlid' => $profile));
}
else if ($homepage = param_alphanumext('homepage', null)) {
$view = new View(array('urlid' => $pageurl, 'groupurlid' => $homepage));
}
else {
throw new ViewNotFoundException(get_string('viewnotfoundexceptiontitle', 'error'));
}
$viewid = $view->get('id');
}
else {
$viewid = param_integer('id');
}
$new = param_boolean('new');
$showmore = param_boolean('showmore');
if (!$showmore) {
$showmore = 0;
}
if (!isset($view)) {
$view = new View($viewid);
}
if (!can_view_view($view)) {
$errorstr = (param_integer('objection', null)) ? get_string('accessdeniedobjection', 'error') : get_string('accessdenied', 'error');
throw new AccessDeniedException($errorstr);
}
else {
// To save the atime in the db - make it a millisecond in the past
// so it differs from the atime in the View constructor and so triggers
// the saving of the atime change. Can't use $view->set('dirty', true)
// as that will also get the view object to update the mtime which is not
// what we want.
$view->set('atime', (time()) - 1);
$view->commit();
}
// Comment list pagination requires limit/offset params
$limit = param_integer('limit', 10);
$offset = param_integer('offset', 0);
$showcomment = param_integer('showcomment', null);
// Create the "make comment private form" now if it's been submitted
if (param_variable('make_public_submit', null)) {
pieform(ArtefactTypeComment::make_public_form(param_integer('comment')));
}
else if (param_exists('delete_comment_submit')) {
pieform(ArtefactTypeComment::delete_comment_form(param_integer('comment')));
}
$owner = $view->get('owner');
$viewtype = $view->get('type');
if ($viewtype == 'profile' || $viewtype == 'dashboard' || $viewtype == 'grouphomepage') {
redirect($view->get_url());
}
define('TITLE', $view->get('title'));
$collection = $view->get('collection');
$submittedgroup = (int)$view->get('submittedgroup');
if ($USER->is_logged_in() && $submittedgroup && group_user_can_assess_submitted_views($submittedgroup, $USER->get('id'))) {
// The user is a tutor of the group that this view has
// been submitted to, and is entitled to release the view
$submittedgroup = get_record('group', 'id', $submittedgroup);
// If the view is part of a submitted collection, the whole
// collection must be released at once.
$releasecollection = !empty($collection) && $collection->get('submittedgroup') == $submittedgroup->id;
if ($releasecollection) {
if ($ctime = $collection->get('submittedtime')) {
$text = get_string(
'collectionsubmittedtogroupon', 'view', group_homepage_url($submittedgroup), hsc($submittedgroup->name),
format_date(strtotime($ctime))
);
}
else {
$text = get_string('collectionsubmittedtogroup', 'view', group_homepage_url($submittedgroup), hsc($submittedgroup->name));
}
}
else if ($view->get('submittedtime')) {
$text = get_string('viewsubmittedtogroupon', 'view', group_homepage_url($submittedgroup), hsc($submittedgroup->name), format_date(strtotime($view->get('submittedtime'))));
}
else {
$text = get_string('viewsubmittedtogroup', 'view', group_homepage_url($submittedgroup), hsc($submittedgroup->name));
}
if (($releasecollection && $collection->get('submittedstatus') == Collection::SUBMITTED) || $view->get('submittedstatus') == View::SUBMITTED) {
$releaseform = pieform(array(
'name' => 'releaseview',
'method' => 'post',
'class' => 'form-inline',
'plugintype' => 'core',
'pluginname' => 'view',
'autofocus' => false,
'elements' => array(
'submittedview' => array(
'type' => 'html',
'value' => $text,
),
'submit' => array(
'type' => 'button',
'usebuttontag' => true,
'class' => 'btn-default pull-right',
'value' => $releasecollection ? '' . get_string('releasecollection', 'group') : '' . get_string('releaseview', 'group'),
),
),
));
}
else {
$releaseform = $text . ' ' . get_string('submittedpendingrelease', 'view');
}
}
else {
$releaseform = '';
}
function releaseview_submit() {
global $USER, $SESSION, $view, $collection, $submittedgroup, $releasecollection;
if ($releasecollection) {
if (is_object($submittedgroup) && $submittedgroup->allowarchives) {
$collection->pendingrelease($USER);
$SESSION->add_ok_msg(get_string('collectionreleasedpending', 'group'));
}
else {
$collection->release($USER);
$SESSION->add_ok_msg(get_string('collectionreleasedsuccess', 'group'));
}
}
else {
if (is_object($submittedgroup) && $submittedgroup->allowarchives) {
$view->pendingrelease($USER);
$SESSION->add_ok_msg(get_string('viewreleasedpending', 'group'));
}
else {
$view->release($USER);
$SESSION->add_ok_msg(get_string('viewreleasedsuccess', 'group'));
}
}
if ($submittedgroup) {
// The tutor might not have access to the view any more; send
// them back to the group page.
redirect(group_homepage_url($submittedgroup));
}
redirect($view->get_url());
}
$javascript = array('paginator', 'viewmenu', 'js/collection-navigation.js');
$blocktype_js = $view->get_all_blocktype_javascript();
$javascript = array_merge($javascript, $blocktype_js['jsfiles']);
if (is_plugin_active('externalvideo', 'blocktype')) {
$javascript = array_merge($javascript, array((is_https() ? 'https:' : 'http:') . '//cdn.embedly.com/widgets/platform.js'));
}
$inlinejs = "addLoadEvent( function() {\n" . join("\n", $blocktype_js['initjs']) . "\n});";
// If the view has comments turned off, tutors can still leave
// comments if the view is submitted to their group.
if (!empty($releaseform) || ($commenttype = $view->user_comments_allowed($USER))) {
$defaultprivate = !empty($releaseform);
$moderate = isset($commenttype) && $commenttype === 'private';
$addfeedbackform = pieform(ArtefactTypeComment::add_comment_form($defaultprivate, $moderate));
}
if ($USER->is_logged_in()) {
$objectionform = pieform(objection_form());
if ($notrudeform = notrude_form()) {
$notrudeform = pieform($notrudeform);
}
}
$viewbeingwatched = (int)record_exists('usr_watchlist_view', 'usr', $USER->get('id'), 'view', $viewid);
$commentoptions = ArtefactTypeComment::get_comment_options();
$commentoptions->limit = $limit;
$commentoptions->offset = $offset;
$commentoptions->showcomment = $showcomment;
$commentoptions->view = $view;
$feedback = ArtefactTypeComment::get_comments($commentoptions);
// Set up theme
$viewtheme = $view->get('theme');
if ($viewtheme && $THEME->basename != $viewtheme) {
$THEME = new Theme($view);
}
$headers = array();
$headers[] = '';
$headers = array_merge($headers, $view->get_all_blocktype_css());
// Set up skin, if the page has one
$viewskin = $view->get('skin');
$issiteview = $view->get('institution') == 'mahara';
if ($viewskin && get_config('skins') && can_use_skins($owner, false, $issiteview) && (!isset($THEME->skins) || $THEME->skins !== false)) {
$skin = array('skinid' => $viewskin, 'viewid' => $view->get('id'));
}
else {
$skin = false;
}
if (!$view->is_public()) {
$headers[] = ''; // Tell search engines not to index non-public views
}
// include slimbox2 js and css files, if it is enabled...
if (get_config_plugin('blocktype', 'gallery', 'useslimbox2')) {
$langdir = (get_string('thisdirection', 'langconfig') == 'rtl' ? '-rtl' : '');
$headers = array_merge($headers, array(
'',
''
));
}
$can_edit = $USER->can_edit_view($view) && !$submittedgroup && !$view->is_submitted();
$can_copy = $view->is_copyable($view);
$viewgroupform = false;
if ($owner && $owner == $USER->get('id')) {
if ($tutorgroupdata = group_get_user_course_groups()) {
if (!$view->is_submitted()) {
$viewgroupform = view_group_submission_form($view, $tutorgroupdata, 'view');
}
}
}
$viewcontent = $view->build_rows(); // Build content before initialising smarty in case pieform elements define headers.
$smarty = smarty(
$javascript,
$headers,
array('confirmcopytitle' => 'view',
'confirmcopydesc' => 'view',
'View' => 'view',
'Collection' => 'collection'),
array(
'sidebars' => false,
'skin' => $skin
)
);
$javascript = <<pagination_js}
});
jQuery(function($) {
$('#column-container .blockinstance-content .commentlink').each(function() {
var blockid = $(this).attr('id').match(/\d+/);
// only use comments expander if there are comments on the artefact
$(this).on('click', function(e) {
var commentlink = $(this);
var chtml = commentlink.parent().parent().find('#feedbacktable_' + blockid).parent();
// add a 'close' link at the bottom of the list for convenience
if ($('#closer_' + blockid).length == 0) {
var closer = $('Close').click(function(e) {
$(this).parent().toggle(400, function() {
commentlink.focus();
});
e.preventDefault();
});
chtml.append(closer);
}
chtml.toggle(400, function() {
if (chtml.is(':visible')) {
chtml.find('a').first().focus();
}
else {
commentlink.focus();
}
});
e.preventDefault();
});
});
});
EOF;
// collection top navigation
if ($collection) {
$shownav = $collection->get('navigation');
if ($shownav) {
if ($views = $collection->get('views')) {
$viewnav = $views['views'];
if ($collection->has_framework()) {
array_unshift($viewnav, $collection->collection_nav_framework_option());
}
$smarty->assign('collection', $viewnav);
}
}
}
$smarty->assign('INLINEJAVASCRIPT', $javascript . $inlinejs);
$smarty->assign('new', $new);
$smarty->assign('viewid', $viewid);
$smarty->assign('viewtype', $viewtype);
$smarty->assign('feedback', $feedback);
$smarty->assign('owner', $owner);
$smarty->assign('tags', $view->get('tags'));
$smarty->assign('PAGEHEADING', null);
if ($view->is_anonymous()) {
$smarty->assign('PAGEAUTHOR', get_string('anonymoususer'));
$smarty->assign('author', get_string('anonymoususer'));
if ($view->is_staff_or_admin_for_page()) {
$smarty->assign('realauthor', $view->display_author());
}
$smarty->assign('anonymous', TRUE);
} else {
$smarty->assign('PAGEAUTHOR', $view->formatted_owner());
$smarty->assign('author', $view->display_author());
$smarty->assign('anonymous', FALSE);
}
$titletext = ($collection && $shownav) ? hsc($collection->get('name')) : $view->display_title(true, false, false);
$smarty->assign('lastupdatedstr', $view->lastchanged_message());
$smarty->assign('visitstring', $view->visit_message());
if ($can_edit) {
$smarty->assign('editurl', get_config('wwwroot') . 'view/blocks.php?id=' . $viewid . ($new ? '&new=1' : ''));
}
if ($can_copy) {
$smarty->assign('copyurl', get_config('wwwroot') . 'view/copy.php?id=' . $viewid . (!empty($collection) ? '&collection=' . $collection->get('id') : ''));
}
$title = hsc(TITLE);
$smarty->assign('maintitle', $titletext);
// Provide a link for roaming teachers to return
$showmnetlink = false;
// Old token-based access list
if (
$mnetviewlist = $SESSION->get('mnetviewaccess')
&& isset($mnetviewlist[$view->get('id')])
) {
$showmnetlink = true;
}
// New mnet-based access list
if (
$SESSION->get('mnetviews')
&& in_array($view->get('id'), $SESSION->get('mnetviews'))
) {
$showmnetlink = true;
}
if ($showmnetlink) {
$returnurl = $SESSION->get('mnetuserfrom');
require_once(get_config('docroot') . 'api/xmlrpc/lib.php');
if ($peer = get_peer_from_instanceid($SESSION->get('authinstance'))) {
$smarty->assign('mnethost', array(
'name' => $peer->name,
'url' => $returnurl ? $returnurl : $peer->wwwroot,
));
}
}
$smarty->assign('viewdescription', ArtefactTypeFolder::append_view_url($view->get('description'), $view->get('id')));
$smarty->assign('viewcontent', $viewcontent);
$smarty->assign('releaseform', $releaseform);
if (isset($addfeedbackform)) {
$smarty->assign('enablecomments', 1);
$smarty->assign('addfeedbackform', $addfeedbackform);
}
if (isset($objectionform)) {
$smarty->assign('objectionform', $objectionform);
$smarty->assign('notrudeform', $notrudeform);
}
$smarty->assign('viewbeingwatched', $viewbeingwatched);
if ($viewgroupform) {
$smarty->assign('view_group_submission_form', $viewgroupform);
}
if ($titletext !== $title) {
$smarty->assign('title', $title);
}
$smarty->assign('userisowner', ($owner && $owner == $USER->get('id')));
$smarty->display('view/view.tpl');
mahara_log('views', "$viewid"); // Log view visits