get_property('group');
}
// See if the filebrowser has indicated it's an institution element
if (!empty($element['institution'])) {
$institution = $element['institution'];
}
else {
// otherwise check if the form knows it's in an institution setting
$institution = $form->get_property('institution');
}
$formid = $form->get_name();
$prefix = $formid . '_' . $element['name'];
if (!empty($element['tabs'])) {
$tabdata = pieform_element_filebrowser_configure_tabs($element['tabs'], $prefix);
$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'];
if ($group && !pieform_element_filebrowser_view_group_folder($group, $folder)) {
$folder = null;
}
$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));
}
if ($config['select']) {
$selected = array();
if (function_exists($element['selectlistcallback'])) {
if ($form->is_submitted() && $form->has_errors() && param_exists($prefix . '_selected') && is_array(param_array($prefix . '_selected'))) {
$value = array_keys(param_array($prefix . '_selected'));
}
else if (isset($element['defaultvalue'])) {
$value = $element['defaultvalue'];
}
else {
$value = null;
}
// check to see if attached artefact items in $value array are actually allowed
// to be seen by this user
if (!empty($value)) {
foreach ($value as $k => $v) {
$file = artefact_instance_from_id($v);
if ((!($file instanceof ArtefactTypeFile) && !($file instanceof ArtefactTypeFolder))
|| !$USER->can_view_artefact($file)) {
unset($value[$k]);
}
}
}
$selected = $element['selectlistcallback']($value);
}
foreach ($selected as $k => $v) {
$v->time = '&time=' . time();
}
$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;
}
$licensing = license_form_files($prefix);
$smarty->assign('licenseform', $licensing);
if ($config['resizeonuploaduseroption'] == 1) {
$smarty->assign('resizeonuploadenable', get_config_plugin('artefact', 'file', 'resizeonuploadenable'));
$smarty->assign('resizeonuploadmaxwidth', get_config_plugin('artefact', 'file', 'resizeonuploadmaxwidth'));
$smarty->assign('resizeonuploadmaxheight', get_config_plugin('artefact', 'file', 'resizeonuploadmaxheight'));
}
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);
// Only allow 'Download folder content as zip' link if theres some kind of content (file or subfolder with content)
$addzipdownloadlink = false;
foreach ($filedata as $k => $v) {
if (empty($v->isparent) && ($v->artefacttype != 'folder' || ($v->artefacttype == 'folder' && !empty($v->childcount)))) {
$addzipdownloadlink = true;
}
if ($v->artefacttype == 'image' || $v->artefacttype == 'profileicon') {
$v->icon .= '&time=' . time();
}
}
$smarty->assign('filelist', $filedata);
$smarty->assign('downloadfolderaszip', $addzipdownloadlink);
$configstr = json_encode($config);
$fileliststr = json_encode($filedata);
$smarty->assign('prefix', $prefix);
$accepts = isset($element['accept']) ? 'accept="' . Pieform::hsc($element['accept']) . '"' : '';
$smarty->assign('accepts', $accepts);
$initjs = "{$prefix} = new FileBrowser('{$prefix}', {$folder}, {$configstr}, config);
{$prefix}.filedata = {$fileliststr};";
if ($config['select']) {
$initjs .= "{$prefix}.selecteddata = {$selectedliststr};";
}
if (isset($tabdata)) {
$initjs .= "{$prefix}.tabdata = " . json_encode($tabdata) . ';';
}
$_PIEFORM_FILEBROWSERS[$prefix]['views_js'] = $initjs;
$initjs .= "jQuery({$prefix}.init);";
$initjs .= "upload_max_filesize = '" . get_real_size(ini_get('upload_max_filesize')) . "';";
if ($form->is_submitted() && $form->has_errors()) {
// need to reapply bootstrap file browser stuff
$initjs .= "jQuery('.js-filebrowser').each(function() {";
$initjs .= " jQuery(this).wrapInner('
');";
$initjs .= " jQuery(this).modal('hide');";
$initjs .= "});";
}
$smarty->assign('initjs', $initjs);
$smarty->assign('querybase', $element['page'] . (strpos($element['page'], '?') === false ? '?' : '&'));
$params = 'folder=' . $folder;
if ($group) {
$params .= '&group=' . $group;
}
if ($institution) {
$params .= '&institution=' . $institution;
}
$smarty->assign('folderparams', $params);
// Add mobile media-capture form tags when users are on mobile or tablet
if ($SESSION->get('mobile') || $SESSION->get('tablet')) {
$supportedmediatypes = array('image/*');
if (isset($element['accept'])) {
$accepted = explode(',', $element['accept']);
foreach ($accepted as $type) {
if (in_array($type, $supportedmediatypes)) {
switch ($type) {
case 'image/*':
$smarty->assign('capturedevice', 'camera');
break;
}
}
}
}
}
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) {
$artefact = artefact_instance_from_id($folder);
$folders = ArtefactTypeFileBase::artefactchooser_folder_data($artefact)->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) {
require_once('license.php');
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($institution) && is_null($group) && is_null($user)) {
// See if the filebrowser has indicated it's a group element
if (!empty($element['group'])) {
$group = $element['group'];
}
else {
// otherwise check if the form knows it's in a group setting
$group = $form->get_property('group');
}
// See if the filebrowser has indicated it's an institution element
if (!empty($element['institution'])) {
$institution = $element['institution'];
}
else {
// otherwise check if the form knows it's in an institution setting
$institution = $form->get_property('institution');
}
$userid = ($group || $institution) ? null : $USER->get('id');
}
if ($user || $userid) {
$userid = $USER->get('id');
$smarty->assign('owner', 'user');
$smarty->assign('ownerid', $userid);
}
else if ($institution) {
$smarty->assign('owner', 'institution');
$smarty->assign('ownerid', $institution);
}
else {
$smarty->assign('owner', 'group');
$smarty->assign('ownerid', $group);
}
$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);
// Only allow 'Download folder content as zip' link if theres some kind of content (file or subfolder with content)
$addzipdownloadlink = false;
foreach ($filedata as $k => $v) {
if (empty($v->isparent) && ($v->artefacttype != 'folder' || ($v->artefacttype == 'folder' && !empty($v->childcount)))) {
$addzipdownloadlink = true;
}
if ($v->artefacttype == 'image' || $v->artefacttype == 'profileicon') {
$v->icon .= '&time=' . time();
}
}
$smarty->assign('downloadfolderaszip', $addzipdownloadlink);
$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);
$params = 'folder=' . ($folder === null ? 0 : $folder);
if ($group !== null) {
$params .= '&group=' . $group;
}
if ($institution !== null) {
$params .= '&institution=' . $institution;
}
$smarty->assign('folderparams', $params);
return array(
'data' => $filedata,
'html' => $smarty->fetch('artefact:file:form/filelist.tpl'),
);
}
function pieform_element_filebrowser_configure_tabs($viewowner, $prefix) {
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($prefix . '_owner', 'institution');
$upload = $selectedtab == 'institution';
$tabs['institution'] = get_string('institutionfiles', 'admin');
}
else if ($viewowner['type'] == 'group') {
$selectedtab = param_variable($prefix . '_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($prefix . '_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($prefix . '_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($prefix . '_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' => $viewowner['type'] == 'group' ? $viewowner['id'] : $selectedsubtab,
'upload' => $upload
);
}
function pieform_element_filebrowser_get_value(Pieform $form, $element) {
$prefix = $form->get_name() . '_' . $element['name'];
// Cancel edit a file artefact
// This value only available when the filebrowser was submitted by non-js web browser
$canceledit = param_variable($prefix . '_canceledit', null);
if (!empty($canceledit)) {
redirect($element['page']);
}
// 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 filebrowser actions that must occur before normal 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;
}
/**
* This function handles filebrowser actions, such as uploading files, deleting files, creating folders, etc.
* It piggybacks on the surrounding pieform but bypasses the normal Pieforms validation process.
*
* @param Pieform $form
* @param array $element
* @return mixed
*/
function pieform_element_filebrowser_doupdate(Pieform $form, $element) {
require_once('license.php');
$result = null;
$prefix = $form->get_name() . '_' . $element['name'];
// Since this is executed before normal pieforms validation, we'll redundantly call the validation here
try {
$sesskey = param_variable('sesskey', null);
pieform_validate($form, array('sesskey' => $sesskey));
}
catch (Exception $e) {
return array(
'error' => true,
'message' => $e->getMessage(),
);
}
$delete = param_variable($prefix . '_delete', null);
if (is_array($delete)) {
$keys = array_keys($delete);
return pieform_element_filebrowser_delete($form, $element, (int) ($keys[0]));
}
$resizeonuploaduserenable = param_variable($prefix . '_resizeonuploaduserenable', null);
if (!empty($resizeonuploaduserenable)) {
$resizeimage = 1;
}
else {
$resizeimage = 0;
}
$update = param_variable($prefix . '_update', null);
if (is_array($update)) {
$keys = array_keys($update);
$artefactid = (int) ($keys[0]);
$edit_title = param_variable($prefix . '_edit_title');
$namelength = strlen($edit_title);
if (!$namelength) {
return array(
'edit' => $artefactid,
'error' => true,
'message' => get_string('filenamefieldisrequired1', 'artefact.file')
);
}
else if ($namelength > 1024) {
return array(
'edit' => $artefactid,
'error' => true,
'message' => get_string('nametoolong', 'artefact.file'),
);
}
$data = array(
'artefact' => $artefactid,
'title' => $edit_title,
'description' => param_variable($prefix . '_edit_description'),
'tags' => param_variable($prefix . '_edit_tags', ''),
'folder' => $element['folder'],
'allowcomments' => param_boolean($prefix . '_edit_allowcomments'),
'orientation' => param_variable($prefix . '_edit_orientation'),
);
if (get_config('licensemetadata')) {
$data = array_merge($data, array(
'license' => license_coalesce(null,
param_variable($prefix . '_edit_license'),
param_variable($prefix . '_edit_license_other', null)),
'licensor' => param_variable($prefix . '_edit_licensor'),
'licensorurl' => param_variable($prefix . '_edit_licensorurl'),
));
}
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)) {
if (!isset($data['permissions'][$m[1]])) {
$data['permissions'][$m[1]] = new stdClass();
}
$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,
);
}
else if (is_array($_FILES['userfile']['name'])) {
foreach ($_FILES['userfile']['name'] as $filename) {
if (empty($filename)) {
// TODO, how to specify which file is in error...
return array(
'error' => true,
'message' => get_string('filenamefieldisrequired', 'artefact.file'),
'browse' => 1,
);
}
}
}
}
if (!empty($_FILES['userfile']['name'])) {
if (!is_array($_FILES['userfile']['name'])) {
if (param_exists('_userfile') && is_array(param_array('_userfile'))) {
$userfile = param_array('_userfile');
// renaming file for drag and drop
$_FILES['userfile']['name'] = $userfile['name'];
$_FILES['userfile']['type'] = $userfile['type'];
}
if (strlen($_FILES['userfile']['name']) > 1024) {
http_response_code(403);
return array(
'error' => true,
'message' => get_string('nametoolong', 'artefact.file'),
);
}
else if ($element['config']['uploadagreement'] && !param_boolean($prefix . '_notice', false)) {
http_response_code(403);
return array(
'error' => true,
'message' => get_string('youmustagreetothecopyrightnotice', 'artefact.file'),
'browse' => 1,
);
}
$data = array(
'userfile' => $_FILES['userfile'],
'uploadnumber' => param_integer($prefix . '_uploadnumber'),
'uploadfolder' => $element['folder'] ? $element['folder'] : null,
'uploadfoldername' => param_variable($prefix . '_foldername'),
'resizeonuploaduserenable' => $resizeimage,
);
if (get_config('licensemetadata') && param_variable('dropzone')) {
$data = array_merge($data, array(
'license' => license_coalesce(null,
param_variable($prefix . '_license'),
param_variable($prefix . '_license_other', null)),
'licensor' => param_variable($prefix . '_licensor'),
'licensorurl' => param_variable($prefix . '_licensorurl'),
));
}
else if (get_config('licensemetadata')) {
$data = array_merge($data, array(
'license' => license_coalesce(null,
param_variable($prefix . '_edit_license'),
param_variable($prefix . '_edit_license_other', null)),
'licensor' => param_variable($prefix . '_edit_licensor'),
'licensorurl' => param_variable($prefix . '_edit_licensorurl'),
));
}
$result = pieform_element_filebrowser_upload($form, $element, $data);
// 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;
}
else if (!empty($_FILES['userfile']['name'][0])) {
if ($element['config']['uploadagreement'] && !param_boolean($prefix . '_notice', false)) {
return array(
'error' => true,
'message' => get_string('youmustagreetothecopyrightnotice', 'artefact.file'),
'browse' => 1,
);
}
$result = array('multiuploads' => array());
$size = sizeof($_FILES['userfile']['name']);
for ($i = 0; $i < $size; $i ++) {
if (strlen($_FILES['userfile']['name'][$i]) > 1024) {
return array(
'error' => true,
'message' => get_string('nametoolong', 'artefact.file'),
);
}
$data = array(
'userfile' => $_FILES['userfile'],
'userfileindex' => $i,
'uploadnumber' => param_integer($prefix . '_uploadnumber') - ($size - $i - 1),
'uploadfolder' => $element['folder'] ? $element['folder'] : null,
'uploadfoldername' => param_variable($prefix . '_foldername'),
'resizeonuploaduserenable' => $resizeimage,
);
if (get_config('licensemetadata')) {
$data = array_merge($data, array(
'license' => license_coalesce(null,
param_variable($prefix . '_license'),
param_variable($prefix . '_license_other', null)),
'licensor' => param_variable($prefix . '_licensor'),
'licensorurl' => param_variable($prefix . '_licensorurl'),
));
}
$result['multiuploads'][$i] = pieform_element_filebrowser_upload($form, $element, $data);
// TODO, what to do here...
// If it's a non-js upload, automatically select the newly uploaded file.
$result['multiuploads'][$i]['browse'] = 1;
if (!$form->submitted_by_js() && !$result['multiuploads'][$i]['error'] && !empty($element['config']['select'])) {
if (isset($element['selectcallback']) && is_callable($element['selectcallback'])) {
$element['selectcallback']($result['multiuploads'][$i]['highlight']);
}
else {
$result['multiuploads'][$i]['select'] = $result['multiuploads'][$i]['highlight'];
}
}
$result['multiuploads'][$i]['folder'] = $element['folder'];
}
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 = !empty($element['institution']) ? $element['institution'] : $form->get_property('institution');
$group = !empty($element['group']) ? $element['group'] : $form->get_property('group');
if (get_config('licensemetadata')) {
$license = $data['license'];
$licensor = $data['licensor'];
$licensorurl = $data['licensorurl'];
}
$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'];
$userfileindex = isset($data['userfileindex']) ? $data['userfileindex'] : null;
$resizeonuploadenable = get_config_plugin('artefact', 'file', 'resizeonuploadenable');
$resizeonuploaduseroption = get_config_plugin('artefact', 'file', 'resizeonuploaduseroption');
$resizeonuploaduserenable = (int) $data['resizeonuploaduserenable'];
$result = array('error' => false, 'uploadnumber' => $uploadnumber);
if ($parentfolder == 0) {
$parentfolder = null;
}
$data = new stdClass();
$data->parent = $parentfolder;
$data->owner = $data->group = $data->institution = null;
if (get_config('licensemetadata')) {
$data->license = $license;
$data->licensor = $licensor;
$data->licensorurl= $licensorurl;
}
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 (!group_within_edit_window($group)) {
return array('error' => true, 'message' => get_string('cannoteditfolder', 'artefact.file'));
}
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;
if (isset($userfileindex)) {
$originalname = $_FILES['userfile']['name'][$userfileindex];
}
else {
$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);
// Overwrite image file with resized version if required
$resized = false;
$resizeattempted = false;
// resize specified if (resizing is enabled AND user has enabled resizing) OR (resizing is enabled AND user is not given an option to enable/disable)
if (($resizeonuploadenable && $resizeonuploaduserenable) || ($resizeonuploadenable && !$resizeonuploaduseroption)) {
require_once('file.php');
require_once('imageresizer.php');
$file = $_FILES['userfile'];
if (isset($userfileindex)) {
$tmpname = $file['tmp_name'][$userfileindex];
}
else {
$tmpname = $file['tmp_name'];
}
if (is_image_file($tmpname)) {
$imageinfo = getimagesize($tmpname);
$mimetype = $imageinfo['mime'];
$width = $imageinfo[0];
$height = $imageinfo[1];
$bmptypes = array('image/bmp', 'image/x-bmp', 'image/ms-bmp', 'image/x-ms-bmp');
// resize image if necessary
$resizeonuploadmaxwidth = get_config_plugin('artefact', 'file', 'resizeonuploadmaxwidth');
$resizeonuploadmaxheight = get_config_plugin('artefact', 'file', 'resizeonuploadmaxheight');
// Don't support bmps for now
if (($width > $resizeonuploadmaxwidth || $height > $resizeonuploadmaxheight) && !in_array($mimetype, $bmptypes)) {
$resizeattempted = true;
$imgrs = new ImageResizer($tmpname, $mimetype);
$img = $imgrs->get_image();
if (!empty($img)) {
$imgrs->resize_image(array('w' => $resizeonuploadmaxwidth, 'h' => $resizeonuploadmaxheight), $mimetype); //auto
$saveresize = $imgrs->save_image($tmpname, $mimetype, 85);
if (!$saveresize) {
return array('error' => true, 'message' => get_string('problemresizing', 'artefact.file'));
}
$resized = true;
}
}
}
}
try {
$newid = ArtefactTypeFile::save_uploaded_file('userfile', $data, $userfileindex, $resized);
}
catch (QuotaExceededException $e) {
prepare_upload_failed_message($result, $e, $parentfoldername, $originalname);
// update the file listing
if (defined('GROUP')) {
$group = group_current_group();
$result['quota'] = $group->quota;
$result['quotaused'] = $group->quotaused;
}
else {
$result['quota'] = $USER->get('quota');
$result['quotaused'] = $USER->get('quotaused');
}
$result['newlist'] = pieform_element_filebrowser_build_filelist($form, $element, $parentfolder, null, $data->owner, $data->group, $data->institution);
return $result;
}
catch (UploadException $e) {
prepare_upload_failed_message($result, $e, $parentfoldername, $originalname);
if (defined('GROUP')) {
$group = group_current_group();
$result['quota'] = $group->quota;
$result['quotaused'] = $group->quotaused;
}
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);
}
if ($resizeattempted && !$resized) {
$result['message'] .= get_string('insufficientmemoryforresize', 'artefact.file');
}
$result['highlight'] = $newid;
$artefact = artefact_instance_from_id($newid);
$result['artefacttype'] = $artefact->get('artefacttype');
$result['uploaded'] = true;
$result['newlist'] = pieform_element_filebrowser_build_filelist($form, $element, $parentfolder, $newid, $data->owner, $data->group, $data->institution);
if (defined('GROUP')) {
$group = group_current_group(false);
$result['quota'] = $group->quota;
$result['quotaused'] = $group->quotaused;
}
else {
$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 = !empty($element['institution']) ? $element['institution'] : $form->get_property('institution');
$group = !empty($element['group']) ? $element['group'] : $form->get_property('group');
$result = array();
$data = (object) array(
'parent' => $parentfolder,
'owner' => null,
'title' => trim($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'));
}
}
$data->owner = $data->group = $data->institution = null;
if ($institution) {
$data->institution = $institution;
}
else if ($group) {
if (!group_within_edit_window($group)) {
return array('error' => true, 'message' => get_string('cannoteditfolder', 'artefact.file'));
}
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'), $data->owner, $data->group, $data->institution),
'foldercreated' => true,
);
}
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', trim($data['title']));
$artefact->set('description', $data['description']);
$artefact->set('allowcomments', (int) $data['allowcomments']);
if (property_exists($artefact, 'orientation')) {
$orientation = is_mysql() ? (string) $data['orientation'] : (int) $data['orientation'];
$artefact->set('orientation', $orientation);
}
$oldtags = $artefact->get('tags');
$newtags = $data['tags'];
$updatetags = $oldtags != $newtags;
if ($updatetags) {
$artefact->set('tags', $newtags);
}
if (get_config('licensemetadata')) {
foreach (array('license', 'licensor', 'licensorurl') as $licensef) {
if ($data[$licensef] !== null) {
$data[$licensef] = trim($data[$licensef]);
if ($artefact->get($licensef) !== $data[$licensef]) {
$artefact->set($licensef, $data[$licensef]);
}
}
}
}
if ($form->get_property('group') && $data['permissions']) {
$artefact->set('rolepermissions', $data['permissions']);
}
$artefact->commit();
$prefix = $form->get_name() . '_' . $element['name'];
$newtabdata = (isset($element['tabs']) ? pieform_element_filebrowser_configure_tabs($element['tabs'], $prefix) : null);
$group = null;
$institution = null;
$user = null;
if (!empty($element['tabs'])) {
$newtabdata = pieform_element_filebrowser_configure_tabs($element['tabs'], $prefix);
if ($newtabdata['owner'] == 'site') {
$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;
}
}
$returndata = array(
'error' => false,
'message' => get_string('changessaved', 'artefact.file'),
'folder' => $artefact->get('parent'),
'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $artefact->get('parent'), null, $user, $group, $institution),
);
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)) {
return array('error' => true, 'message' => get_string('nodeletepermission', 'mahara'));
}
if (!$artefact->can_be_deleted()) {
return array('error' => true, 'message' => get_string('cantbedeleted', 'mahara'));
}
$parentfolder = $artefact->get('parent');
// Remove the skin background and update the skin thumbs
require_once(get_config('libroot') . 'skin.php');
Skin::remove_background($artefact->get('id'));
$artefact->delete();
$result = array(
'error' => false,
'deleted' => true,
'artefacttype' => $artefact->get('artefacttype'),
'message' => get_string('filethingdeleted', 'artefact.file',
get_string($artefact->get('artefacttype'), 'artefact.file') . ' ' . $artefact->get('title')),
'maxuploadsize' => display_size(get_max_upload_size(!$institution && !$group)),
'newlist' => pieform_element_filebrowser_build_filelist($form, $element, $parentfolder),
);
if (defined('GROUP')) {
$group = group_current_group();
$result['quota'] = $group->quota;
$result['quotaused'] = $group->quotaused;
}
else {
$result['quota'] = $USER->get('quota');
$result['quotaused'] = $USER->get('quotaused');
}
return $result;
}
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_view_group_folder($group, $folder) {
global $USER;
if ($folder) {
if (!$folder instanceof ArtefactTypeFolder) {
$folder = new ArtefactTypeFolder($folder);
}
return $USER->can_view_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]->view;
}
function pieform_element_filebrowser_changeowner(Pieform $form, $element) {
$prefix = $form->get_name() . '_' . $element['name'];
$newtabdata = pieform_element_filebrowser_configure_tabs($element['tabs'], $prefix);
$smarty = smarty_core();
$smarty->assign('prefix', $prefix);
$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;
$userid = 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;
$userid = $newtabdata['ownerid'];
}
return array(
'error' => false,
'changedowner' => true,
'changedfolder' => true,
'editmeta' => (int) ($user && !$element['config']['edit'] && !empty($element['config']['tag'])),
'newtabdata' => $newtabdata,
'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;
$prefix = $form->get_name() . '_' . $element['name'];
if (isset($element['tabs'])) {
if ($owner = param_variable($prefix . '_owner', null)) {
if ($owner == 'site') {
$owner = 'institution';
$institution = $ownerid = 'mahara';
}
else if ($ownerid = param_variable($prefix . '_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'))) {
if (!pieform_element_filebrowser_view_group_folder($g, $folder)) {
return array(
'error' => true,
'message' => get_string('cannotviewfolder', 'artefact.file'),
);
}
$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;
// TODO : need a better dependancy injection, jquery ui might be also inserted by other scripts ...
$headdata = array('',
'');
if ($element['config']['upload']) {
// only add dropzone if filebrowser is allowed to upload
$headdata[] = '';
$headdata[] = '';
$headdata[] = '';
}
if ($element['config']['edit']) {
// Add switchbox css if filebrowser is allowed to edit
require_once(get_config('docroot') . 'lib/form/elements/switchbox.php');
$headdata[] = join(' ', pieform_element_switchbox_get_headdata($element));
}
$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;
}/*}}}*/