. * * @package mahara * @subpackage artefact-file * @author Catalyst IT Ltd * @license http://www.gnu.org/copyleft/gpl.html GNU GPL * @copyright (C) 2006-2009 Catalyst IT Ltd http://catalyst.net.nz * */ defined('INTERNAL') || die(); /** * Browser for files area. * * @param Pieform $form The form to render the element for * @param array $element The element to render * @return string The HTML for the element */ function pieform_element_filebrowser(Pieform $form, $element) { global $USER, $_PIEFORM_FILEBROWSERS; $smarty = smarty_core(); $group = $form->get_property('group'); $institution = $form->get_property('institution'); if (!empty($element['tabs'])) { $tabdata = pieform_element_filebrowser_configure_tabs($element['tabs']); $smarty->assign('tabs', $tabdata); if (!$group && $tabdata['owner'] == 'group') { $group = $tabdata['ownerid']; } else if (!$institution) { if ($tabdata['owner'] == 'institution') { $institution = $tabdata['ownerid']; } else if ($tabdata['owner'] == 'site') { $institution = 'mahara'; } } } $userid = ($group || $institution) ? null : $USER->get('id'); // refresh quotas if ($userid) { $USER->quota_refresh(); } $folder = $element['folder']; $path = pieform_element_filebrowser_get_path($folder); $smarty->assign('folder', $folder); $smarty->assign('foldername', $path[0]->title); $smarty->assign('path', array_reverse($path)); $smarty->assign('highlight', $element['highlight'][0]); $smarty->assign('edit', !empty($element['edit']) ? $element['edit'] : -1); if (isset($element['browse'])) { $smarty->assign('browse', (int) $element['browse']); } $config = array_map('intval', $element['config']); if ($group && $config['edit']) { $smarty->assign('groupinfo', pieform_element_filebrowser_get_groupinfo($group)); } $formid = $form->get_name(); $prefix = $formid . '_' . $element['name']; if ($config['select']) { if (function_exists($element['selectlistcallback'])) { if ($form->is_submitted() && $form->has_errors() && isset($_POST[$prefix . '_selected']) && is_array($_POST[$prefix . '_selected'])) { $value = array_keys($_POST[$prefix . '_selected']); } else if (isset($element['defaultvalue'])) { $value = $element['defaultvalue']; } else { $value = null; } $selected = $element['selectlistcallback']($value); } $smarty->assign('selectedlist', $selected); $selectedliststr = json_encode($selected); } if ($config['uploadagreement']) { if (get_config_plugin('artefact', 'file', 'usecustomagreement')) { $smarty->assign('agreementtext', get_field('site_content', 'content', 'name', 'uploadcopyright')); } else { $smarty->assign('agreementtext', get_string('uploadcopyrightdefaultcontent', 'install')); } } else if (!isset($config['simpleupload'])) { $config['simpleupload'] = 1; } if ($config['upload']) { $maxuploadsize = display_size(get_max_upload_size(!$institution && !$group)); $smarty->assign('maxuploadsize', $maxuploadsize); $smarty->assign('phpmaxfilesize', get_max_upload_size(false)); if ($group) { $smarty->assign('uploaddisabled', !pieform_element_filebrowser_edit_group_folder($group, $folder)); } } if (!empty($element['browsehelp'])) { $config['plugintype'] = $form->get_property('plugintype'); $config['pluginname'] = $form->get_property('pluginname'); $config['browsehelp'] = $element['browsehelp']; } $config['showtags'] = !empty($config['tag']) ? (int) $userid : 0; $config['editmeta'] = (int) ($userid && !$config['edit'] && !empty($config['tag'])); $smarty->assign('config', $config); $filters = isset($element['filters']) ? $element['filters'] : null; $filedata = ArtefactTypeFileBase::get_my_files_data($folder, $userid, $group, $institution, $filters); $smarty->assign('filelist', $filedata); $configstr = json_encode($config); $fileliststr = json_encode($filedata); $smarty->assign('prefix', $prefix); $initjs = "{$prefix} = new FileBrowser('{$prefix}', {$folder}, {$configstr}, config); {$prefix}.filedata = {$fileliststr};"; if ($config['select']) { $initjs .= "{$prefix}.selecteddata = {$selectedliststr};"; } $_PIEFORM_FILEBROWSERS[$prefix]['views_js'] = $initjs; $initjs .= "addLoadEvent({$prefix}.init);"; $smarty->assign('initjs', $initjs); $smarty->assign('querybase', $element['page'] . (strpos($element['page'], '?') === false ? '?' : '&')); return $smarty->fetch('artefact:file:form/filebrowser.tpl'); } function pieform_element_filebrowser_get_groupinfo($group) { require_once('group.php'); $groupinfo = array( 'roles' => group_get_role_info($group), 'perms' => group_get_default_artefact_permissions($group), 'perm' => array(), ); foreach (current($groupinfo['perms']) as $k => $v) { $groupinfo['perm'][$k] = get_string('filepermission.' . $k, 'artefact.file'); } return $groupinfo; } function pieform_element_filebrowser_get_path($folder) { $path = array(); if ($folder) { $folders = ArtefactTypeFileBase::artefactchooser_folder_data(artefact_instance_from_id($folder))->data; $f = $folder; while ($f) { $path[] = (object) array('title' => $folders[$f]->title, 'id' => $f); $f = $folders[$f]->parent; } } $path[] = (object) array('title' => get_string('home', 'artefact.file'), 'id' => 0); return $path; } function pieform_element_filebrowser_build_path($form, $element, $folder, $owner=null, $ownerid=null) { if (!$form->submitted_by_js()) { return; } $querybase = $element['page'] . (strpos($element['page'], '?') === false ? '?' : '&'); $path = pieform_element_filebrowser_get_path($folder); $foldername = $path[0]->title; $smarty = smarty_core(); $smarty->assign('path', array_reverse($path)); $smarty->assign('owner', $owner); $smarty->assign('ownerid', $ownerid); $smarty->assign('querybase', $querybase); return array('html' => $smarty->fetch('artefact:file:form/folderpath.tpl'), 'foldername' => $foldername); } function pieform_element_filebrowser_build_filelist($form, $element, $folder, $highlight=null, $user=null, $group=null, $institution=null) { if (!$form->submitted_by_js()) { // We're going to rebuild the page from scratch anyway. return; } global $USER; $smarty = smarty_core(); $userid = null; if (is_null($group) && is_null($user)) { $group = $form->get_property('group'); } else if ($user) { $userid = $USER->get('id'); $smarty->assign('owner', 'user'); $smarty->assign('ownerid', $userid); } else { $smarty->assign('owner', 'group'); $smarty->assign('ownerid', $group); } if (is_null($institution)) { $institution = $form->get_property('institution'); } else { $smarty->assign('owner', 'institution'); $smarty->assign('ownerid', $institution); } if (is_null($userid)) { $userid = ($group || $institution) ? null : $USER->get('id'); } $editable = (int) $element['config']['edit']; $selectable = (int) $element['config']['select']; $selectfolders = (int) !empty($element['config']['selectfolders']); $publishing = (int) !empty($element['config']['publishing']); $showtags = !empty($element['config']['tag']) ? (int) $userid : 0; $editmeta = (int) ($userid && !$editable && !empty($element['config']['tag'])); $querybase = $element['page'] . (strpos($element['page'], '?') === false ? '?' : '&'); $prefix = $form->get_name() . '_' . $element['name']; $filters = isset($element['filters']) ? $element['filters'] : null; $filedata = ArtefactTypeFileBase::get_my_files_data($folder, $userid, $group, $institution, $filters); $smarty->assign('edit', -1); $smarty->assign('highlight', $highlight); $smarty->assign('editable', $editable); $smarty->assign('selectable', $selectable); $smarty->assign('selectfolders', $selectfolders); $smarty->assign('publishing', $publishing); $smarty->assign('showtags', $showtags); $smarty->assign('editmeta', $editmeta); $smarty->assign('filelist', $filedata); $smarty->assign('querybase', $querybase); $smarty->assign('prefix', $prefix); return array( 'data' => $filedata, 'html' => $smarty->fetch('artefact:file:form/filelist.tpl'), ); } function pieform_element_filebrowser_configure_tabs($viewowner) { if ($viewowner['type'] == 'institution' && $viewowner['id'] == 'mahara') { // No filebrowser tabs for site views return null; } $tabs = array(); $subtabs = array(); $upload = null; $selectedsubtab = null; if ($viewowner['type'] == 'institution') { $selectedtab = param_variable('owner', 'institution'); $upload = $selectedtab == 'institution'; $tabs['institution'] = get_string('institutionfiles', 'admin'); } else if ($viewowner['type'] == 'group') { $selectedtab = param_variable('owner', 'group'); $upload = $selectedtab == 'group'; $tabs['user'] = get_string('myfiles', 'artefact.file'); $tabs['group'] = get_string('groupfiles', 'artefact.file'); } else { // $viewowner['type'] == 'user' global $USER; $selectedtab = param_variable('owner', 'user'); $upload = $selectedtab == 'user'; $tabs['user'] = get_string('myfiles', 'artefact.file'); if ($groups = $USER->get('grouproles')) { $tabs['group'] = get_string('groupfiles', 'artefact.file'); require_once(get_config('libroot') . 'group.php'); $groups = group_get_user_groups($USER->get('id')); if ($selectedtab == 'group') { if (!$selectedsubtab = (int) param_variable('ownerid', 0)) { $selectedsubtab = $groups[0]->id; } foreach ($groups as &$g) { $subtabs[$g->id] = $g->name; } } } if ($institutions = $USER->get('institutions')) { $tabs['institution'] = get_string('institutionfiles', 'admin'); $institutions = get_records_select_array('institution', 'name IN (' . join(',', array_map('db_quote', array_keys($institutions))) . ')'); if ($selectedtab == 'institution') { if (!$selectedsubtab = param_variable('ownerid', '')) { $selectedsubtab = $institutions[0]->name; } $selectedsubtab = hsc($selectedsubtab); foreach ($institutions as &$i) { $subtabs[$i->name] = $i->displayname; } } } } $tabs['site'] = get_string('sitefiles', 'admin'); return array('tabs' => $tabs, 'subtabs' => $subtabs, 'owner' => $selectedtab, 'ownerid' => $selectedsubtab, 'upload' => $upload); } function pieform_element_filebrowser_get_value(Pieform $form, $element) { $prefix = $form->get_name() . '_' . $element['name']; // The value of this element is the list of selected artefact ids $selected = param_variable($prefix . '_selected', null); if (is_array($selected)) { $selected = array_keys($selected); } // Process actions that must occur before form validation and // which can safely occur without affecting the element's value $result = pieform_element_filebrowser_doupdate($form, $element); if (is_array($result)) { // We did something. If js, replace the filebrowser now and // don't continue form submission. if (!isset($result['folder'])) { $result['folder'] = $element['folder']; } if ($form->submitted_by_js()) { $replacehtml = false; // Don't replace the entire form when replying with json data. $result['formelement'] = $prefix; if (!empty($result['error'])) { $result['formelementerror'] = $prefix . '.callback'; } else { $result['formelementsuccess'] = $prefix . '.callback'; } $form->json_reply(empty($result['error']) ? PIEFORM_OK : PIEFORM_ERR, $result, $replacehtml); } // Not js. Add some params & redirect back to the page $params = array(); if (!empty($result['folder'])) { $params[] = 'folder=' . $result['folder']; } if (!empty($result['edit'])) { $params[] = 'edit=' . $result['edit']; } if (!empty($result['highlight'])) { $params[] = 'file=' . $result['highlight']; } if (!empty($result['browse'])) { $params[] = 'browse=1'; } $result['goto'] = $element['page']; if (!empty($params)) { $result['goto'] .= (strpos($element['page'], '?') === false ? '?' : '&') . join('&', $params); } if (empty($result['select']) && empty($result['unselect'])) { $form->reply(empty($result['error']) ? PIEFORM_OK : PIEFORM_ERR, $result); } // If we got to this point, the doupdate function couldn't select or unselect a file, // so we need to let it go through to the form's submit function to deal with. if (!empty($result['select'])) { if ($element['config']['selectone']) { $selected = array($result['select']); } else { $selected = is_array($selected) ? $selected : array(); if (!in_array($result['select'], $selected)) { $selected[] = $result['select']; } } } else if (!empty($result['unselect'])) { $selected = is_array($selected) ? array_diff($selected, array($result['unselect'])) : array(); } } if (is_array($selected) && !empty($selected)) { if (!empty($element['config']['selectone'])) { return $selected[0]; } return $selected; } return null; } function pieform_element_filebrowser_doupdate(Pieform $form, $element) { $result = null; $prefix = $form->get_name() . '_' . $element['name']; $delete = param_variable($prefix . '_delete', null); if (is_array($delete)) { $keys = array_keys($delete); return pieform_element_filebrowser_delete($form, $element, (int) ($keys[0])); } $update = param_variable($prefix . '_update', null); if (is_array($update)) { $edit_title = param_variable($prefix . '_edit_title'); $namelength = strlen($edit_title); if (!$namelength) { return array( 'error' => true, 'message' => get_string('filenamefieldisrequired', 'artefact.file') ); } else if ($namelength > 1024) { return array( 'error' => true, 'message' => get_string('nametoolong', 'artefact.file'), ); } $keys = array_keys($update); $data = array( 'artefact' => (int) ($keys[0]), 'title' => $edit_title, 'description' => param_variable($prefix . '_edit_description'), 'tags' => param_variable($prefix . '_edit_tags'), 'folder' => $element['folder'], 'allowcomments' => param_boolean($prefix . '_edit_allowcomments'), ); if ($form->get_property('group')) { $data['permissions'] = array('admin' => (object) array('view' => true, 'edit' => true, 'republish' => true)); foreach ($_POST as $k => $v) { if (preg_match('/^' . $prefix . '_permission:([a-z]+):([a-z]+)$/', $k, $m)) { $data['permissions'][$m[1]]->{$m[2]} = (bool) $v; } } } return pieform_element_filebrowser_update($form, $element, $data); } $move = param_variable($prefix . '_move', null); if (!empty($move)) { return pieform_element_filebrowser_move($form, $element, array( 'artefact' => (int) $move, 'newparent' => param_integer($prefix . '_moveto'), 'folder' => $element['folder'], )); } $createfolder = param_variable($prefix . '_createfolder', null); if (!empty($createfolder)) { $createfolder_name = param_variable($prefix . '_createfolder_name'); $namelength = strlen($createfolder_name); if (!$namelength) { return array( 'error' => true, 'message' => get_string('foldernamerequired', 'artefact.file'), ); } else if ($namelength > 1024) { return array( 'error' => true, 'message' => get_string('nametoolong', 'artefact.file'), ); } return pieform_element_filebrowser_createfolder($form, $element, array( 'title' => $createfolder_name, 'folder' => $element['folder'], )); } // {$prefix}_upload is set in all browsers except safari when javascript is // on (and set in all browsers when it's not) $upload = param_variable($prefix . '_upload', null); if (!empty($upload)) { if (empty($_FILES['userfile']['name'])) { return array( 'error' => true, 'message' => get_string('filenamefieldisrequired', 'artefact.file'), 'browse' => 1, ); } } if (!empty($_FILES['userfile']['name'])) { if (strlen($_FILES['userfile']['name']) > 1024) { return array( 'error' => true, 'message' => get_string('nametoolong', 'artefact.file'), ); } else if ($element['config']['uploadagreement'] && !param_boolean($prefix . '_notice', false)) { return array( 'error' => true, 'message' => get_string('youmustagreetothecopyrightnotice', 'artefact.file'), 'browse' => 1, ); } $result = pieform_element_filebrowser_upload($form, $element, array( 'userfile' => $_FILES['userfile'], 'uploadnumber' => param_integer($prefix . '_uploadnumber'), 'uploadfolder' => $element['folder'] ? $element['folder'] : null, 'uploadfoldername' => param_variable($prefix . '_foldername'), )); // If it's a non-js upload, automatically select the newly uploaded file. $result['browse'] = 1; if (!$form->submitted_by_js() && !$result['error'] && !empty($element['config']['select'])) { if (isset($element['selectcallback']) && is_callable($element['selectcallback'])) { $element['selectcallback']($result['highlight']); } else { $result['select'] = $result['highlight']; } } return $result; } if (!$form->submitted_by_js()) { $select = param_variable($prefix . '_select', null); if (is_array($select)) { $keys = array_keys($select); $add = (int) $keys[0]; if (isset($element['selectcallback']) && is_callable($element['selectcallback'])) { try { $element['selectcallback']($add); } catch (ArtefactNotFoundException $e) { $result = array( 'error' => true, 'message' => get_string('selectingfailed', 'artefact.file'), ); return $result; } } else { $result['select'] = $add; } $result['message'] = get_string('fileadded', 'artefact.file'); $result['browse'] = 1; return $result; } $unselect = param_variable($prefix . '_unselect', null); if (is_array($unselect)) { $keys = array_keys($unselect); $del = (int) $keys[0]; if (isset($element['unselectcallback']) && is_callable($element['unselectcallback'])) { try { $element['unselectcallback']($del); } catch (ArtefactNotFoundException $e) { $result = array( 'error' => true, 'message' => get_string('removingfailed', 'artefact.file'), ); return $result; } } else { $result['unselect'] = $del; } $result['message'] = get_string('fileremoved', 'artefact.file'); return $result; } $edit = param_variable($prefix . '_edit', null); if (is_array($edit)) { $keys = array_keys($edit); $result['edit'] = (int) $keys[0]; return $result; } if (param_variable('browse', 0) && !param_variable($prefix . '_cancelbrowse', 0)) { $result['browse'] = 1; return $result; } } $changeowner = param_variable($prefix . '_changeowner', null); if (!empty($changeowner)) { $result = pieform_element_filebrowser_changeowner($form, $element); $result['browse'] = 1; return $result; } $newfolder = param_variable($prefix . '_changefolder', null); if (!is_null($newfolder) && is_numeric($newfolder)) { $result = pieform_element_filebrowser_changefolder($form, $element, $newfolder); $result['browse'] = 1; $result['folder'] = $newfolder; return $result; } } function pieform_element_filebrowser_upload(Pieform $form, $element, $data) { global $USER; $parentfolder = $data['uploadfolder'] ? (int) $data['uploadfolder'] : null; $institution = $form->get_property('institution'); $group = $form->get_property('group'); $uploadnumber = (int) $data['uploadnumber']; $editable = (int) $element['config']['edit']; $selectable = (int) $element['config']['select']; $querybase = $element['page'] . (strpos($element['page'], '?') === false ? '?' : '&'); $prefix = $form->get_name() . '_' . $element['name']; $result = array('error' => false, 'uploadnumber' => $uploadnumber); if ($parentfolder == 0) { $parentfolder = null; } $data = new StdClass; $data->parent = $parentfolder; $data->owner = null; if ($parentfolder) { $parentartefact = artefact_instance_from_id($parentfolder); if (!$USER->can_edit_artefact($parentartefact)) { $result['error'] = true; $result['message'] = get_string('cannoteditfolder', 'artefact.file'); return $result; } else if ($parentartefact->get('locked')) { $result['error'] = true; $result['message'] = get_string('cannoteditfoldersubmitted', 'artefact.file'); return $result; } $parentfoldername = $parentartefact->get('title'); } else { $parentfoldername = null; } if ($institution) { if (!$USER->can_edit_institution($institution)) { $result['error'] = true; $result['message'] = get_string('notadminforinstitution', 'admin'); return $result; } $data->institution = $institution; } else if ($group) { if (!$parentfolder) { if (!pieform_element_filebrowser_edit_group_folder($group, 0)) { return array('error' => true, 'message' => get_string('cannoteditfolder', 'artefact.file')); } } $data->group = $group; } else { $data->owner = $USER->get('id'); } $data->container = 0; $originalname = $_FILES['userfile']['name']; $originalname = $originalname ? basename($originalname) : get_string('file', 'artefact.file'); $data->title = ArtefactTypeFileBase::get_new_file_title($originalname, $parentfolder, $data->owner, $group, $institution); try { $newid = ArtefactTypeFile::save_uploaded_file('userfile', $data); } catch (QuotaExceededException $e) { prepare_upload_failed_message($result, $e, $parentfoldername, $originalname); // update the file listing $result['quota'] = $USER->get('quota'); $result['quotaused'] = $USER->get('quotaused'); $result['newlist'] = pieform_element_filebrowser_build_filelist($form, $element, $parentfolder); return $result; } catch (UploadException $e) { prepare_upload_failed_message($result, $e, $parentfoldername, $originalname); return $result; } // Upload succeeded if (isset($element['filters'])) { $artefacttypes = isset($element['filters']['artefacttype']) ? $element['filters']['artefacttype'] : null; $filetypes = isset($element['filters']['filetype']) ? $element['filters']['filetype'] : null; if (!empty($artefacttypes) || !empty($filetypes)) { // Need to check the artefacttype or filetype (mimetype) of the uploaded file. $file = artefact_instance_from_id($newid); if (is_array($artefacttypes) && !in_array($file->get('artefacttype'), $artefacttypes) || is_array($filetypes) && !in_array($file->get('filetype'), $filetypes)) { $result['error'] = true; $result['uploaded'] = true; $result['message'] = get_string('wrongfiletypeforblock', 'artefact.file'); return $result; } } } if ($parentfoldername) { if ($data->title == $originalname) { $result['message'] = get_string('uploadoffiletofoldercomplete', 'artefact.file', $originalname, $parentfoldername); } else { $result['message'] = get_string('fileuploadedtofolderas', 'artefact.file', $originalname, $parentfoldername, $data->title); } } else if ($data->title == $originalname) { $result['message'] = get_string('uploadoffilecomplete', 'artefact.file', $originalname); } else { $result['message'] = get_string('fileuploadedas', 'artefact.file', $originalname, $data->title); } $result['highlight'] = $newid; $result['uploaded'] = true; $result['newlist'] = pieform_element_filebrowser_build_filelist($form, $element, $parentfolder, $newid); $result['quota'] = $USER->get('quota'); $result['quotaused'] = $USER->get('quotaused'); $result['maxuploadsize'] = display_size(get_max_upload_size(!$institution && !$group)); return $result; } /** * Helper function used above to minimise code duplication */ function prepare_upload_failed_message(&$result, $exception, $parentfoldername, $title) { $result['error'] = true; if ($parentfoldername) { $result['message'] = get_string('uploadoffiletofolderfailed', 'artefact.file', $title, $parentfoldername); } else { $result['message'] = get_string('uploadoffilefailed', 'artefact.file', $title); } $result['message'] .= ': ' . $exception->getMessage(); } function pieform_element_filebrowser_createfolder(Pieform $form, $element, $data) { global $USER; $parentfolder = $data['folder'] ? (int) $data['folder'] : null; $institution = $form->get_property('institution'); $group = $form->get_property('group'); $result = array(); $data = (object) array( 'parent' => $parentfolder, 'owner' => null, 'title' => $data['title'], ); if ($parentfolder) { $parentartefact = artefact_instance_from_id($parentfolder); if (!$USER->can_edit_artefact($parentartefact)) { return array('error' => true, 'message' => get_string('cannoteditfolder', 'artefact.file')); } else if ($parentartefact->get('locked')) { return array('error' => true, 'message' => get_string('cannoteditfoldersubmitted', 'artefact.file')); } } if ($institution) { $data->institution = $institution; } else if ($group) { if (!$parentfolder) { if (!pieform_element_filebrowser_edit_group_folder($group, 0)) { return array('error' => true, 'message' => get_string('cannoteditfolder', 'artefact.file')); } } $data->group = $group; } else { $data->owner = $USER->get('id'); } if ($oldid = ArtefactTypeFileBase::file_exists($data->title, $data->owner, $parentfolder, $institution, $group)) { return array('error' => true, 'message' => get_string('fileexists', 'artefact.file')); } $f = new ArtefactTypeFolder(0, $data); $f->set('dirty', true); $f->commit(); return array( 'error' => false, 'message' => get_string('foldercreated', 'artefact.file'), 'highlight' => $f->get('id'), 'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $parentfolder, $f->get('id')), ); } function pieform_element_filebrowser_update(Pieform $form, $element, $data) { global $USER; $collide = !empty($data['collide']) ? $data['collide'] : 'fail'; try { $artefact = artefact_instance_from_id($data['artefact']); } catch (ArtefactNotFoundException $e) { $parentfolder = $element['folder'] ? $element['folder'] : null; $result = array( 'error' => true, 'message' => get_string('editingfailed', 'artefact.file'), 'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $parentfolder), ); return $result; } if (!$USER->can_edit_artefact($artefact) || $artefact->get('locked')) { return array('error' => true, 'message' => get_string('noeditpermission', 'mahara')); } if ($existingid = ArtefactTypeFileBase::file_exists($data['title'], $artefact->get('owner'), $data['folder'], $artefact->get('institution'), $artefact->get('group'))) { if ($existingid != $data['artefact']) { if ($collide == 'replace') { log_debug('deleting ' . $existingid); $copy = artefact_instance_from_id($existingid); $copy->delete(); } else { return array('error' => true, 'message' => get_string('fileexists', 'artefact.file')); } } } $artefact->set('title', $data['title']); $artefact->set('description', $data['description']); $artefact->set('allowcomments', (int) $data['allowcomments']); $oldtags = $artefact->get('tags'); $newtags = preg_split("/\s*,\s*/", trim($data['tags'])); $updatetags = $oldtags != $newtags; if ($updatetags) { $artefact->set('tags', $newtags); } if ($form->get_property('group') && $data['permissions']) { $artefact->set('rolepermissions', $data['permissions']); } $artefact->commit(); $returndata = array( 'error' => false, 'message' => get_string('changessaved', 'artefact.file'), 'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $artefact->get('parent')), ); if ($updatetags && $form->submitted_by_js()) { $smarty = smarty_core(); $tagdata = tags_sideblock(); $smarty->assign('sbdata', $tagdata); $returndata['tagblockhtml'] = $smarty->fetch('sideblocks/tags.tpl'); } return $returndata; } function pieform_element_filebrowser_delete(Pieform $form, $element, $artefact) { global $USER; $institution = $form->get_property('institution'); $group = $form->get_property('group'); try { $artefact = artefact_instance_from_id($artefact); } catch (ArtefactNotFoundException $e) { $parentfolder = $element['folder'] ? $element['folder'] : null; $result = array( 'error' => true, 'message' => get_string('deletingfailed', 'artefact.file'), 'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $parentfolder), ); return $result; } if (!$USER->can_edit_artefact($artefact) || $artefact->get('locked')) { return array('error' => true, get_string('nodeletepermission', 'mahara')); } $parentfolder = $artefact->get('parent'); $artefact->delete(); return array( 'error' => false, 'deleted' => true, 'message' => get_string('filethingdeleted', 'artefact.file', get_string($artefact->get('artefacttype'), 'artefact.file') . ' ' . $artefact->get('title')), 'quotaused' => $USER->get('quotaused'), 'quota' => $USER->get('quota'), 'maxuploadsize' => display_size(get_max_upload_size(!$institution && !$group)), 'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $parentfolder), ); } function pieform_element_filebrowser_move(Pieform $form, $element, $data) { global $USER; $artefactid = $data['artefact']; // Artefact being moved $newparentid = $data['newparent']; // Folder to move it to try { $artefact = artefact_instance_from_id($artefactid); } catch (ArtefactNotFoundException $e) { $result = array( 'error' => true, 'message' => get_string('movingfailed', 'artefact.file'), 'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $data['folder']), ); return $result; } if (!$USER->can_edit_artefact($artefact)) { return array('error' => true, 'message' => get_string('movefailednotowner', 'artefact.file')); } if (!in_array($artefact->get('artefacttype'), PluginArtefactFile::get_artefact_types())) { return array('error' => true, 'message' => get_string('movefailednotfileartefact', 'artefact.file')); } if ($newparentid > 0) { if ($newparentid == $artefactid) { return array('error' => true, 'message' => get_string('movefaileddestinationinartefact', 'artefact.file')); } if ($newparentid == $artefact->get('parent')) { return array('error' => false, 'message' => get_string('filealreadyindestination', 'artefact.file')); } try { $newparent = artefact_instance_from_id($newparentid); } catch (ArtefactNotFoundException $e) { $parentfolder = $element['folder'] ? $element['folder'] : null; $result = array( 'error' => true, 'message' => get_string('movingfailed', 'artefact.file'), 'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $data['folder']), ); return $result; } if (!$USER->can_edit_artefact($newparent)) { return array('error' => true, 'message' => get_string('movefailednotowner', 'artefact.file')); } else if ($newparent->get('locked')) { return array('error' => true, 'message' => get_string('cannoteditfoldersubmitted', 'artefact.file')); } $group = $artefact->get('group'); if ($group && $group !== $newparent->get('group')) { return array('error' => true, 'message' => get_string('movefailednotowner', 'artefact.file')); } if ($newparent->get('artefacttype') != 'folder') { return array('error' => true, 'message' => get_string('movefaileddestinationnotfolder', 'artefact.file')); } $nextparentid = $newparent->get('parent'); while (!empty($nextparentid)) { if ($nextparentid != $artefactid) { $ancestor = artefact_instance_from_id($nextparentid); $nextparentid = $ancestor->get('parent'); } else { return array('error' => true, 'message' => get_string('movefaileddestinationinartefact', 'artefact.file')); } } } else { // $newparentid === 0 if ($artefact->get('parent') == null) { return array('error' => false, 'message' => get_string('filealreadyindestination', 'artefact.file')); } $group = $artefact->get('group'); if ($group) { if (!pieform_element_filebrowser_edit_group_folder($group, 0)) { return array('error' => true, 'message' => get_string('movefailednotowner', 'artefact.file')); } } $newparentid = null; } if ($oldparentid = $artefact->get('parent')) { $oldparent = artefact_instance_from_id($oldparentid); if ($oldparent->get('locked')) { return array('error' => true, 'message' => get_string('cannotremovefromsubmittedfolder', 'artefact.file')); } } if ($artefact->move($newparentid)) { return array( 'error' => false, 'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $data['folder']), ); } return array('error' => true, 'message' => get_string('movefailed', 'artefact.file')); } function pieform_element_filebrowser_edit_group_folder($group, $folder) { global $USER; if ($folder) { if (!$folder instanceof ArtefactTypeFolder) { $folder = new ArtefactTypeFolder($folder); } return $USER->can_edit_artefact($folder); } require_once(get_config('libroot') . 'group.php'); // Group root directory: use default grouptype artefact permissions if (!$role = group_user_access($group)) { return false; } $permissions = group_get_default_artefact_permissions($group); return $permissions[$role]->edit; } function pieform_element_filebrowser_changeowner(Pieform $form, $element) { $newtabdata = pieform_element_filebrowser_configure_tabs($element['tabs']); $smarty = smarty_core(); $smarty->assign('prefix', $form->get_name() . '_' . $element['name']); $smarty->assign('querybase', $element['page'] . (strpos($element['page'], '?') === false ? '?' : '&')); $smarty->assign('tabs', $newtabdata); $newtabhtml = $smarty->fetch('artefact:file:form/ownertabs.tpl'); $newsubtabhtml = $smarty->fetch('artefact:file:form/ownersubtabs.tpl'); $group = null; $institution = null; $user = null; $folder = 0; if ($newtabdata['owner'] == 'site') { global $USER; if (!$USER->get('admin')) { $folder = ArtefactTypeFolder::admin_public_folder_id(); } $institution = 'mahara'; } else if ($newtabdata['owner'] == 'institution') { $institution = $newtabdata['ownerid']; } else if ($newtabdata['owner'] == 'group') { $group = $newtabdata['ownerid']; } else if ($newtabdata['owner'] == 'user') { $user = true; } return array( 'error' => false, 'changedowner' => true, 'changedfolder' => true, 'tabupload' => $newtabdata['upload'], 'folder' => $folder, 'disableedit' => $group && !pieform_element_filebrowser_edit_group_folder($group, $folder), 'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $folder, null, $user, $group, $institution), 'newpath' => pieform_element_filebrowser_build_path($form, $element, $folder, $newtabdata['owner'], $newtabdata['ownerid']), 'newtabs' => $newtabhtml, 'newsubtabs' => $newsubtabhtml, ); } function pieform_element_filebrowser_changefolder(Pieform $form, $element, $folder) { $owner = $ownerid = $group = $institution = $user = null; if (isset($element['tabs'])) { if ($owner = param_variable('owner', null)) { if ($owner == 'site') { $owner = 'institution'; $institution = $ownerid = 'mahara'; } else if ($ownerid = param_variable('ownerid', null)) { if ($owner == 'group') { $group = (int) $ownerid; } else if ($owner == 'institution') { $institution = $ownerid; } else if ($owner == 'user') { $user = true; } } } } // If changing to a group folder, check whether the user can edit it if ($g = ($owner ? $group : $form->get_property('group'))) { $editgroupfolder = pieform_element_filebrowser_edit_group_folder($g, $folder); } return array( 'error' => false, 'changedfolder' => true, 'folder' => $folder, 'disableedit' => isset($editgroupfolder) && $editgroupfolder == false, 'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $folder, null, $user, $group, $institution), 'newpath' => pieform_element_filebrowser_build_path($form, $element, $folder, $owner, $ownerid), ); } function pieform_element_filebrowser_views_js(Pieform $form, $element) { global $_PIEFORM_FILEBROWSERS; $formname = $form->get_name(); $prefix = $formname . '_' . $element['name']; return $_PIEFORM_FILEBROWSERS[$prefix]['views_js'] . " {$prefix}.init();"; } /** * When the element exists in a form that's present when the page is * first generated the following function gets called and the js file * below will be inserted into the head data. Unfortunately, when * this element is present in a form that gets called in an ajax * request (currently on the view layout page), the .js file is not * loaded and so it's added explicitly to the smarty() call. */ function pieform_element_filebrowser_get_headdata($element) { global $THEME; $headdata = array(''); $strings = PluginArtefactFile::jsstrings('filebrowser'); $jsstrings = ''; foreach ($strings as $section => $sectionstrings) { foreach ($sectionstrings as $s) { $jsstrings .= "strings.$s=" . json_encode(get_raw_string($s, $section)) . ';'; } } $headdata[] = ''; $pluginsheets = $THEME->get_url('style/style.css', true, 'artefact/file'); foreach (array_reverse($pluginsheets) as $sheet) { $headdata[] = ''; } return $headdata; } function pieform_element_filebrowser_set_attributes($element) {/*{{{*/ $element['needsmultipart'] = true; return $element; }/*}}}*/ ?>