array('type' => 'color', 'value' => '#530E53'),
'backgroundfg' => array('type' => 'color', 'value' => '#FFFFFF'),
'link' => array('type' => 'color', 'value' => '#255ECC'),
'headings' => array('type' => 'color', 'value' => '#530E53'),
'navbg' => array('type' => 'color', 'value' => '#8A458A'),
'navfg' => array('type' => 'color', 'value' => '#FFFFFF'),
);
if (!$USER->get('admin')) {
// Institutional admins with only 1 institution go straight to the edit page for that institution
// They cannot add or delete institutions, or edit an institution they don't administer
$add = false;
$delete = false;
if (!empty($institution) && !$USER->is_institutional_admin($institution)) {
$institution = '';
$edit = false;
}
if (empty($institution) && count($USER->get('admininstitutions')) == 1) {
redirect(get_config('wwwroot') . 'admin/users/institutions.php?i='
. key($USER->get('admininstitutions')));
}
}
if ($institution || $add) {
$authinstances = auth_get_auth_instances_for_institution($institution);
if (false == $authinstances) {
$authinstances = array();
}
if ($delete) {
function delete_validate(Pieform $form, $values) {
// Ensure the institution has no members left
if ($members = get_field('usr_institution', 'COUNT(*)', 'institution', $values['i'])) {
$form->set_error('submit', get_string('institutionstillhas', 'admin', get_string('nmembers', 'group', $members)));
}
// If some users are still using one of this institution's authinstances, it's okay if
// we can find a default authinstance for those users, otherwise it's an error.
if ($authinstanceids = get_column('auth_instance', 'id', 'institution', $values['i'])) {
$badusers = count_records_select(
'usr',
'authinstance IN (' . join(',', array_fill(0, count($authinstanceids), '?')) . ')',
$authinstanceids
);
if ($badusers) {
$defaultauth = record_exists('auth_instance', 'institution', 'mahara', 'authname', 'internal');
if ($values['i'] == 'mahara' || !$defaultauth) {
$form->set_error(
'submit',
get_string('institutionauthinuseby', 'admin', get_string('nusers', 'mahara', $badusers))
);
}
}
}
}
function delete_cancel_submit() {
redirect('/admin/users/institutions.php');
}
function delete_submit(Pieform $form, $values) {
global $SESSION;
$authinstanceids = get_column('auth_instance', 'id', 'institution', $values['i']);
$collectionids = get_column('collection', 'id', 'institution', $values['i']);
$viewids = get_column('view', 'id', 'institution', $values['i']);
$artefactids = get_column('artefact', 'id', 'institution', $values['i']);
$regdataids = get_column('institution_registration', 'id', 'institution', $values['i']);
db_begin();
if ($collectionids) {
require_once(get_config('libroot') . 'collection.php');
foreach ($collectionids as $collectionid) {
$collection = new Collection($collectionid);
$collection->delete();
}
}
if ($viewids) {
require_once(get_config('libroot') . 'view.php');
foreach ($viewids as $viewid) {
$view = new View($viewid);
$view->delete();
}
}
if ($artefactids) {
foreach ($artefactids as $artefactid) {
try {
$a = artefact_instance_from_id($artefactid);
$a->delete();
}
catch (ArtefactNotFoundException $e) {
// Awesome, it's already gone.
}
}
}
// If any users are still using this institution's authinstances, change them now.
if ($authinstanceids) {
execute_sql("
UPDATE {usr}
SET authinstance = (
SELECT MIN(id) FROM {auth_instance} WHERE institution = 'mahara' AND authname = 'internal'
)
WHERE authinstance IN (" . join(',', array_fill(0, count($authinstanceids), '?')) . ')',
$authinstanceids
);
}
foreach ($authinstanceids as $id) {
delete_records('auth_instance_config', 'instance', $id);
}
foreach ($regdataids as $id) {
delete_records('institution_registration_data', 'registration_id', $id);
}
// The institution should have been removed from favourites lists when the members were removed,
// but make sure it's gone.
execute_sql('DELETE FROM {favorite_usr} WHERE favorite IN (SELECT id FROM {favorite} WHERE institution = ?)', array($values['i']));
delete_records('favorite', 'institution', $values['i']);
execute_sql("UPDATE {group} SET institution = NULL, shortname = NULL WHERE institution = ?", array($values['i']));
delete_records('auth_instance', 'institution', $values['i']);
delete_records('host', 'institution', $values['i']);
delete_records('institution_locked_profile_field', 'name', $values['i']);
delete_records('usr_institution_request', 'institution', $values['i']);
delete_records('view_access', 'institution', $values['i']);
delete_records('institution_data', 'institution', $values['i']);
delete_records('institution_registration', 'institution', $values['i']);
delete_records('site_content', 'institution', $values['i']);
delete_records('institution_config', 'institution', $values['i']);
delete_records('usr_custom_layout', 'institution', $values['i']);
delete_records('usr_registration', 'institution', $values['i']);
delete_records('institution', 'name', $values['i']);
db_commit();
$SESSION->add_ok_msg(get_string('institutiondeletedsuccessfully', 'admin'));
redirect('/admin/users/institutions.php');
}
$form = array(
'name' => 'delete',
'elements' => array(
'i' => array(
'type' => 'hidden',
'value' => $institution
),
'delete' => array(
'type' => 'hidden',
'value' => 1
),
'submit' => array(
'type' => 'submitcancel',
'class' => 'btn-default',
'value' => array(get_string('yes'), get_string('no'))
)
)
);
$deleteform = pieform($form);
$smarty = smarty();
$smarty->assign('delete_form', $deleteform);
$smarty->assign('institutionname', get_field('institution', 'displayname', 'name', $institution));
$smarty->display('admin/users/institutions.tpl');
exit;
}
$instancearray = array();
$instancestring = '';
$c = count($authinstances);
$inuse = '';
$sitelockedfields = (array) get_column('institution_locked_profile_field', 'profilefield', 'name', 'mahara');
if (!$add) {
$data = get_record('institution', 'name', $institution);
$data->commentsortorder = get_config_institution($institution, 'commentsortorder');
$data->commentthreaded = get_config_institution($institution, 'commentthreaded');
$lockedprofilefields = (array) get_column('institution_locked_profile_field', 'profilefield', 'name', $institution);
// TODO: Find a better way to work around Smarty's minimal looping logic
if (!empty($authinstances)) {
foreach($authinstances as $key => $val) {
$authinstances[$key]->index = $key;
$authinstances[$key]->total = $c;
$instancearray[] = (int)$val->id;
}
$instancestring = implode(',',$instancearray);
$inuserecords = array();
if ($records = get_records_sql_assoc('select authinstance, count(id) from {usr} where authinstance in ('.$instancestring.') group by authinstance', array())) {
foreach ($records as $record) {
$inuserecords[] = $record->authinstance;
}
}
$inuse = implode(',',$inuserecords);
}
$authtypes = auth_get_available_auth_types($institution);
}
else {
$data = new StdClass;
$data->displayname = '';
$data->expiry = null;
if (!get_config('usersuniquebyusername')) {
$data->registerallowed = 0;
$data->registerconfirm = 1;
}
$data->theme = 'sitedefault';
$data->defaultmembershipperiod = null;
$data->showonlineusers = 2;
$data->allowinstitutionpublicviews = get_config('allowpublicviews') ? 1 : 0;
$data->licensemandatory = 0;
$data->licensedefault = '';
$data->dropdownmenu = get_config('dropdownmenu') ? 1 : 0;
$data->skins = get_config('skins') ? 1 : 0;
$data->commentsortorder = 'earliest';
$data->commentthreaded = false;
$lockedprofilefields = array();
$authtypes = auth_get_available_auth_types();
}
$themeoptions = get_institution_themes($institution);
$themeoptions['sitedefault'] = '- ' . get_string('sitedefault', 'admin') . ' (' . $themeoptions[get_config('theme')] . ') -';
uksort($themeoptions, 'theme_sort');
if (validate_theme($data->theme, $institution) === false) {
$data->theme = 'sitedefault';
}
$showonlineusersoptions = array('0' => get_string('none'), '1' => get_string('institutiononly', 'admin'), '2' => get_string('all', 'admin'));
$sitename = get_config('sitename');
safe_require('artefact', 'internal');
$elements = array(
'add' => array(
'type' => 'hidden',
'value' => true,
'ignore' => !$add
),
'inuse' => array(
'type' => 'hidden',
'value' => $inuse,
'id' => 'inuse',
'ignore' => $add
),
'i' => array(
'type' => 'hidden',
'value' => $institution,
'ignore' => $add
),
'displayname' => array(
'type' => 'text',
'title' => get_string('institutionname', 'admin'),
'defaultvalue' => $data->displayname,
'rules' => array(
'required' => true,
'maxlength' => 255
),
'help' => true,
),
);
if ($USER->get('admin') && $institution != 'mahara') {
$elements['expiry'] = array(
'type' => 'date',
'title' => get_string('institutionexpiry', 'admin'),
'description' => get_string('institutionexpirydescription', 'admin', hsc($sitename)),
'defaultvalue' => is_null($data->expiry) ? null : strtotime($data->expiry),
'help' => true,
'minyear' => date('Y') - 2,
'maxyear' => date('Y') + 10,
);
}
if ($USER->get('admin')) {
$elements['authplugin'] = array(
'type' => 'authlist',
'title' => get_string('authplugin', 'admin'),
'options' => $authinstances,
'authtypes' => $authtypes,
'instancearray' => $instancearray,
'instancestring' => $instancestring,
'institution' => $institution,
'help' => true,
'ignore' => count($authtypes) == 0 || $institution == ''
);
}
if (!$add && empty($authinstances)) {
if ($USER->get('admin')) {
$SESSION->add_error_msg(get_string('adminnoauthpluginforinstitution', 'admin'));
}
else {
$SESSION->add_error_msg(get_string('noauthpluginforinstitution', 'admin'));
}
}
if (!get_config('usersuniquebyusername')) {
$elements['registerallowed'] = array(
'type' => 'switchbox',
'title' => get_string('registrationallowed', 'admin'),
'description' => get_string('registrationalloweddescription4', 'admin'),
'defaultvalue' => $data->registerallowed,
'help' => true,
);
$elements['registerconfirm'] = array(
'type' => 'switchbox',
'title' => get_string('registrationconfirm', 'admin'),
'description' => get_string('registrationconfirmdescription2', 'admin'),
'disabled' => get_config('requireregistrationconfirm') == true,
'defaultvalue' => $data->registerconfirm,
);
}
// Some fields to hide from the default institution config screen
if (empty($data->name) || $data->name != 'mahara') {
$elements['defaultmembershipperiod'] = array(
'type' => 'expiry',
'title' => get_string('defaultmembershipperiod', 'admin'),
'description' => get_string('defaultmembershipperioddescription', 'admin'),
'defaultvalue' => $data->defaultmembershipperiod,
'help' => true,
);
$languages = get_languages();
// Get the default language. If the institution has one stored, use that. Otherwise, use 'sitedefault'
$defaultlang = false;
if (!empty($data->name)) {
$defaultlang = get_config_institution($data->name, 'lang');
}
// If the defaultlang they provided is no longer valid, use "site default"
if (!$defaultlang || !array_key_exists($defaultlang, $languages)) {
$defaultlang = 'sitedefault';
}
$elements['lang'] = array(
'type' => 'select',
'defaultvalue' => $defaultlang,
'title' => get_string('institutionlanguage', 'admin'),
'description' => get_string('institutionlanguagedescription', 'admin'),
'options' => array_merge(array('sitedefault' => get_string('sitedefault', 'admin') . ' (' . $languages[get_config('lang')] . ')'), $languages),
'ignore' => (count($languages) < 2),
);
}
$elements['logo'] = array(
'type' => 'file',
'title' => get_string('Logo', 'admin'),
'description' => get_string('logodescription', 'admin'),
'maxfilesize' => get_max_upload_size(false),
);
if (!empty($data->logo)) {
$logourl = get_config('wwwroot') . 'thumb.php?type=logobyid&id=' . $data->logo;
$elements['logohtml'] = array(
'type' => 'html',
'value' => '
',
);
$elements['deletelogo'] = array(
'type' => 'switchbox',
'title' => get_string('deletelogo', 'admin'),
'description' => get_string('deletelogodescription1', 'admin'),
);
}
if (empty($data->name) || $data->name != 'mahara') {
if (!empty($data->style)) {
$customtheme = get_records_menu('style_property', 'style', $data->style, '', 'field,value');
}
$elements['theme'] = array(
'type' => 'select',
'title' => get_string('theme'),
'description' => get_string('sitethemedescription','admin'),
'defaultvalue' => $data->theme ? $data->theme : 'sitedefault',
'collapseifoneoption' => true,
'options' => $themeoptions,
'help' => true,
);
$elements['customthemefs'] = array(
'type' => 'fieldset',
'class' => 'customtheme' . ($elements['theme']['defaultvalue'] != 'custom' ? ' js-hidden' : ''),
'legend' => get_string('customtheme', 'admin'),
'elements' => array(),
);
foreach ($customthemedefaults as $name => $styledata) {
$elements['customthemefs']['elements'][$name] = array(
'type' => $styledata['type'],
'title' => get_string('customtheme.' . $name, 'admin'),
'defaultvalue' => isset($customtheme[$name]) ? $customtheme[$name] : $styledata['value'],
);
}
$elements['customthemefs']['elements']['resetcustom'] = array(
'type' => 'switchbox',
'class' => 'nojs-hidden-inline',
'title' => get_string('resetcolours', 'admin'),
'description' => get_string('resetcoloursdesc1', 'admin'),
);
$elements['dropdownmenu'] = array(
'type' => 'switchbox',
'title' => get_string('dropdownmenu', 'admin'),
'description' => get_string('dropdownmenudescriptioninstitution1','admin'),
'defaultvalue' => $data->dropdownmenu,
'help' => true,
);
}
// The skins checkbox should be shown for the default institution
if (get_config('skins')) {
$elements['skins'] = array(
'type' => 'switchbox',
'title' => get_string('skins', 'admin'),
'description' => get_string('skinsinstitutiondescription1', 'admin'),
'defaultvalue' => $data->skins,
);
}
$elements['commentsortorder'] = array(
'type' => 'select',
'title' => get_string('commentsortorder', 'admin'),
'description' => get_string('commentsortorderdescription', 'admin'),
'defaultvalue' => $data->commentsortorder,
'options' => array('earliest' => get_string('earliest'),
'latest' => get_string('latest'),
),
'help' => true,
);
$elements['commentthreaded'] = array(
'type' => 'switchbox',
'title' => get_string('commentthreaded', 'admin'),
'description' => get_string('commentthreadeddescription', 'admin'),
'defaultvalue' => $data->commentthreaded,
);
// Some more fields that are hidden from the default institution
if (empty($data->name) || $data->name != 'mahara') {
$elements['showonlineusers'] = array(
'type' => 'select',
'disabled' => get_config('showonlineuserssideblock') ? '' : 'disabled',
'title' => get_string('showonlineusers', 'admin'),
'description' => get_string('showonlineusersdescription','admin'),
'defaultvalue' => $data->showonlineusers,
'collapseifoneoption' => true,
'options' => $showonlineusersoptions,
);
if (get_config('licensemetadata')) {
$elements['licensemandatory'] = array(
'type' => 'switchbox',
'title' => get_string('licensemandatory', 'admin'),
'description' => get_string('licensemandatorydescription','admin'),
'defaultvalue' => $data->licensemandatory,
);
$elements['licensedefault'] = license_form_el_basic(null, true);
$elements['licensedefault']['title'] = get_string('licensedefault','admin');
$elements['licensedefault']['description'] = get_string('licensedefaultdescription','admin');
if ($data->licensedefault) {
$elements['licensedefault']['defaultvalue'] = $data->licensedefault;
}
}
if ($USER->get('admin') || get_config_plugin('artefact', 'file', 'institutionaloverride')) {
$elements['defaultquota'] = array(
'type' => 'bytes',
'title' => get_string('defaultquota', 'artefact.file'),
'description' => get_string('defaultinstitutionquotadescription', 'admin'),
'defaultvalue' => !empty($data->defaultquota) ? $data->defaultquota : get_config_plugin('artefact', 'file', 'defaultquota'),
);
$elements['updateuserquotas'] = array(
'type' => 'switchbox',
'title' => get_string('updateuserquotas', 'artefact.file'),
'description' => get_string('updateinstitutionuserquotasdesc1', 'admin'),
);
}
else {
$elements['defaultquota'] = array(
'type' => 'text',
'title' => get_string('defaultquota', 'artefact.file'),
'value' => display_size(!empty($data->defaultquota) ? $data->defaultquota : get_config_plugin('artefact', 'file', 'defaultquota')),
'disabled' => true,
);
}
$elements['allowinstitutionpublicviews'] = array(
'type' => 'switchbox',
'title' => get_string('allowinstitutionpublicviews', 'admin'),
'description' => get_string('allowinstitutionpublicviewsdescription1','admin'),
'defaultvalue' => get_config('allowpublicviews') && $data->allowinstitutionpublicviews,
'disabled' => get_config('allowpublicviews') == false,
'help' => true,
);
if ($USER->get('admin')) {
$elements['maxuseraccounts'] = array(
'type' => 'text',
'title' => get_string('maxuseraccounts','admin'),
'description' => get_string('maxuseraccountsdescription','admin'),
'defaultvalue' => empty($data->maxuseraccounts) ? '' : $data->maxuseraccounts,
'rules' => array(
'regex' => '/^\d*$/',
'maxlength' => 8,
),
'size' => 5,
);
}
}
$elements['lockedfields'] = array(
'type' => 'fieldset',
'class' => 'last with-formgroup',
'legend' => get_string('Lockedfields', 'admin'),
'collapsible' => true,
'collapsed' => true,
'elements' => array(),
);
if ($institution != 'mahara') {
$elements['lockedfields']['elements']['description'] = array(
'type' => 'html',
'value' => get_string('disabledlockedfieldhelp1', 'admin', get_field('institution', 'displayname', 'name', 'mahara')),
);
}
foreach (ArtefactTypeProfile::get_all_fields() as $field => $type) {
$elements['lockedfields']['elements'][$field] = array(
'type' => 'switchbox',
'title' => get_string($field, 'artefact.internal'),
'defaultvalue' => in_array($field, $lockedprofilefields) || ($institution != 'mahara' && in_array($field, $sitelockedfields)),
'disabled' => $institution != 'mahara' && in_array($field, $sitelockedfields)
);
}
// Check for active plugins institution settings.
$elements['pluginsfields'] = array(
'type' => 'fieldset',
'legend' => get_string('pluginsfields', 'admin'),
'collapsible' => true,
'collapsed' => true,
'elements' => array(),
);
// Get plugins institution settings.
$instobj = null;
if (!$add && $institution != '') {
$instobj = new Institution();
$instobj->findByName($institution);
}
$elements['pluginsfields']['elements'] = array_merge($elements['pluginsfields']['elements'],
plugin_institution_prefs_form_elements($instobj));
// Remove plugin fieldset if no fields.
if (empty($elements['pluginsfields']['elements'])) {
unset($elements['pluginsfields']);
}
$elements['submit'] = array(
'type' => 'submitcancel',
'class' => 'btn-primary',
'value' => array(get_string('submit'), get_string('cancel'))
);
$institutionform = pieform(array(
'name' => 'institution',
'renderer' => 'div',
'plugintype' => 'core',
'pluginname' => 'admin',
'elements' => $elements
));
}
else {
// Get a list of institutions
require_once(get_config('libroot') . 'institution.php');
if (!$USER->get('admin')) { // Filter the list for institutional admins
$filter = $USER->get('admininstitutions');
$showdefault = false;
}
else {
$filter = false;
$showdefault = true;
}
$data = build_institutions_html($filter, $showdefault, $query, $limit, $offset, $count);
$smarty = smarty(array('lib/pieforms/static/core/pieforms.js', 'paginator'));
setpageicon($smarty, 'icon-university');
$smarty->assign('results', $data);
$smarty->assign('countinstitutions', $count);
/*search institution form*/
$searchform = pieform(array(
'name' => 'search',
'renderer' => 'div',
'class' => 'form-inline with-heading',
'autofocus' => false,
'elements' => array(
'inputgroup' => array(
'type' => 'fieldset',
'title' => get_string('Query') . ': ',
'class' => 'input-group form-inline',
'elements' => array(
'query' => array(
'type' => 'text',
'defaultvalue' => $query,
'hiddenlabel' => true,
'value' => get_string('search'),
'class' => 'emptyonfocus',
'title' => get_string('search'),
),
'submit' => array(
'type' => 'button',
'usebuttontag' => true,
'class' => 'btn-primary input-group-btn',
'value' => get_string('search'),
)
),
),
),
));
$smarty->assign('searchform', $searchform);
$js = <<< EOF
addLoadEvent(function () {
p = {$data['pagination_js']}
connect('search_submit', 'onclick', function (event) {
replaceChildNodes('messages');
var params = {'query': $('search_query').value};
p.sendQuery(params);
event.stop();
});
});
EOF;
$smarty->assign('INLINEJAVASCRIPT', $js);
$smarty->assign('siteadmin', $USER->get('admin'));
$smarty->assign('PAGEHEADING', get_string('admininstitutions', 'admin'));
$smarty->display('admin/users/institutions.tpl');
exit;
}
function institution_validate(Pieform $form, $values) {
global $USER, $institution, $add;
if ($USER->get('admin') || get_config_plugin('artefact', 'file', 'institutionaloverride')) {
if (get_config_plugin('artefact', 'file', 'maxquotaenabled') && get_config_plugin('artefact', 'file', 'maxquota') < $values['defaultquota']) {
$form->set_error('defaultquota', get_string('maxquotatoolow', 'artefact.file'));
}
}
if (get_config('licensemetadata') && !empty($values['licensemandatory']) &&
(isset($values['licensedefault']) && $values['licensedefault'] == '')) {
$form->set_error('licensedefault', get_string('licensedefaultmandatory', 'admin'));
}
// Check uploaded logo
if (!empty($values['logo'])) {
require_once('file.php');
require_once('uploadmanager.php');
$um = new upload_manager('logo');
if ($error = $um->preprocess_file()) {
$form->set_error('logo', $error);
return false;
}
$imageinfo = getimagesize($values['logo']['tmp_name']);
if (!$imageinfo || !is_image_type($imageinfo[2])) {
$form->set_error('logo', get_string('filenotimage'));
return false;
}
// Check the file isn't greater than the max allowable size
$width = $imageinfo[0];
$height = $imageinfo[1];
$imagemaxwidth = get_config('imagemaxwidth');
$imagemaxheight = get_config('imagemaxheight');
if ($width > $imagemaxwidth || $height > $imagemaxheight) {
$form->set_error('logo', get_string('profileiconimagetoobig', 'artefact.file', $width, $height, $imagemaxwidth, $imagemaxheight));
}
}
if (!empty($values['lang']) && $values['lang'] != 'sitedefault' && !array_key_exists($values['lang'], get_languages())) {
$form->set_error('lang', get_string('institutionlanginvalid', 'admin'));
}
// Validate plugins settings.
plugin_institution_prefs_validate($form, $values);
}
function institution_submit(Pieform $form, $values) {
global $SESSION, $institution, $add, $instancearray, $USER, $authinstances, $customthemedefaults;
db_begin();
// Update the basic institution record...
if ($add) {
$institution = generate_institution_name($values['displayname']);
$newinstitution = new Institution();
$newinstitution->initialise($institution, $values['displayname']);
$institution = $newinstitution->name;
}
else {
$newinstitution = new Institution($institution);
$newinstitution->displayname = $values['displayname'];
$oldinstitution = get_record('institution', 'name', $institution);
// Clear out any cached menus for this institution
clear_menu_cache($institution);
}
$newinstitution->showonlineusers = !isset($values['showonlineusers']) ? 2 : $values['showonlineusers'];
if (get_config('usersuniquebyusername')) {
// Registering absolutely not allowed when this setting is on, it's a
// security risk. See the documentation for the usersuniquebyusername
// setting for more information
$newinstitution->registerallowed = 0;
}
else {
$newinstitution->registerallowed = ($values['registerallowed']) ? 1 : 0;
$newinstitution->registerconfirm = ($values['registerconfirm']) ? 1 : 0;
}
if (!empty($values['lang'])) {
if ($values['lang'] == 'sitedefault') {
$newinstitution->lang = null;
}
else {
$newinstitution->lang = $values['lang'];
}
}
$newinstitution->theme = (empty($values['theme']) || $values['theme'] == 'sitedefault') ? null : $values['theme'];
$newinstitution->dropdownmenu = (!empty($values['dropdownmenu'])) ? 1 : 0;
$newinstitution->skins = (!empty($values['skins'])) ? 1 : 0;
require_once(get_config('docroot') . 'artefact/comment/lib.php');
$commentoptions = ArtefactTypeComment::get_comment_options();
$newinstitution->commentsortorder = (empty($values['commentsortorder'])) ? $commentoptions->sort : $values['commentsortorder'];
$newinstitution->commentthreaded = (!empty($values['commentthreaded'])) ? 1 : 0;
if ($newinstitution->theme == 'custom') {
if (!empty($oldinstitution->style)) {
$styleid = $oldinstitution->style;
delete_records('style_property', 'style', $styleid);
}
else {
$record = (object) array('title' => get_string('customstylesforinstitution', 'admin', $newinstitution->displayname));
$styleid = insert_record('style', $record, 'id', true);
}
$properties = array();
$record = (object) array('style' => $styleid);
foreach (array_keys($customthemedefaults) as $name) {
$record->field = $name;
$record->value = $values[$name];
insert_record('style_property', $record);
$properties[$name] = $values[$name];
}
// Cache the css
$smarty = smarty_core();
$smarty->assign('data', $properties);
set_field('style', 'css', $smarty->fetch('customcss.tpl'), 'id', $styleid);
$newinstitution->style = $styleid;
}
else {
$newinstitution->style = null;
}
if (get_config('licensemetadata')) {
$newinstitution->licensemandatory = (!empty($values['licensemandatory'])) ? 1 : 0;
$newinstitution->licensedefault = (isset($values['licensedefault'])) ? $values['licensedefault'] : '';
}
if (!empty($values['resetcustom']) && !empty($oldinstitution->style)) {
$newinstitution->style = null;
}
if ($USER->get('admin') || get_config_plugin('artefact', 'file', 'institutionaloverride')) {
if (!empty($values['updateuserquotas']) && !empty($values['defaultquota'])) {
execute_sql(
"UPDATE {usr} SET quota = ? WHERE id IN (SELECT usr FROM {usr_institution} WHERE institution = ?)",
array($values['defaultquota'], $institution)
);
// get all the users from the institution and make sure that they are still below
// their quota threshold
if ($users = get_records_sql_array('SELECT * FROM {usr} u LEFT JOIN {usr_institution} ui ON u.id = ui.usr AND ui.institution = ?', array($institution))) {
$quotanotifylimit = get_config_plugin('artefact', 'file', 'quotanotifylimit');
if ($quotanotifylimit <= 0 || $quotanotifylimit >= 100) {
$quotanotifylimit = 100;
}
foreach ($users as $user) {
$user->quota = $values['defaultquota'];
// check if the user has gone over the quota notify limit
$user->quotausedpercent = $user->quotaused / $user->quota * 100;
$overlimit = false;
if ($quotanotifylimit <= $user->quotausedpercent) {
$overlimit = true;
}
$notified = get_field('usr_account_preference', 'value', 'field', 'quota_exceeded_notified', 'usr', $user->id);
if ($overlimit && '1' !== $notified) {
require_once(get_config('docroot') . 'artefact/file/lib.php');
ArtefactTypeFile::notify_users_threshold_exceeded(array($user), false);
// no need to email admin as we can alert them right now
$SESSION->add_error_msg(get_string('useroverquotathreshold', 'artefact.file', display_name($user)));
}
else if ($notified && !$overlimit) {
set_account_preference($user->id, 'quota_exceeded_notified', false);
}
}
}
}
$newinstitution->defaultquota = empty($values['defaultquota']) ? get_config_plugin('artefact', 'file', 'defaultquota') : $values['defaultquota'];
}
if ($institution != 'mahara') {
$newinstitution->defaultmembershipperiod = ($values['defaultmembershipperiod']) ? intval($values['defaultmembershipperiod']) : null;
if ($USER->get('admin')) {
$newinstitution->maxuseraccounts = ($values['maxuseraccounts']) ? intval($values['maxuseraccounts']) : null;
$newinstitution->expiry = db_format_timestamp($values['expiry']);
}
}
$newinstitution->allowinstitutionpublicviews = (isset($values['allowinstitutionpublicviews']) && $values['allowinstitutionpublicviews']) ? 1 : 0;
// TODO: Move handling of authentication instances within the Institution class as well?
if (!empty($values['authplugin'])) {
$allinstances = array_merge($values['authplugin']['instancearray'], $values['authplugin']['deletearray']);
if (array_diff($allinstances, $instancearray)) {
throw new ConfigException('Attempt to delete or update another institution\'s auth instance');
}
if (array_diff($instancearray, $allinstances)) {
throw new ConfigException('One of your instances is unaccounted for in this transaction');
}
foreach($values['authplugin']['instancearray'] as $priority => $instanceid) {
if (in_array($instanceid, $values['authplugin']['deletearray'])) {
// Should never happen:
throw new SystemException('Attempt to update AND delete an auth instance');
}
$record = new StdClass;
$record->priority = $priority;
$record->id = $instanceid;
update_record('auth_instance', $record, array('id' => $instanceid));
}
foreach($values['authplugin']['deletearray'] as $instanceid) {
// If this authinstance is the only xmlrpc authinstance that references a host, delete the host record.
$hostwwwroot = null;
foreach ($authinstances as $ai) {
if ($ai->id == $instanceid && $ai->authname == 'xmlrpc') {
$hostwwwroot = get_field_sql("SELECT \"value\" FROM {auth_instance_config} WHERE \"instance\" = ? AND field = 'wwwroot'", array($instanceid));
if ($hostwwwroot && count_records_select('auth_instance_config', "field = 'wwwroot' AND \"value\" = ?", array($hostwwwroot)) == 1) {
// Unfortunately, it's possible that this host record could belong to a different institution,
// so specify the institution here.
delete_records('host', 'wwwroot', $hostwwwroot, 'institution', $institution);
// We really need to fix this, either by removing the institution from the host table, or refusing to allow the
// institution to be changed in the host record when another institution's authinstance is still pointing at it.
}
break;
}
}
delete_records('auth_remote_user', 'authinstance', $instanceid);
delete_records('auth_instance_config', 'instance', $instanceid);
delete_records('auth_instance', 'id', $instanceid);
// Make it no longer be the parent authority to any auth instances
delete_records('auth_instance_config', 'field', 'parent', 'value', $instanceid);
}
}
// Store plugin settings.
plugin_institution_prefs_submit($form, $values, $newinstitution);
// Save the changes to the DB
$newinstitution->commit();
if ($add) {
// Automatically create an internal authentication authinstance
$authinstance = (object)array(
'instancename' => 'internal',
'priority' => 0,
'institution' => $newinstitution->name,
'authname' => 'internal',
);
insert_record('auth_instance', $authinstance);
// We need to add the default lines to the site_content table for this institution
// We also need to set the institution to be using default static pages to begin with
// so that using custom institution pages is an opt-in situation
$pages = site_content_pages();
$now = db_format_timestamp(time());
foreach ($pages as $name) {
$page = new stdClass();
$page->name = $name;
$page->ctime = $now;
$page->mtime = $now;
$page->content = get_string($page->name . 'defaultcontent', 'install', get_string('staticpageconfiginstitution', 'install'));
$page->institution = $newinstitution->name;
insert_record('site_content', $page);
$institutionconfig = new stdClass();
$institutionconfig->institution = $newinstitution->name;
$institutionconfig->field = 'sitepages_' . $name;
$institutionconfig->value = 'mahara';
insert_record('institution_config', $institutionconfig);
}
}
if (is_null($newinstitution->style) && !empty($oldinstitution->style)) {
delete_records('style_property', 'style', $oldinstitution->style);
delete_records('style', 'id', $oldinstitution->style);
}
// Set the logo after updating the institution, because the institution
// needs to exist before it can own the logo artefact.
if (!empty($values['logo'])) {
safe_require('artefact', 'file');
// Entry in artefact table
$data = (object) array(
'institution' => $institution,
'title' => 'logo',
'description' => 'Institution logo',
'note' => $values['logo']['name'],
'size' => $values['logo']['size'],
);
$imageinfo = getimagesize($values['logo']['tmp_name']);
$data->width = $imageinfo[0];
$data->height = $imageinfo[1];
$data->filetype = $imageinfo['mime'];
$artefact = new ArtefactTypeProfileIcon(0, $data);
if (preg_match("/\.([^\.]+)$/", $values['logo']['name'], $saved)) {
$artefact->set('oldextension', $saved[1]);
}
$artefact->commit();
$id = $artefact->get('id');
// Move the file into the correct place.
$directory = get_config('dataroot') . 'artefact/file/profileicons/originals/' . ($id % 256) . '/';
check_dir_exists($directory);
move_uploaded_file($values['logo']['tmp_name'], $directory . $id);
// Delete the old logo
if (!empty($oldinstitution->logo)) {
$oldlogo = new ArtefactTypeProfileIcon($oldinstitution->logo);
$oldlogo->delete();
}
set_field('institution', 'logo', $id, 'name', $institution);
}
if (!empty($values['deletelogo'])) {
execute_sql("UPDATE {institution} SET logo = NULL WHERE name = ?", array($institution));
}
delete_records('institution_locked_profile_field', 'name', $institution);
foreach (ArtefactTypeProfile::get_all_fields() as $field => $type) {
if ($values[$field]) {
$profilefield = new StdClass;
$profilefield->name = $institution;
$profilefield->profilefield = $field;
insert_record('institution_locked_profile_field', $profilefield);
}
}
db_commit();
if ($add) {
if (!$newinstitution->registerallowed) {
// If registration is not allowed, then an authinstance will not
// have been created, and thus cause the institution page to add
// its own error message on the next page load
$SESSION->add_ok_msg(get_string('institutionaddedsuccessfully2', 'admin'));
}
$nexturl = '/admin/users/institutions.php?i='.urlencode($institution);
}
else {
$message = get_string('institutionupdatedsuccessfully', 'admin');
if (isset($values['theme'])) {
$changedtheme = $oldinstitution->theme != $values['theme']
&& (!empty($oldinstitution->theme) || $values['theme'] != 'sitedefault');
if ($changedtheme || $values['theme'] == 'custom') {
$message .= ' ' . get_string('usersseenewthemeonlogin', 'admin');
}
$USER->reset_institutions();
}
$SESSION->add_ok_msg($message);
$nexturl = '/admin/users/institutions.php';
}
redirect($nexturl);
}
function institution_cancel_submit() {
redirect('/admin/users/institutions.php');
}
if ($institution && $institution != 'mahara') {
$_institution = get_record('institution', 'name', $institution);
$suspended = $_institution->suspended;
if ($USER->get('admin')) {
function institution_suspend_submit(Pieform $form, $values) {
global $SESSION, $USER;
if (!$USER->get('admin')) {
$SESSION->add_error_msg(get_string('errorwhilesuspending', 'admin'));
}
else {
// Need to logout any users that are using this institution's authinstance.
if ($loggedin = get_records_sql_array("SELECT ui.usr FROM {usr_institution} ui
JOIN {usr} u ON u.id = ui.usr
JOIN {auth_instance} ai ON ai.id = u.authinstance
JOIN {usr_session} us ON us.usr = u.id
WHERE ui.institution = ?
AND ai.institution = ?", array($values['i'], $values['i']))) {
foreach ($loggedin as $user) {
$loggedinarray[] = $user->usr;
}
delete_records_sql("DELETE FROM {usr_session} WHERE usr IN (" . join(',', $loggedinarray) . ")");
$SESSION->add_ok_msg(get_string('institutionlogoutusers', 'admin', count($loggedin)));
}
set_field('institution', 'suspended', 1, 'name', $values['i']);
$SESSION->add_ok_msg(get_string('institutionsuspended', 'admin'));
}
redirect('/admin/users/institutions.php?i=' . $values['i']);
}
function institution_unsuspend_submit(Pieform $form, $values) {
global $SESSION, $USER;
if (!$USER->get('admin')) {
$SESSION->add_error_msg(get_string('errorwhileunsuspending', 'admin'));
}
else {
set_field('institution', 'suspended', 0, 'name', $values['i']);
$SESSION->add_ok_msg(get_string('institutionunsuspended', 'admin'));
}
redirect('/admin/users/institutions.php?i=' . $values['i']);
}
// Suspension controls
if (empty($suspended)) {
$suspendformdef = array(
'name' => 'institution_suspend',
'plugintype' => 'core',
'renderer' => 'div',
'class' => 'form-as-button last',
'pluginname' => 'admin',
'elements' => array(
'i' => array(
'type' => 'hidden',
'value' => $institution,
),
'submit' => array(
'type' => 'button',
'usebuttontag' => true,
'class' => 'btn-default',
'value' => '' . get_string('suspendinstitution','admin'),
),
)
);
$suspendform = pieform($suspendformdef);
}
else {
$suspendformdef = array(
'name' => 'institution_unsuspend',
'plugintype' => 'core',
'renderer' => 'div',
'pluginname' => 'admin',
'elements' => array(
'i' => array(
'type' => 'hidden',
'value' => $institution,
),
'submit' => array(
'type' => 'button',
'usebuttontag' => true,
'class' => 'btn-default',
'value' => '' . get_string('unsuspendinstitution','admin'),
'description' => get_string('unsuspendinstitutiondescription','admin'),
),
)
);
$suspendform = pieform($suspendformdef);
// Create a second forms for unsuspension to go in the suspend message.
// This keeps the HTML IDs unique
$suspendformdef['name'] = 'institution_unsuspend_top';
$suspendformdef['renderer'] = 'oneline';
$suspendformdef['successcallback'] = 'institution_unsuspend_submit';
$suspendform_top = pieform($suspendformdef);
}
}
}
function search_submit(Pieform $form, $values) {
redirect('/admin/users/institutions.php' . ((isset($values['query']) && ($values['query'] != '')) ? '?query=' . urlencode($values['query']) : ''));
}
// Hide/disable options based on theme selected
$themeoptionsjs = '
jQuery(function($) {
if ($("#institution_theme").val() === "custom") {
$(".customtheme").removeClass("js-hidden");
}
$("#institution_theme").change(function() {
if ($(this).val() === "custom") {
$(".customtheme").removeClass("js-hidden");
}
else {
$(".customtheme").addClass("js-hidden");
}
});
});
';
$smarty = smarty();
setpageicon($smarty, 'icon-university');
$smarty->assign('INLINEJAVASCRIPT', $themeoptionsjs);
$smarty->assign('institution_form', $institutionform);
$smarty->assign('instancestring', $instancestring);
$smarty->assign('add', $add);
if (isset($suspended)) {
if ($suspended) {
$smarty->assign('suspended', get_string('suspendedinstitutionmessage', 'admin'));
}
if (isset($suspendform)) {
$smarty->assign('suspendform', $suspendform);
if (isset($suspendform_top)) {
$smarty->assign('suspendform_top', $suspendform_top);
}
}
}
$smarty->assign('PAGEHEADING', get_string('admininstitutions', 'admin'));
$smarty->assign('subsectionheading', get_field('institution', 'displayname', 'name', $institution));
$smarty->display('admin/users/institutions.tpl');
function theme_sort($a, $b) {
if ($a == 'sitedefault') {
return -1;
}
if ($b == 'sitedefault') {
return 1;
}
return $a > $b;
}