2009-05-22 02:05:46 +00:00
< ? php
2009-06-30 15:19:12 +00:00
// This file is part of Moodle - http://moodle.org/
//
2009-05-22 02:05:46 +00:00
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
2009-06-30 15:19:12 +00:00
//
2009-05-22 02:05:46 +00:00
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
2004-09-26 05:10:38 +00:00
/**
2009-06-30 15:19:12 +00:00
* Functions and classes used during installation , upgrades and for admin settings .
2009-05-22 02:05:46 +00:00
*
2009-06-30 15:19:12 +00:00
* ADMIN SETTINGS TREE INTRODUCTION
2009-05-22 02:05:46 +00:00
*
* This file performs the following tasks :
* - it defines the necessary objects and interfaces to build the Moodle
* admin hierarchy
2010-03-31 08:05:53 +00:00
* - it defines the admin_externalpage_setup ()
2009-05-22 02:05:46 +00:00
*
* ADMIN_SETTING OBJECTS
*
* Moodle settings are represented by objects that inherit from the admin_setting
* class . These objects encapsulate how to read a setting , how to write a new value
* to a setting , and how to appropriately display the HTML to modify the setting .
*
* ADMIN_SETTINGPAGE OBJECTS
*
* The admin_setting objects are then grouped into admin_settingpages . The latter
* appear in the Moodle admin tree block . All interaction with admin_settingpage
* objects is handled by the admin / settings . php file .
*
* ADMIN_EXTERNALPAGE OBJECTS
*
* There are some settings in Moodle that are too complex to ( efficiently ) handle
* with admin_settingpages . ( Consider , for example , user management and displaying
* lists of users . ) In this case , we use the admin_externalpage object . This object
* places a link to an external PHP file in the admin tree block .
*
* If you ' re using an admin_externalpage object for some settings , you can take
* advantage of the admin_externalpage_ * functions . For example , suppose you wanted
* to add a foo . php file into admin . First off , you add the following line to
* admin / settings / first . php ( at the end of the file ) or to some other file in
* admin / settings :
* < code >
* $ADMIN -> add ( 'userinterface' , new admin_externalpage ( 'foo' , get_string ( 'foo' ),
* $CFG -> wwwdir . '/' . '$CFG->admin . ' / foo . php ', ' some_role_permission ' ));
* </ code >
*
* Next , in foo . php , your file structure would resemble the following :
* < code >
* require_once ( '.../config.php' );
* require_once ( $CFG -> libdir . '/adminlib.php' );
* admin_externalpage_setup ( 'foo' );
* // functionality like processing form submissions goes here
2010-03-07 09:28:54 +00:00
* $OUTPUT -> header ();
2009-05-22 02:05:46 +00:00
* // your HTML goes here
2010-03-07 09:28:54 +00:00
* $OUTPUT -> footer ();
2009-05-22 02:05:46 +00:00
* </ code >
*
* The admin_externalpage_setup () function call ensures the user is logged in ,
* and makes sure that they have the proper role permission to access the page .
2010-03-07 09:28:54 +00:00
* It also configures all $PAGE properties needed for navigation .
2009-05-22 02:05:46 +00:00
*
* ADMIN_CATEGORY OBJECTS
*
* Above and beyond all this , we have admin_category objects . These objects
* appear as folders in the admin tree block . They contain admin_settingpage ' s ,
* admin_externalpage 's, and other admin_category' s .
*
* OTHER NOTES
*
* admin_settingpage 's, admin_externalpage' s , and admin_category ' s all inherit
* from part_of_admin_tree ( a pseudointerface ) . This interface insists that
* a class has a check_access method for access permissions , a locate method
* used to find a specific node in the admin tree and find parent path .
*
* admin_category ' s inherit from parentable_part_of_admin_tree . This pseudo -
* interface ensures that the class implements a recursive add function which
* accepts a part_of_admin_tree object and searches for the proper place to
* put it . parentable_part_of_admin_tree implies part_of_admin_tree .
*
* Please note that the $this -> name field of any part_of_admin_tree must be
* UNIQUE throughout the ENTIRE admin tree .
*
* The $this -> name field of an admin_setting object ( which is * not * part_of_
* admin_tree ) must be unique on the respective admin_settingpage where it is
* used .
*
2009-06-30 15:19:12 +00:00
* Original author : Vincenzo K . Marcovecchio
* Maintainer : Petr Skoda
2009-05-22 02:05:46 +00:00
*
* @ package moodlecore
* @ copyright 1999 onwards Martin Dougiamas http :// dougiamas . com
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2004-09-26 05:10:38 +00:00
*/
2008-08-30 18:47:22 +00:00
/// Add libraries
require_once ( $CFG -> libdir . '/ddllib.php' );
2008-06-15 10:32:50 +00:00
require_once ( $CFG -> libdir . '/xmlize.php' );
2008-08-21 15:29:42 +00:00
define ( 'INSECURE_DATAROOT_WARNING' , 1 );
define ( 'INSECURE_DATAROOT_ERROR' , 2 );
2009-06-30 15:19:12 +00:00
2009-08-31 15:23:02 +00:00
/**
* Automatically clean - up all plugin data and remove the plugin DB tables
*
* @ param string $type The plugin type , eg . 'mod' , 'qtype' , 'workshopgrading' etc .
* @ param string $name The plugin name , eg . 'forum' , 'multichoice' , 'accumulative' etc .
* @ uses global $OUTPUT to produce notices and other messages
* @ return void
*/
function uninstall_plugin ( $type , $name ) {
global $CFG , $DB , $OUTPUT ;
2010-04-04 19:58:03 +00:00
// recursively uninstall all module subplugins first
if ( $type === 'mod' ) {
if ( file_exists ( " $CFG->dirroot / $name /db/subplugins.php " )) {
$subplugins = array ();
include ( " $moddir /db/subplugins.php " );
foreach ( $subplugins as $subplugintype => $dir ) {
$instances = get_plugin_list ( $subplugintype );
foreach ( $instances as $subpluginname => $notusedpluginpath ) {
uninstall_plugin ( $subplugintype , $subpluginname );
}
2009-08-31 15:23:02 +00:00
}
}
2010-04-04 19:58:03 +00:00
2009-08-31 15:23:02 +00:00
}
2009-09-01 09:26:43 +00:00
$component = $type . '_' . $name ; // eg. 'qtype_multichoice' or 'workshopgrading_accumulative' or 'mod_forum'
if ( $type === 'mod' ) {
$pluginname = $name ; // eg. 'forum'
$strpluginname = get_string ( 'modulename' , $pluginname );
} else {
2009-09-09 07:55:03 +00:00
$pluginname = $component ;
$strpluginname = get_string ( 'pluginname' , $pluginname ); // replaces string 'modulename'
2009-09-01 09:26:43 +00:00
}
2009-08-31 15:23:02 +00:00
echo $OUTPUT -> heading ( $pluginname );
$plugindirectory = get_plugin_directory ( $type , $name );
$uninstalllib = $plugindirectory . '/db/uninstall.php' ;
if ( file_exists ( $uninstalllib )) {
require_once ( $uninstalllib );
2009-09-01 09:26:43 +00:00
$uninstallfunction = 'xmldb_' . $pluginname . '_uninstall' ; // eg. 'xmldb_workshop_uninstall()'
2009-08-31 15:23:02 +00:00
if ( function_exists ( $uninstallfunction )) {
2009-09-01 09:26:43 +00:00
if ( ! $uninstallfunction ()) {
2009-08-31 15:23:02 +00:00
echo $OUTPUT -> notification ( 'Encountered a problem running uninstall function for ' . $pluginname );
}
}
}
if ( 'mod' === $type ) {
2009-09-09 07:55:03 +00:00
// perform cleanup tasks specific for activity modules
2009-08-31 15:23:02 +00:00
if ( ! $module = $DB -> get_record ( 'modules' , array ( 'name' => $name ))) {
print_error ( 'moduledoesnotexist' , 'error' );
}
// delete all the relevant instances from all course sections
if ( $coursemods = $DB -> get_records ( 'course_modules' , array ( 'module' => $module -> id ))) {
foreach ( $coursemods as $coursemod ) {
if ( ! delete_mod_from_section ( $coursemod -> id , $coursemod -> section )) {
echo $OUTPUT -> notification ( " Could not delete the $strpluginname with id = $coursemod->id from section $coursemod->section " );
}
}
}
// clear course.modinfo for courses that used this module
$sql = " UPDATE { course}
SET modinfo = ''
WHERE id IN ( SELECT DISTINCT course
FROM { course_modules }
WHERE module = ? ) " ;
$DB -> execute ( $sql , array ( $module -> id ));
// delete all the course module records
2009-09-01 09:26:43 +00:00
$DB -> delete_records ( 'course_modules' , array ( 'module' => $module -> id ));
2009-08-31 15:23:02 +00:00
// delete module contexts
if ( $coursemods ) {
foreach ( $coursemods as $coursemod ) {
if ( ! delete_context ( CONTEXT_MODULE , $coursemod -> id )) {
echo $OUTPUT -> notification ( " Could not delete the context for $strpluginname with id = $coursemod->id " );
}
}
}
// delete the module entry itself
2009-09-01 09:26:43 +00:00
$DB -> delete_records ( 'modules' , array ( 'name' => $module -> name ));
2009-08-31 15:23:02 +00:00
// cleanup the gradebook
require_once ( $CFG -> libdir . '/gradelib.php' );
grade_uninstalled_module ( $module -> name );
// Perform any custom uninstall tasks
if ( file_exists ( $CFG -> dirroot . '/mod/' . $module -> name . '/lib.php' )) {
require_once ( $CFG -> dirroot . '/mod/' . $module -> name . '/lib.php' );
$uninstallfunction = $module -> name . '_uninstall' ;
if ( function_exists ( $uninstallfunction )) {
debugging ( " { $uninstallfunction } () has been deprecated. Use the plugin's db/uninstall.php instead " , DEBUG_DEVELOPER );
2009-09-01 09:26:43 +00:00
if ( ! $uninstallfunction ()) {
2009-08-31 15:23:02 +00:00
echo $OUTPUT -> notification ( 'Encountered a problem running uninstall function for ' . $module -> name . '!' );
}
}
}
}
// perform clean-up taks common for all the plugin/subplugin types
// delete calendar events
2009-09-01 09:26:43 +00:00
$DB -> delete_records ( 'event' , array ( 'modulename' => $pluginname ));
2009-08-31 15:23:02 +00:00
// delete all the logs
2009-09-01 09:26:43 +00:00
$DB -> delete_records ( 'log' , array ( 'module' => $pluginname ));
2009-08-31 15:23:02 +00:00
// delete log_display information
2009-09-01 09:26:43 +00:00
$DB -> delete_records ( 'log_display' , array ( 'module' => $pluginname ));
2009-08-31 15:23:02 +00:00
// delete the module configuration records
2009-09-01 09:26:43 +00:00
unset_all_config_for_plugin ( $pluginname );
2009-08-31 15:23:02 +00:00
// delete the plugin tables
$xmldbfilepath = $plugindirectory . '/db/install.xml' ;
drop_plugin_tables ( $pluginname , $xmldbfilepath , false );
// delete the capabilities that were defined by this module
capabilities_cleanup ( $component );
// remove entent handlers and dequeue pending events
events_uninstall ( $component );
echo $OUTPUT -> notification ( get_string ( 'success' ), 'notifysuccess' );
}
2008-06-15 10:32:50 +00:00
/**
* Delete all plugin tables
2009-05-22 02:05:46 +00:00
*
* @ param string $name Name of plugin , used as table prefix
* @ param string $file Path to install . xml file
* @ param bool $feedback defaults to true
2009-06-30 15:19:12 +00:00
* @ return bool Always returns true
2008-06-15 10:32:50 +00:00
*/
function drop_plugin_tables ( $name , $file , $feedback = true ) {
global $CFG , $DB ;
// first try normal delete
2008-08-26 06:54:43 +00:00
if ( file_exists ( $file ) and $DB -> get_manager () -> delete_tables_from_xmldb_file ( $file )) {
2008-06-15 10:32:50 +00:00
return true ;
}
// then try to find all tables that start with name and are not in any xml file
$used_tables = get_used_table_names ();
$tables = $DB -> get_tables ();
/// Iterate over, fixing id fields as necessary
foreach ( $tables as $table ) {
if ( in_array ( $table , $used_tables )) {
continue ;
}
2008-08-26 06:54:43 +00:00
if ( strpos ( $table , $name ) !== 0 ) {
continue ;
}
2008-06-15 10:32:50 +00:00
// found orphan table --> delete it
if ( $DB -> get_manager () -> table_exists ( $table )) {
$xmldb_table = new xmldb_table ( $table );
2008-06-22 16:51:55 +00:00
$DB -> get_manager () -> drop_table ( $xmldb_table );
2008-06-15 10:32:50 +00:00
}
}
return true ;
}
/**
* Returns names of all known tables == tables that moodle knowns about .
2009-05-22 02:05:46 +00:00
*
* @ return array Array of lowercase table names
2008-06-15 10:32:50 +00:00
*/
function get_used_table_names () {
$table_names = array ();
$dbdirs = get_db_directories ();
foreach ( $dbdirs as $dbdir ) {
$file = $dbdir . '/install.xml' ;
$xmldb_file = new xmldb_file ( $file );
if ( ! $xmldb_file -> fileExists ()) {
continue ;
}
$loaded = $xmldb_file -> loadXMLStructure ();
2009-01-11 16:42:19 +00:00
$structure = $xmldb_file -> getStructure ();
2008-06-15 10:32:50 +00:00
if ( $loaded and $tables = $structure -> getTables ()) {
foreach ( $tables as $table ) {
$table_names [] = strtolower ( $table -> name );
}
}
}
return $table_names ;
}
/**
* Returns list of all directories where we expect install . xml files
2009-05-22 02:05:46 +00:00
* @ return array Array of paths
2008-06-15 10:32:50 +00:00
*/
function get_db_directories () {
global $CFG ;
$dbdirs = array ();
2009-09-09 07:55:03 +00:00
/// First, the main one (lib/db)
2008-06-15 10:32:50 +00:00
$dbdirs [] = $CFG -> libdir . '/db' ;
2009-09-09 07:55:03 +00:00
/// Then, all the ones defined by get_plugin_types()
2009-06-19 14:25:56 +00:00
$plugintypes = get_plugin_types ();
foreach ( $plugintypes as $plugintype => $pluginbasedir ) {
if ( $plugins = get_plugin_list ( $plugintype )) {
foreach ( $plugins as $plugin => $plugindir ) {
$dbdirs [] = $plugindir . '/db' ;
2009-05-30 15:33:21 +00:00
}
2008-08-30 11:25:29 +00:00
}
2008-06-20 09:11:08 +00:00
}
2008-06-15 10:32:50 +00:00
return $dbdirs ;
}
2006-09-20 21:00:45 +00:00
/**
2008-02-16 18:33:50 +00:00
* Try to obtain or release the cron lock .
* @ param string $name name of lock
* @ param int $until timestamp when this lock considered stale , null means remove lock unconditionaly
2009-05-22 02:05:46 +00:00
* @ param bool $ignorecurrent ignore current lock state , usually entend previous lock , defaults to false
2008-02-16 18:33:50 +00:00
* @ return bool true if lock obtained
2005-09-01 04:14:31 +00:00
*/
2008-02-16 18:33:50 +00:00
function set_cron_lock ( $name , $until , $ignorecurrent = false ) {
2008-05-15 21:40:00 +00:00
global $DB ;
2005-09-01 04:14:31 +00:00
if ( empty ( $name )) {
2008-02-16 18:33:50 +00:00
debugging ( " Tried to get a cron lock for a null fieldname " );
2005-09-01 04:14:31 +00:00
return false ;
}
2008-02-16 18:33:50 +00:00
// remove lock by force == remove from config table
if ( is_null ( $until )) {
set_config ( $name , null );
2005-09-01 04:14:31 +00:00
return true ;
}
2008-02-16 18:33:50 +00:00
if ( ! $ignorecurrent ) {
2009-09-09 07:55:03 +00:00
// read value from db - other processes might have changed it
2008-05-15 21:40:00 +00:00
$value = $DB -> get_field ( 'config' , 'value' , array ( 'name' => $name ));
2008-02-16 18:33:50 +00:00
if ( $value and $value > time ()) {
2009-09-09 07:55:03 +00:00
//lock active
2008-02-16 18:33:50 +00:00
return false ;
2005-09-01 04:14:31 +00:00
}
}
2008-02-16 18:33:50 +00:00
set_config ( $name , $until );
2005-09-01 04:14:31 +00:00
return true ;
}
2006-01-27 02:54:51 +00:00
2008-08-21 15:29:42 +00:00
/**
* Test if and critical warnings are present
* @ return bool
*/
function admin_critical_warnings_present () {
global $SESSION ;
if ( ! has_capability ( 'moodle/site:config' , get_context_instance ( CONTEXT_SYSTEM ))) {
return 0 ;
}
if ( ! isset ( $SESSION -> admin_critical_warning )) {
$SESSION -> admin_critical_warning = 0 ;
2009-02-01 13:37:42 +00:00
if ( is_dataroot_insecure ( true ) === INSECURE_DATAROOT_ERROR ) {
2008-08-21 15:29:42 +00:00
$SESSION -> admin_critical_warning = 1 ;
}
}
return $SESSION -> admin_critical_warning ;
}
2009-01-13 09:04:09 +00:00
/**
2009-05-22 02:05:46 +00:00
* Detects if float supports at least 10 decimal digits
*
* Detects if float supports at least 10 deciman digits
2009-01-13 09:04:09 +00:00
* and also if float --> string conversion works as expected .
2009-05-22 02:05:46 +00:00
*
2009-01-13 09:04:09 +00:00
* @ return bool true if problem found
*/
function is_float_problem () {
$num1 = 2009010200.01 ;
$num2 = 2009010200.02 ;
return (( string ) $num1 === ( string ) $num2 or $num1 === $num2 or $num2 <= ( string ) $num1 );
}
2006-08-28 20:11:24 +00:00
/**
* Try to verify that dataroot is not accessible from web .
*
2009-05-22 02:05:46 +00:00
* Try to verify that dataroot is not accessible from web .
* It is not 100 % correct but might help to reduce number of vulnerable sites .
2006-08-28 20:11:24 +00:00
* Protection from httpd . conf and . htaccess is not detected properly .
2009-06-30 15:19:12 +00:00
*
2009-05-22 02:05:46 +00:00
* @ uses INSECURE_DATAROOT_WARNING
* @ uses INSECURE_DATAROOT_ERROR
* @ param bool $fetchtest try to test public access by fetching file , default false
2008-08-21 15:29:42 +00:00
* @ return mixed empty means secure , INSECURE_DATAROOT_ERROR found a critical problem , INSECURE_DATAROOT_WARNING migth be problematic
2006-08-28 20:11:24 +00:00
*/
2008-08-21 15:29:42 +00:00
function is_dataroot_insecure ( $fetchtest = false ) {
2006-08-28 20:11:24 +00:00
global $CFG ;
$siteroot = str_replace ( '\\' , '/' , strrev ( $CFG -> dirroot . '/' )); // win32 backslash workaround
$rp = preg_replace ( '|https?://[^/]+|i' , '' , $CFG -> wwwroot , 1 );
$rp = strrev ( trim ( $rp , '/' ));
$rp = explode ( '/' , $rp );
foreach ( $rp as $r ) {
if ( strpos ( $siteroot , '/' . $r . '/' ) === 0 ) {
$siteroot = substr ( $siteroot , strlen ( $r ) + 1 ); // moodle web in subdirectory
} else {
break ; // probably alias root
}
}
$siteroot = strrev ( $siteroot );
$dataroot = str_replace ( '\\' , '/' , $CFG -> dataroot . '/' );
2008-08-21 15:29:42 +00:00
if ( strpos ( $dataroot , $siteroot ) !== 0 ) {
return false ;
}
if ( ! $fetchtest ) {
return INSECURE_DATAROOT_WARNING ;
}
// now try all methods to fetch a test file using http protocol
$httpdocroot = str_replace ( '\\' , '/' , strrev ( $CFG -> dirroot . '/' ));
preg_match ( '|(https?://[^/]+)|i' , $CFG -> wwwroot , $matches );
$httpdocroot = $matches [ 1 ];
$datarooturl = $httpdocroot . '/' . substr ( $dataroot , strlen ( $siteroot ));
if ( make_upload_directory ( 'diag' , false ) === false ) {
return INSECURE_DATAROOT_WARNING ;
}
$testfile = $CFG -> dataroot . '/diag/public.txt' ;
if ( ! file_exists ( $testfile )) {
file_put_contents ( $testfile , 'test file, do not delete' );
}
$teststr = trim ( file_get_contents ( $testfile ));
if ( empty ( $teststr )) {
2009-09-09 07:55:03 +00:00
// hmm, strange
2008-08-21 15:29:42 +00:00
return INSECURE_DATAROOT_WARNING ;
}
$testurl = $datarooturl . '/diag/public.txt' ;
2009-01-09 02:10:56 +00:00
if ( extension_loaded ( 'curl' ) and
! ( stripos ( ini_get ( 'disable_functions' ), 'curl_init' ) !== FALSE ) and
! ( stripos ( ini_get ( 'disable_functions' ), 'curl_setop' ) !== FALSE ) and
( $ch = @ curl_init ( $testurl )) !== false ) {
2008-08-21 15:29:42 +00:00
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $ch , CURLOPT_HEADER , false );
$data = curl_exec ( $ch );
if ( ! curl_errno ( $ch )) {
$data = trim ( $data );
if ( $data === $teststr ) {
curl_close ( $ch );
return INSECURE_DATAROOT_ERROR ;
}
}
curl_close ( $ch );
}
if ( $data = @ file_get_contents ( $testurl )) {
$data = trim ( $data );
if ( $data === $teststr ) {
return INSECURE_DATAROOT_ERROR ;
}
}
preg_match ( '|https?://([^/]+)|i' , $testurl , $matches );
$sitename = $matches [ 1 ];
$error = 0 ;
if ( $fp = @ fsockopen ( $sitename , 80 , $error )) {
preg_match ( '|https?://[^/]+(.*)|i' , $testurl , $matches );
$localurl = $matches [ 1 ];
$out = " GET $localurl HTTP/1.1 \r \n " ;
$out .= " Host: $sitename\r\n " ;
$out .= " Connection: Close \r \n \r \n " ;
fwrite ( $fp , $out );
$data = '' ;
$incoming = false ;
while ( ! feof ( $fp )) {
if ( $incoming ) {
$data .= fgets ( $fp , 1024 );
} else if ( @ fgets ( $fp , 1024 ) === " \r \n " ) {
2009-09-09 07:55:03 +00:00
$incoming = true ;
}
2008-08-21 15:29:42 +00:00
}
fclose ( $fp );
$data = trim ( $data );
if ( $data === $teststr ) {
return INSECURE_DATAROOT_ERROR ;
}
2006-08-28 20:11:24 +00:00
}
2008-08-21 15:29:42 +00:00
return INSECURE_DATAROOT_WARNING ;
2006-08-28 20:11:24 +00:00
}
2006-09-02 13:14:57 +00:00
/// CLASS DEFINITIONS /////////////////////////////////////////////////////////
/**
* Pseudointerface for anything appearing in the admin tree
*
* The pseudointerface that is implemented by anything that appears in the admin tree
* block . It forces inheriting classes to define a method for checking user permissions
* and methods for finding something in the admin tree .
*
2009-05-22 02:05:46 +00:00
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2006-09-02 13:14:57 +00:00
*/
2009-01-11 16:42:19 +00:00
interface part_of_admin_tree {
2006-09-02 13:14:57 +00:00
2009-09-09 07:55:03 +00:00
/**
* Finds a named part_of_admin_tree .
*
* Used to find a part_of_admin_tree . If a class only inherits part_of_admin_tree
* and not parentable_part_of_admin_tree , then this function should only check if
* $this -> name matches $name . If it does , it should return a reference to $this ,
* otherwise , it should return a reference to NULL .
*
* If a class inherits parentable_part_of_admin_tree , this method should be called
* recursively on all child objects ( assuming , of course , the parent object ' s name
* doesn ' t match the search criterion ) .
*
* @ param string $name The internal name of the part_of_admin_tree we ' re searching for .
* @ return mixed An object reference or a NULL reference .
*/
2009-01-11 16:42:19 +00:00
public function locate ( $name );
2006-09-02 19:30:54 +00:00
/**
* Removes named part_of_admin_tree .
*
* @ param string $name The internal name of the part_of_admin_tree we want to remove .
2006-09-24 20:23:40 +00:00
* @ return bool success .
2006-09-02 19:30:54 +00:00
*/
2009-01-11 16:42:19 +00:00
public function prune ( $name );
2006-09-02 19:30:54 +00:00
2007-12-19 17:35:20 +00:00
/**
* Search using query
2009-05-22 02:05:46 +00:00
* @ param string $query
2007-12-19 17:35:20 +00:00
* @ return mixed array - object structure of found settings and pages
*/
2009-01-11 16:42:19 +00:00
public function search ( $query );
2007-12-19 17:35:20 +00:00
2006-09-02 13:14:57 +00:00
/**
* Verifies current user ' s access to this part_of_admin_tree .
*
* Used to check if the current user has access to this part of the admin tree or
* not . If a class only inherits part_of_admin_tree and not parentable_part_of_admin_tree ,
* then this method is usually just a call to has_capability () in the site context .
*
* If a class inherits parentable_part_of_admin_tree , this method should return the
* logical OR of the return of check_access () on all child objects .
*
* @ return bool True if the user has access , false if she doesn ' t .
*/
2009-01-11 16:42:19 +00:00
public function check_access ();
2006-09-20 21:00:45 +00:00
2006-09-24 20:23:40 +00:00
/**
* Mostly usefull for removing of some parts of the tree in admin tree block .
*
* @ return True is hidden from normal list view
*/
2009-01-11 16:42:19 +00:00
public function is_hidden ();
2010-02-08 16:26:15 +00:00
/**
* Show we display Save button at the page bottom ?
* @ return bool
*/
public function show_save ();
2006-09-02 13:14:57 +00:00
}
/**
* Pseudointerface implemented by any part_of_admin_tree that has children .
*
* The pseudointerface implemented by any part_of_admin_tree that can be a parent
* to other part_of_admin_tree ' s . ( For now , this only includes admin_category . ) Apart
2006-09-20 21:00:45 +00:00
* from ensuring part_of_admin_tree compliancy , it also ensures inheriting methods
2006-09-02 13:14:57 +00:00
* include an add method for adding other part_of_admin_tree objects as children .
*
2009-05-22 02:05:46 +00:00
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2006-09-02 13:14:57 +00:00
*/
2009-01-11 16:42:19 +00:00
interface parentable_part_of_admin_tree extends part_of_admin_tree {
2006-09-20 21:00:45 +00:00
2009-09-09 07:55:03 +00:00
/**
* Adds a part_of_admin_tree object to the admin tree .
*
* Used to add a part_of_admin_tree object to this object or a child of this
* object . $something should only be added if $destinationname matches
* $this -> name . If it doesn ' t , add should be called on child objects that are
* also parentable_part_of_admin_tree ' s .
*
* @ param string $destinationname The internal name of the new parent for $something .
* @ param part_of_admin_tree $something The object to be added .
* @ return bool True on success , false on failure .
*/
2009-01-11 16:42:19 +00:00
public function add ( $destinationname , $something );
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
}
/**
* The object used to represent folders ( a . k . a . categories ) in the admin tree block .
2006-09-20 21:00:45 +00:00
*
2006-09-02 13:14:57 +00:00
* Each admin_category object contains a number of part_of_admin_tree objects .
*
2009-05-22 02:05:46 +00:00
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2006-09-02 13:14:57 +00:00
*/
2009-01-11 16:42:19 +00:00
class admin_category implements parentable_part_of_admin_tree {
2006-09-02 13:14:57 +00:00
2009-09-09 07:55:03 +00:00
/** @var mixed An array of part_of_admin_tree objects that are this object's children */
2009-01-11 16:42:19 +00:00
public $children ;
2009-06-30 15:19:12 +00:00
/** @var string An internal name for this category. Must be unique amongst ALL part_of_admin_tree objects */
2009-01-11 16:42:19 +00:00
public $name ;
2009-06-30 15:19:12 +00:00
/** @var string The displayed name for this category. Usually obtained through get_string() */
2009-01-11 16:42:19 +00:00
public $visiblename ;
2009-06-30 15:19:12 +00:00
/** @var bool Should this category be hidden in admin tree block? */
2009-01-11 16:42:19 +00:00
public $hidden ;
2009-06-30 15:19:12 +00:00
/** @var mixed Either a string or an array or strings */
2009-01-11 16:42:19 +00:00
public $path ;
2009-06-30 15:19:12 +00:00
/** @var mixed Either a string or an array or strings */
2009-01-11 16:42:19 +00:00
public $visiblepath ;
2006-09-02 13:14:57 +00:00
/**
* Constructor for an empty admin category
*
* @ param string $name The internal name for this category . Must be unique amongst ALL part_of_admin_tree objects
* @ param string $visiblename The displayed named for this category . Usually obtained through get_string ()
2009-05-22 02:05:46 +00:00
* @ param bool $hidden hide category in admin tree block , defaults to false
2006-09-02 13:14:57 +00:00
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $hidden = false ) {
2007-12-19 17:35:20 +00:00
$this -> children = array ();
$this -> name = $name ;
2006-09-02 13:14:57 +00:00
$this -> visiblename = $visiblename ;
2007-12-19 17:35:20 +00:00
$this -> hidden = $hidden ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
/**
2007-12-19 17:35:20 +00:00
* Returns a reference to the part_of_admin_tree object with internal name $name .
2006-09-02 13:14:57 +00:00
*
2007-12-19 17:35:20 +00:00
* @ param string $name The internal name of the object we want .
* @ param bool $findpath initialize path and visiblepath arrays
2009-06-30 15:19:12 +00:00
* @ return mixed A reference to the object with internal name $name if found , otherwise a reference to NULL .
2009-05-22 02:05:46 +00:00
* defaults to false
2006-09-02 13:14:57 +00:00
*/
2009-01-11 16:42:19 +00:00
public function locate ( $name , $findpath = false ) {
2006-09-02 13:14:57 +00:00
if ( $this -> name == $name ) {
2007-12-19 17:35:20 +00:00
if ( $findpath ) {
$this -> visiblepath [] = $this -> visiblename ;
$this -> path [] = $this -> name ;
}
return $this ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
$return = NULL ;
foreach ( $this -> children as $childid => $unused ) {
2009-01-11 16:42:19 +00:00
if ( $return = $this -> children [ $childid ] -> locate ( $name , $findpath )) {
2007-12-19 17:35:20 +00:00
break ;
2006-09-02 13:14:57 +00:00
}
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
if ( ! is_null ( $return ) and $findpath ) {
$return -> visiblepath [] = $this -> visiblename ;
$return -> path [] = $this -> name ;
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
return $return ;
2006-09-02 13:14:57 +00:00
}
/**
2007-12-19 17:35:20 +00:00
* Search using query
2009-05-22 02:05:46 +00:00
*
* @ param string query
2007-12-19 17:35:20 +00:00
* @ return mixed array - object structure of found settings and pages
2006-09-02 13:14:57 +00:00
*/
2009-01-11 16:42:19 +00:00
public function search ( $query ) {
2007-12-19 17:35:20 +00:00
$result = array ();
foreach ( $this -> children as $child ) {
2007-12-20 14:39:12 +00:00
$subsearch = $child -> search ( $query );
if ( ! is_array ( $subsearch )) {
debugging ( 'Incorrect search result from ' . $child -> name );
continue ;
}
$result = array_merge ( $result , $subsearch );
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
return $result ;
2006-09-02 13:14:57 +00:00
}
2006-09-02 19:30:54 +00:00
/**
* Removes part_of_admin_tree object with internal name $name .
*
* @ param string $name The internal name of the object we want to remove .
2006-09-24 20:23:40 +00:00
* @ return bool success
2006-09-02 19:30:54 +00:00
*/
2009-01-11 16:42:19 +00:00
public function prune ( $name ) {
2006-09-02 19:30:54 +00:00
if ( $this -> name == $name ) {
return false ; //can not remove itself
}
foreach ( $this -> children as $precedence => $child ) {
if ( $child -> name == $name ) {
2009-09-09 07:55:03 +00:00
// found it!
2006-09-20 21:00:45 +00:00
unset ( $this -> children [ $precedence ]);
2006-09-02 19:30:54 +00:00
return true ;
}
if ( $this -> children [ $precedence ] -> prune ( $name )) {
return true ;
}
}
return false ;
}
2006-09-02 13:14:57 +00:00
/**
* Adds a part_of_admin_tree to a child or grandchild ( or great - grandchild , and so forth ) of this object .
*
2007-12-19 17:35:20 +00:00
* @ param string $destinationame The internal name of the immediate parent that we want for $something .
* @ param mixed $something A part_of_admin_tree or setting instanceto be added .
* @ return bool True if successfully added , false if $something can not be added .
2006-09-02 13:14:57 +00:00
*/
2009-01-11 16:42:19 +00:00
public function add ( $parentname , $something ) {
$parent = $this -> locate ( $parentname );
2007-12-19 17:35:20 +00:00
if ( is_null ( $parent )) {
debugging ( 'parent does not exist!' );
2006-09-02 13:14:57 +00:00
return false ;
}
2009-01-11 16:42:19 +00:00
if ( $something instanceof part_of_admin_tree ) {
if ( ! ( $parent instanceof parentable_part_of_admin_tree )) {
2007-12-19 17:35:20 +00:00
debugging ( 'error - parts of tree can be inserted only into parentable parts' );
return false ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
$parent -> children [] = $something ;
2006-09-02 13:14:57 +00:00
return true ;
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
} else {
debugging ( 'error - can not add this element' );
return false ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
/**
* Checks if the user has access to anything in this category .
*
* @ return bool True if the user has access to atleast one child in this category , false otherwise .
*/
2009-01-11 16:42:19 +00:00
public function check_access () {
2006-09-02 13:14:57 +00:00
foreach ( $this -> children as $child ) {
2007-12-19 17:35:20 +00:00
if ( $child -> check_access ()) {
return true ;
}
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
return false ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2006-09-24 20:23:40 +00:00
/**
* Is this category hidden in admin tree block ?
*
* @ return bool True if hidden
*/
2009-01-11 16:42:19 +00:00
public function is_hidden () {
2006-09-24 20:23:40 +00:00
return $this -> hidden ;
}
2010-02-08 16:26:15 +00:00
/**
* Show we display Save button at the page bottom ?
* @ return bool
*/
public function show_save () {
foreach ( $this -> children as $child ) {
if ( $child -> show_save ()) {
return true ;
}
}
return false ;
}
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
2009-06-30 15:19:12 +00:00
* Root of admin settings tree , does not have any parent .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2007-12-19 17:35:20 +00:00
class admin_root extends admin_category {
2009-09-09 07:55:03 +00:00
/** @var array List of errors */
2009-01-11 16:42:19 +00:00
public $errors ;
2009-06-30 15:19:12 +00:00
/** @var string search query */
2009-01-11 16:42:19 +00:00
public $search ;
2009-06-30 15:19:12 +00:00
/** @var bool full tree flag - true means all settings required, false onlypages required */
2009-01-11 16:42:19 +00:00
public $fulltree ;
2009-06-30 15:19:12 +00:00
/** @var bool flag indicating loaded tree */
2009-01-11 16:42:19 +00:00
public $loaded ;
2009-06-30 15:19:12 +00:00
/** @var mixed site custom defaults overriding defaults in setings files*/
2009-02-01 10:19:13 +00:00
public $custom_defaults ;
2009-05-22 02:05:46 +00:00
/**
2009-06-30 15:19:12 +00:00
* @ param bool $fulltree true means all settings required ,
2009-05-22 02:05:46 +00:00
* false only pages required
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $fulltree ) {
2009-02-01 10:19:13 +00:00
global $CFG ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( 'root' , get_string ( 'administration' ), false );
2007-12-19 17:35:20 +00:00
$this -> errors = array ();
$this -> search = '' ;
2009-01-11 16:42:19 +00:00
$this -> fulltree = $fulltree ;
$this -> loaded = false ;
2009-02-01 10:19:13 +00:00
// load custom defaults if found
$this -> custom_defaults = null ;
$defaultsfile = " $CFG->dirroot /local/defaults.php " ;
if ( is_readable ( $defaultsfile )) {
$defaults = array ();
include ( $defaultsfile );
if ( is_array ( $defaults ) and count ( $defaults )) {
$this -> custom_defaults = $defaults ;
}
}
2009-01-11 16:42:19 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Empties children array , and sets loaded to false
*
* @ param bool $requirefulltree
*/
2009-01-11 16:42:19 +00:00
public function purge_children ( $requirefulltree ) {
$this -> children = array ();
$this -> fulltree = ( $requirefulltree || $this -> fulltree );
$this -> loaded = false ;
2007-12-19 17:35:20 +00:00
}
}
2006-09-02 13:14:57 +00:00
/**
* Links external PHP pages into the admin tree .
*
* See detailed usage example at the top of this document ( adminlib . php )
*
2009-05-22 02:05:46 +00:00
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2006-09-02 13:14:57 +00:00
*/
2009-01-11 16:42:19 +00:00
class admin_externalpage implements part_of_admin_tree {
2006-09-02 13:14:57 +00:00
2009-09-09 07:55:03 +00:00
/** @var string An internal name for this external page. Must be unique amongst ALL part_of_admin_tree objects */
2009-01-11 16:42:19 +00:00
public $name ;
2006-09-20 21:00:45 +00:00
2009-06-30 15:19:12 +00:00
/** @var string The displayed name for this external page. Usually obtained through get_string(). */
2009-01-11 16:42:19 +00:00
public $visiblename ;
2006-09-20 21:00:45 +00:00
2009-06-30 15:19:12 +00:00
/** @var string The external URL that we should link to when someone requests this external page. */
2009-01-11 16:42:19 +00:00
public $url ;
2006-09-20 21:00:45 +00:00
2009-06-30 15:19:12 +00:00
/** @var string The role capability/permission a user must have to access this external page. */
2009-01-11 16:42:19 +00:00
public $req_capability ;
2006-09-20 21:00:45 +00:00
2009-06-30 15:19:12 +00:00
/** @var object The context in which capability/permission should be checked, default is site context. */
2009-01-11 16:42:19 +00:00
public $context ;
2007-01-29 21:29:27 +00:00
2009-06-30 15:19:12 +00:00
/** @var bool hidden in admin tree block. */
2009-01-11 16:42:19 +00:00
public $hidden ;
2006-09-24 20:23:40 +00:00
2009-06-30 15:19:12 +00:00
/** @var mixed either string or array of string */
2009-01-11 16:42:19 +00:00
public $path ;
public $visiblepath ;
2007-12-19 17:35:20 +00:00
2006-09-02 13:14:57 +00:00
/**
* Constructor for adding an external page into the admin tree .
*
* @ param string $name The internal name for this external page . Must be unique amongst ALL part_of_admin_tree objects .
* @ param string $visiblename The displayed name for this external page . Usually obtained through get_string () .
* @ param string $url The external URL that we should link to when someone requests this external page .
2006-09-24 11:55:11 +00:00
* @ param mixed $req_capability The role capability / permission a user must have to access this external page . Defaults to 'moodle/site:config' .
2008-12-11 09:21:41 +00:00
* @ param boolean $hidden Is this external page hidden in admin tree block ? Default false .
* @ param context $context The context the page relates to . Not sure what happens
* if you specify something other than system or front page . Defaults to system .
2006-09-02 13:14:57 +00:00
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $url , $req_capability = 'moodle/site:config' , $hidden = false , $context = NULL ) {
2007-12-19 17:35:20 +00:00
$this -> name = $name ;
2006-09-02 13:14:57 +00:00
$this -> visiblename = $visiblename ;
2007-12-19 17:35:20 +00:00
$this -> url = $url ;
2006-09-24 11:55:11 +00:00
if ( is_array ( $req_capability )) {
$this -> req_capability = $req_capability ;
} else {
$this -> req_capability = array ( $req_capability );
}
2008-12-11 09:21:41 +00:00
$this -> hidden = $hidden ;
2007-01-29 21:29:27 +00:00
$this -> context = $context ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
/**
* Returns a reference to the part_of_admin_tree object with internal name $name .
*
* @ param string $name The internal name of the object we want .
2009-05-22 02:05:46 +00:00
* @ param bool $findpath defaults to false
2006-09-02 13:14:57 +00:00
* @ return mixed A reference to the object with internal name $name if found , otherwise a reference to NULL .
*/
2009-01-11 16:42:19 +00:00
public function locate ( $name , $findpath = false ) {
2007-12-19 17:35:20 +00:00
if ( $this -> name == $name ) {
if ( $findpath ) {
$this -> visiblepath = array ( $this -> visiblename );
$this -> path = array ( $this -> name );
}
return $this ;
} else {
$return = NULL ;
return $return ;
}
2006-09-02 13:14:57 +00:00
}
2006-09-02 19:30:54 +00:00
2009-05-22 02:05:46 +00:00
/**
* This function always returns false , required function by interface
*
* @ param string $name
* @ return false
*/
2009-01-11 16:42:19 +00:00
public function prune ( $name ) {
2006-09-02 19:30:54 +00:00
return false ;
}
2007-12-19 17:35:20 +00:00
/**
* Search using query
2009-05-22 02:05:46 +00:00
*
* @ param string $query
2007-12-19 17:35:20 +00:00
* @ return mixed array - object structure of found settings and pages
*/
2009-01-11 16:42:19 +00:00
public function search ( $query ) {
2007-12-19 17:35:20 +00:00
$textlib = textlib_get_instance ();
$found = false ;
if ( strpos ( strtolower ( $this -> name ), $query ) !== false ) {
$found = true ;
} else if ( strpos ( $textlib -> strtolower ( $this -> visiblename ), $query ) !== false ) {
2009-09-09 07:55:03 +00:00
$found = true ;
}
2007-12-19 17:35:20 +00:00
if ( $found ) {
$result = new object ();
$result -> page = $this ;
$result -> settings = array ();
return array ( $this -> name => $result );
} else {
return array ();
}
}
2006-09-02 13:14:57 +00:00
/**
2006-09-21 08:18:14 +00:00
* Determines if the current user has access to this external page based on $this -> req_capability .
2009-05-22 02:05:46 +00:00
*
2006-09-02 13:14:57 +00:00
* @ return bool True if user has access , false otherwise .
*/
2009-01-11 16:42:19 +00:00
public function check_access () {
2009-01-11 09:41:48 +00:00
global $CFG ;
2007-01-29 21:29:27 +00:00
$context = empty ( $this -> context ) ? get_context_instance ( CONTEXT_SYSTEM ) : $this -> context ;
2006-09-24 11:55:11 +00:00
foreach ( $this -> req_capability as $cap ) {
2010-03-31 07:41:31 +00:00
if ( has_capability ( $cap , $context )) {
2006-09-24 11:55:11 +00:00
return true ;
}
}
return false ;
2006-09-02 13:14:57 +00:00
}
2006-09-24 20:23:40 +00:00
/**
* Is this external page hidden in admin tree block ?
*
* @ return bool True if hidden
*/
2009-01-11 16:42:19 +00:00
public function is_hidden () {
2006-09-24 20:23:40 +00:00
return $this -> hidden ;
}
2010-02-08 16:26:15 +00:00
/**
* Show we display Save button at the page bottom ?
* @ return bool
*/
public function show_save () {
return false ;
}
2006-09-02 13:14:57 +00:00
}
/**
* Used to group a number of admin_setting objects into a page and add them to the admin tree .
*
2009-05-22 02:05:46 +00:00
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2006-09-02 13:14:57 +00:00
*/
2009-01-11 16:42:19 +00:00
class admin_settingpage implements part_of_admin_tree {
2006-09-02 13:14:57 +00:00
2009-09-09 07:55:03 +00:00
/** @var string An internal name for this external page. Must be unique amongst ALL part_of_admin_tree objects */
2009-01-11 16:42:19 +00:00
public $name ;
2006-09-20 21:00:45 +00:00
2009-06-30 15:19:12 +00:00
/** @var string The displayed name for this external page. Usually obtained through get_string(). */
2009-01-11 16:42:19 +00:00
public $visiblename ;
2009-06-30 15:19:12 +00:00
/** @var mixed An array of admin_setting objects that are part of this setting page. */
2009-01-11 16:42:19 +00:00
public $settings ;
2006-09-20 21:00:45 +00:00
2009-06-30 15:19:12 +00:00
/** @var string The role capability/permission a user must have to access this external page. */
2009-01-11 16:42:19 +00:00
public $req_capability ;
2006-09-20 21:00:45 +00:00
2009-06-30 15:19:12 +00:00
/** @var object The context in which capability/permission should be checked, default is site context. */
2009-01-11 16:42:19 +00:00
public $context ;
2007-01-29 21:29:27 +00:00
2009-06-30 15:19:12 +00:00
/** @var bool hidden in admin tree block. */
2009-01-11 16:42:19 +00:00
public $hidden ;
2006-09-24 20:23:40 +00:00
2009-06-30 15:19:12 +00:00
/** @var mixed string of paths or array of strings of paths */
2009-01-11 16:42:19 +00:00
public $path ;
public $visiblepath ;
2007-12-19 17:35:20 +00:00
2009-05-22 02:05:46 +00:00
/**
* see admin_settingpage for details of this function
2009-06-30 15:19:12 +00:00
*
2009-05-22 02:05:46 +00:00
* @ param string $name The internal name for this external page . Must be unique amongst ALL part_of_admin_tree objects .
* @ param string $visiblename The displayed name for this external page . Usually obtained through get_string () .
* @ param mixed $req_capability The role capability / permission a user must have to access this external page . Defaults to 'moodle/site:config' .
* @ param boolean $hidden Is this external page hidden in admin tree block ? Default false .
* @ param context $context The context the page relates to . Not sure what happens
* if you specify something other than system or front page . Defaults to system .
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $req_capability = 'moodle/site:config' , $hidden = false , $context = NULL ) {
2007-12-19 17:35:20 +00:00
$this -> settings = new object ();
$this -> name = $name ;
$this -> visiblename = $visiblename ;
if ( is_array ( $req_capability )) {
$this -> req_capability = $req_capability ;
2006-09-02 13:14:57 +00:00
} else {
2007-12-19 17:35:20 +00:00
$this -> req_capability = array ( $req_capability );
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
$this -> hidden = $hidden ;
$this -> context = $context ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-06-30 15:19:12 +00:00
/**
2009-05-22 02:05:46 +00:00
* see admin_category
*
* @ param string $name
* @ param bool $findpath
* @ return mixed Object ( this ) if name == this -> name , else returns null
*/
2009-01-11 16:42:19 +00:00
public function locate ( $name , $findpath = false ) {
2007-12-19 17:35:20 +00:00
if ( $this -> name == $name ) {
if ( $findpath ) {
$this -> visiblepath = array ( $this -> visiblename );
$this -> path = array ( $this -> name );
}
return $this ;
} else {
$return = NULL ;
return $return ;
}
2006-09-02 13:14:57 +00:00
}
2006-09-02 19:30:54 +00:00
2009-06-30 15:19:12 +00:00
/**
* Search string in settings page .
*
2009-05-22 02:05:46 +00:00
* @ param string $query
* @ return array
*/
2009-01-11 16:42:19 +00:00
public function search ( $query ) {
2007-12-19 17:35:20 +00:00
$found = array ();
2006-09-02 19:30:54 +00:00
2007-12-19 17:35:20 +00:00
foreach ( $this -> settings as $setting ) {
if ( $setting -> is_related ( $query )) {
$found [] = $setting ;
}
}
if ( $found ) {
$result = new object ();
$result -> page = $this ;
$result -> settings = $found ;
return array ( $this -> name => $result );
}
$textlib = textlib_get_instance ();
$found = false ;
if ( strpos ( strtolower ( $this -> name ), $query ) !== false ) {
$found = true ;
} else if ( strpos ( $textlib -> strtolower ( $this -> visiblename ), $query ) !== false ) {
2009-09-09 07:55:03 +00:00
$found = true ;
}
2007-12-19 17:35:20 +00:00
if ( $found ) {
$result = new object ();
$result -> page = $this ;
$result -> settings = array ();
return array ( $this -> name => $result );
2006-09-24 11:55:11 +00:00
} else {
2007-12-19 17:35:20 +00:00
return array ();
2006-09-24 11:55:11 +00:00
}
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* This function always returns false , required by interface
*
* @ param string $name
* @ return bool Always false
*/
2009-01-11 16:42:19 +00:00
public function prune ( $name ) {
2006-09-02 13:14:57 +00:00
return false ;
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
/**
2009-05-22 02:05:46 +00:00
* adds an admin_setting to this admin_settingpage
*
2007-12-19 17:35:20 +00:00
* not the same as add for admin_category . adds an admin_setting to this admin_settingpage . settings appear ( on the settingpage ) in the order in which they ' re added
* n . b . each admin_setting in an admin_settingpage must have a unique internal name
2009-05-22 02:05:46 +00:00
*
2007-12-19 17:35:20 +00:00
* @ param object $setting is the admin_setting object you want to add
2009-05-22 02:05:46 +00:00
* @ return bool true if successful , false if not
2007-12-19 17:35:20 +00:00
*/
2009-01-11 16:42:19 +00:00
public function add ( $setting ) {
if ( ! ( $setting instanceof admin_setting )) {
2007-12-19 17:35:20 +00:00
debugging ( 'error - not a setting instance' );
return false ;
}
$this -> settings -> { $setting -> name } = $setting ;
return true ;
}
2009-05-22 02:05:46 +00:00
/**
* see admin_externalpage
*
* @ return bool Returns true for yes false for no
*/
2009-01-11 16:42:19 +00:00
public function check_access () {
2009-01-11 09:41:48 +00:00
global $CFG ;
2007-01-29 21:29:27 +00:00
$context = empty ( $this -> context ) ? get_context_instance ( CONTEXT_SYSTEM ) : $this -> context ;
2006-09-24 11:55:11 +00:00
foreach ( $this -> req_capability as $cap ) {
2010-03-31 07:41:31 +00:00
if ( has_capability ( $cap , $context )) {
2006-09-24 11:55:11 +00:00
return true ;
}
}
return false ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
/**
* outputs this page as html in a table ( suitable for inclusion in an admin pagetype )
2009-05-22 02:05:46 +00:00
* @ return string Returns an XHTML string
2007-12-19 17:35:20 +00:00
*/
2009-01-11 16:42:19 +00:00
public function output_html () {
$adminroot = admin_get_root ();
2007-12-19 17:35:20 +00:00
$return = '<fieldset>' . " \n " . '<div class="clearer"><!-- --></div>' . " \n " ;
2006-09-02 13:14:57 +00:00
foreach ( $this -> settings as $setting ) {
2007-12-19 17:35:20 +00:00
$fullname = $setting -> get_full_name ();
if ( array_key_exists ( $fullname , $adminroot -> errors )) {
$data = $adminroot -> errors [ $fullname ] -> data ;
2006-09-02 13:14:57 +00:00
} else {
2007-12-19 17:35:20 +00:00
$data = $setting -> get_setting ();
2010-04-30 08:03:32 +00:00
// do not use defaults if settings not available - upgrade settings handles the defaults!
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
$return .= $setting -> output_html ( $data );
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
$return .= '</fieldset>' ;
2006-09-02 13:14:57 +00:00
return $return ;
}
2006-09-24 20:23:40 +00:00
/**
* Is this settigns page hidden in admin tree block ?
*
* @ return bool True if hidden
*/
2009-01-11 16:42:19 +00:00
public function is_hidden () {
2006-09-24 20:23:40 +00:00
return $this -> hidden ;
}
2010-02-08 16:26:15 +00:00
/**
* Show we display Save button at the page bottom ?
* @ return bool
*/
public function show_save () {
foreach ( $this -> settings as $setting ) {
if ( empty ( $setting -> nosave )) {
return true ;
}
}
return false ;
}
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
/**
* Admin settings class . Only exists on setting pages .
* Read & write happens at this level ; no authentication .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2009-01-13 19:02:00 +00:00
abstract class admin_setting {
2009-09-09 07:55:03 +00:00
/** @var string unique ascii name, either 'mysetting' for settings that in config, or 'myplugin/mysetting' for ones in config_plugins. */
2009-01-11 16:42:19 +00:00
public $name ;
2009-06-30 15:19:12 +00:00
/** @var string localised name */
2009-01-11 16:42:19 +00:00
public $visiblename ;
2010-05-17 21:08:57 +00:00
/** @var string localised long description in Markdown format */
2009-01-11 16:42:19 +00:00
public $description ;
2009-06-30 15:19:12 +00:00
/** @var mixed Can be string or array of string */
2009-01-11 16:42:19 +00:00
public $defaultsetting ;
2009-06-30 15:19:12 +00:00
/** @var string */
2009-01-11 16:42:19 +00:00
public $updatedcallback ;
2009-06-30 15:19:12 +00:00
/** @var mixed can be String or Null. Null means main config table */
2009-01-11 16:42:19 +00:00
public $plugin ; // null means main config table
2010-02-08 16:26:15 +00:00
/** @var bool true indicates this setting does not actually save anything, just information */
public $nosave = false ;
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
/**
* Constructor
2009-06-30 15:19:12 +00:00
* @ param string $name unique ascii name , either 'mysetting' for settings that in config ,
2009-05-22 02:05:46 +00:00
* or 'myplugin/mysetting' for ones in config_plugins .
2008-09-18 10:23:03 +00:00
* @ param string $visiblename localised name
* @ param string $description localised long description
2007-12-19 17:35:20 +00:00
* @ param mixed $defaultsetting string or array depending on implementation
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting ) {
2008-09-18 09:55:04 +00:00
$this -> parse_setting_name ( $name );
2007-12-19 17:35:20 +00:00
$this -> visiblename = $visiblename ;
2010-05-17 21:08:57 +00:00
$this -> description = markdown_to_html ( $description );
2006-09-02 13:14:57 +00:00
$this -> defaultsetting = $defaultsetting ;
}
2006-09-20 21:00:45 +00:00
2008-09-18 09:55:04 +00:00
/**
2009-05-22 02:05:46 +00:00
* Set up $this -> name and potentially $this -> plugin
*
2008-09-18 09:55:04 +00:00
* Set up $this -> name and possibly $this -> plugin based on whether $name looks
* like 'settingname' or 'plugin/settingname' . Also , do some sanity checking
* on the names , that is , output a developer debug warning if the name
* contains anything other than [ a - zA - Z0 - 9_ ] +.
*
* @ param string $name the setting name passed in to the constructor .
*/
private function parse_setting_name ( $name ) {
$bits = explode ( '/' , $name );
if ( count ( $bits ) > 2 ) {
throw new moodle_exception ( 'invalidadminsettingname' , '' , '' , $name );
}
$this -> name = array_pop ( $bits );
if ( ! preg_match ( '/^[a-zA-Z0-9_]+$/' , $this -> name )) {
throw new moodle_exception ( 'invalidadminsettingname' , '' , '' , $name );
}
if ( ! empty ( $bits )) {
$this -> plugin = array_pop ( $bits );
2009-02-01 10:19:13 +00:00
if ( $this -> plugin === 'moodle' ) {
$this -> plugin = null ;
} else if ( ! preg_match ( '/^[a-zA-Z0-9_]+$/' , $this -> plugin )) {
2009-09-09 07:55:03 +00:00
throw new moodle_exception ( 'invalidadminsettingname' , '' , '' , $name );
}
2008-09-18 09:55:04 +00:00
}
}
2009-05-22 02:05:46 +00:00
/**
* Returns the fullname prefixed by the plugin
* @ return string
*/
2009-01-11 16:42:19 +00:00
public function get_full_name () {
2007-12-19 17:35:20 +00:00
return 's_' . $this -> plugin . '_' . $this -> name ;
}
2009-05-22 02:05:46 +00:00
/**
* Returns the ID string based on plugin and name
* @ return string
*/
2009-01-11 16:42:19 +00:00
public function get_id () {
2007-12-19 17:35:20 +00:00
return 'id_s_' . $this -> plugin . '_' . $this -> name ;
}
2009-05-22 02:05:46 +00:00
/**
* Returns the config if possible
*
* @ return mixed returns config if successfull else null
*/
2009-01-11 16:42:19 +00:00
public function config_read ( $name ) {
2007-12-19 17:35:20 +00:00
global $CFG ;
2009-01-11 15:49:35 +00:00
if ( ! empty ( $this -> plugin )) {
2007-12-19 17:35:20 +00:00
$value = get_config ( $this -> plugin , $name );
return $value === false ? NULL : $value ;
} else {
if ( isset ( $CFG -> $name )) {
return $CFG -> $name ;
} else {
return NULL ;
}
}
}
2009-01-13 19:02:00 +00:00
/**
2009-05-22 02:05:46 +00:00
* Used to set a config pair and log change
2009-01-13 19:02:00 +00:00
*
2009-05-22 02:05:46 +00:00
* @ param string $name
* @ param mixed $value Gets converted to string if not null
* @ return bool Write setting to confix table
2009-01-13 19:02:00 +00:00
*/
2009-01-11 16:42:19 +00:00
public function config_write ( $name , $value ) {
2009-01-13 19:02:00 +00:00
global $DB , $USER , $CFG ;
2010-02-08 16:26:15 +00:00
if ( $this -> nosave ) {
return true ;
}
2009-01-13 19:02:00 +00:00
// make sure it is a real change
$oldvalue = get_config ( $this -> plugin , $name );
$oldvalue = ( $oldvalue === false ) ? null : $oldvalue ; // normalise
$value = is_null ( $value ) ? null : ( string ) $value ;
if ( $oldvalue === $value ) {
return true ;
}
// store change
set_config ( $name , $value , $this -> plugin );
// log change
$log = new object ();
2009-06-24 09:17:56 +00:00
$log -> userid = during_initial_install () ? 0 : $USER -> id ; // 0 as user id during install
2009-01-13 19:02:00 +00:00
$log -> timemodified = time ();
$log -> plugin = $this -> plugin ;
$log -> name = $name ;
$log -> value = $value ;
$log -> oldvalue = $oldvalue ;
$DB -> insert_record ( 'config_log' , $log );
return true ; // BC only
2007-12-19 17:35:20 +00:00
}
/**
* Returns current value of this setting
* @ return mixed array or string depending on instance , NULL means not set yet
*/
2009-01-13 19:02:00 +00:00
public abstract function get_setting ();
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
/**
* Returns default setting if exists
* @ return mixed array or string depending on instance ; NULL means no default , user must supply
*/
2009-01-11 16:42:19 +00:00
public function get_defaultsetting () {
2009-02-01 10:19:13 +00:00
$adminroot = admin_get_root ( false , false );
if ( ! empty ( $adminroot -> custom_defaults )) {
$plugin = is_null ( $this -> plugin ) ? 'moodle' : $this -> plugin ;
if ( isset ( $adminroot -> custom_defaults [ $plugin ])) {
if ( array_key_exists ( $this -> name , $adminroot -> custom_defaults [ $plugin ])) { // null is valid valie here ;-)
return $adminroot -> custom_defaults [ $plugin ][ $this -> name ];
}
}
}
2007-10-02 21:38:53 +00:00
return $this -> defaultsetting ;
}
2007-12-19 17:35:20 +00:00
/**
* Store new setting
2009-05-22 02:05:46 +00:00
*
* @ param mixed $data string or array , must not be NULL
* @ return string empty string if ok , string error message otherwise
2007-12-19 17:35:20 +00:00
*/
2009-01-13 19:02:00 +00:00
public abstract function write_setting ( $data );
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
/**
* Return part of form with setting
2009-05-22 02:05:46 +00:00
* This function should always be overwritten
*
* @ param mixed $data array or string depending on setting
* @ param string $query
2007-12-19 17:35:20 +00:00
* @ return string
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2009-09-09 07:55:03 +00:00
// should be overridden
2007-12-19 17:35:20 +00:00
return ;
}
/**
2009-05-22 02:05:46 +00:00
* Function called if setting updated - cleanup , cache reset , etc .
* @ param string $functionname Sets the function name
2007-12-19 17:35:20 +00:00
*/
2009-01-11 16:42:19 +00:00
public function set_updatedcallback ( $functionname ) {
2007-12-19 17:35:20 +00:00
$this -> updatedcallback = $functionname ;
}
/**
* Is setting related to query text - used when searching
* @ param string $query
* @ return bool
*/
2009-01-11 16:42:19 +00:00
public function is_related ( $query ) {
2007-12-19 17:35:20 +00:00
if ( strpos ( strtolower ( $this -> name ), $query ) !== false ) {
return true ;
}
$textlib = textlib_get_instance ();
if ( strpos ( $textlib -> strtolower ( $this -> visiblename ), $query ) !== false ) {
return true ;
}
if ( strpos ( $textlib -> strtolower ( $this -> description ), $query ) !== false ) {
return true ;
}
2008-01-01 15:51:54 +00:00
$current = $this -> get_setting ();
if ( ! is_null ( $current )) {
if ( is_string ( $current )) {
if ( strpos ( $textlib -> strtolower ( $current ), $query ) !== false ) {
return true ;
}
}
}
$default = $this -> get_defaultsetting ();
if ( ! is_null ( $default )) {
if ( is_string ( $default )) {
if ( strpos ( $textlib -> strtolower ( $default ), $query ) !== false ) {
return true ;
}
}
}
2007-12-19 17:35:20 +00:00
return false ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
/**
* No setting - just heading and text .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_heading extends admin_setting {
2009-09-09 07:55:03 +00:00
/**
* not a setting , just text
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
* @ param string $heading heading
* @ param string $information text in box
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $heading , $information ) {
2010-02-08 16:26:15 +00:00
$this -> nosave = true ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( $name , $heading , $information , '' );
2007-12-19 17:35:20 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Always returns true
* @ return bool Always returns true
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
return true ;
}
2009-05-22 02:05:46 +00:00
/**
* Always returns true
* @ return bool Always returns true
*/
2009-01-11 16:42:19 +00:00
public function get_defaultsetting () {
2007-12-19 17:35:20 +00:00
return true ;
}
2009-05-22 02:05:46 +00:00
/**
* Never write settings
* @ return string Always returns an empty string
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2009-09-09 07:55:03 +00:00
// do not write any setting
2007-12-19 17:35:20 +00:00
return '' ;
}
2009-06-30 15:19:12 +00:00
2009-05-22 02:05:46 +00:00
/**
* Returns an HTML string
* @ return string Returns an HTML string
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2009-08-06 08:19:21 +00:00
global $OUTPUT ;
2007-12-19 17:35:20 +00:00
$return = '' ;
if ( $this -> visiblename != '' ) {
2010-04-30 08:03:32 +00:00
$return .= $OUTPUT -> heading ( $this -> visiblename , 3 , 'main' , true );
2007-12-19 17:35:20 +00:00
}
if ( $this -> description != '' ) {
2009-08-10 04:58:02 +00:00
$return .= $OUTPUT -> box ( highlight ( $query , $this -> description ), 'generalbox formsettingheading' );
2007-12-19 17:35:20 +00:00
}
return $return ;
}
}
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
/**
* The most flexibly setting , user is typing text
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2006-09-02 13:14:57 +00:00
class admin_setting_configtext extends admin_setting {
2009-09-09 07:55:03 +00:00
/** @var mixed int means PARAM_XXX type, string is a allowed format in regex */
2009-01-11 16:42:19 +00:00
public $paramtype ;
2009-06-30 15:19:12 +00:00
/** @var int default field size */
2009-01-11 16:42:19 +00:00
public $size ;
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
/**
2009-05-22 02:05:46 +00:00
* Config text contructor
*
2008-09-18 10:23:03 +00:00
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
2007-12-19 17:35:20 +00:00
* @ param string $visiblename localised
* @ param string $description long localised info
* @ param string $defaultsetting
* @ param mixed $paramtype int means PARAM_XXX type , string is a allowed format in regex
2008-02-05 11:45:05 +00:00
* @ param int $size default field size
2007-12-19 17:35:20 +00:00
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting , $paramtype = PARAM_RAW , $size = null ) {
2006-09-02 13:14:57 +00:00
$this -> paramtype = $paramtype ;
2008-02-05 11:45:05 +00:00
if ( ! is_null ( $size )) {
$this -> size = $size ;
} else {
$this -> size = ( $paramtype == PARAM_INT ) ? 5 : 30 ;
}
2009-01-11 16:42:19 +00:00
parent :: __construct ( $name , $visiblename , $description , $defaultsetting );
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Return the setting
*
* @ return mixed returns config if successfull else null
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
return $this -> config_read ( $this -> name );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-30 22:30:46 +00:00
if ( $this -> paramtype === PARAM_INT and $data === '' ) {
2009-09-09 07:55:03 +00:00
// do not complain if '' used instead of 0
2007-12-30 22:30:46 +00:00
$data = 0 ;
}
2007-12-19 17:35:20 +00:00
// $data is a string
2008-07-31 06:01:12 +00:00
$validated = $this -> validate ( $data );
2007-12-30 17:59:17 +00:00
if ( $validated !== true ) {
return $validated ;
2006-09-11 05:06:38 +00:00
}
2007-12-19 17:35:20 +00:00
return ( $this -> config_write ( $this -> name , $data ) ? '' : get_string ( 'errorsetting' , 'admin' ));
2006-09-02 13:14:57 +00:00
}
2007-12-30 17:59:17 +00:00
/**
* Validate data before storage
* @ param string data
* @ return mixed true if ok string if error found
*/
2009-01-11 16:42:19 +00:00
public function validate ( $data ) {
2009-09-18 03:52:50 +00:00
// allow paramtype to be a custom regex if it is the form of /pattern/
if ( preg_match ( '#^/.*/$#' , $this -> paramtype )) {
2007-12-30 17:59:17 +00:00
if ( preg_match ( $this -> paramtype , $data )) {
return true ;
} else {
return get_string ( 'validateerror' , 'admin' );
}
2006-09-26 08:16:17 +00:00
} else if ( $this -> paramtype === PARAM_RAW ) {
2009-09-21 02:52:34 +00:00
return true ;
2009-09-09 07:55:03 +00:00
2009-09-21 02:52:34 +00:00
} else {
$cleaned = clean_param ( $data , $this -> paramtype );
if ( " $data " == " $cleaned " ) { // implicit conversion to string is needed to do exact comparison
return true ;
2007-12-30 17:59:17 +00:00
} else {
2009-09-21 02:52:34 +00:00
return get_string ( 'validateerror' , 'admin' );
2007-12-30 17:59:17 +00:00
}
2009-09-21 02:52:34 +00:00
}
2006-09-11 05:06:38 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Return an XHTML string for the setting
* @ return string Returns an XHTML string
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$default = $this -> get_defaultsetting ();
return format_admin_setting ( $this , $this -> visiblename ,
2009-09-09 07:55:03 +00:00
'<div class="form-text defaultsnext"><input type="text" size="' . $this -> size . '" id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . '" value="' . s ( $data ) . '" /></div>' ,
$this -> description , true , '' , $default , $query );
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
/**
* General text area without html editor .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_configtextarea extends admin_setting_configtext {
2009-05-31 14:42:29 +00:00
private $rows ;
private $cols ;
2007-04-26 07:08:12 +00:00
2009-05-22 02:05:46 +00:00
/**
* @ param string $name
* @ param string $visiblename
* @ param string $description
* @ param mixed $defaultsetting string or array
* @ param mixed $paramtype
* @ param string $cols The number of columns to make the editor
* @ param string $rows The number of rows to make the editor
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting , $paramtype = PARAM_RAW , $cols = '60' , $rows = '8' ) {
2007-12-19 17:35:20 +00:00
$this -> rows = $rows ;
$this -> cols = $cols ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( $name , $visiblename , $description , $defaultsetting , $paramtype );
2007-04-26 07:08:12 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Returns an XHTML string for the editor
*
* @ param string $data
* @ param string $query
* @ return string XHTML string for the editor
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$default = $this -> get_defaultsetting ();
2008-01-01 15:51:54 +00:00
$defaultinfo = $default ;
if ( ! is_null ( $default ) and $default !== '' ) {
$defaultinfo = " \n " . $default ;
2008-07-31 06:01:12 +00:00
}
2007-12-19 17:35:20 +00:00
return format_admin_setting ( $this , $this -> visiblename ,
2009-09-09 07:55:03 +00:00
'<div class="form-textarea" ><textarea rows="' . $this -> rows . '" cols="' . $this -> cols . '" id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . '">' . s ( $data ) . '</textarea></div>' ,
$this -> description , true , '' , $defaultinfo , $query );
2009-05-31 14:42:29 +00:00
}
}
/**
* General text area with html editor .
*/
class admin_setting_confightmleditor extends admin_setting_configtext {
private $rows ;
private $cols ;
2009-06-30 15:19:12 +00:00
2009-05-31 14:42:29 +00:00
/**
* @ param string $name
* @ param string $visiblename
* @ param string $description
* @ param mixed $defaultsetting string or array
* @ param mixed $paramtype
*/
public function __construct ( $name , $visiblename , $description , $defaultsetting , $paramtype = PARAM_RAW , $cols = '60' , $rows = '8' ) {
$this -> rows = $rows ;
$this -> cols = $cols ;
parent :: __construct ( $name , $visiblename , $description , $defaultsetting , $paramtype );
2009-06-24 22:34:29 +00:00
editors_head_setup ();
2009-05-31 14:42:29 +00:00
}
/**
* Returns an XHTML string for the editor
*
* @ param string $data
* @ param string $query
* @ return string XHTML string for the editor
*/
public function output_html ( $data , $query = '' ) {
$default = $this -> get_defaultsetting ();
$defaultinfo = $default ;
if ( ! is_null ( $default ) and $default !== '' ) {
$defaultinfo = " \n " . $default ;
}
$editor = get_preferred_texteditor ( FORMAT_HTML );
2009-06-20 11:00:40 +00:00
$editor -> use_editor ( $this -> get_id (), array ( 'noclean' => true ));
2009-05-31 14:42:29 +00:00
return format_admin_setting ( $this , $this -> visiblename ,
2009-09-09 07:55:03 +00:00
'<div class="form-textarea"><textarea rows="' . $this -> rows . '" cols="' . $this -> cols . '" id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . '">' . s ( $data ) . '</textarea></div>' ,
$this -> description , true , '' , $defaultinfo , $query );
2007-12-19 17:35:20 +00:00
}
}
/**
* Password field , allows unmasking of password
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_configpasswordunmask extends admin_setting_configtext {
2009-09-09 07:55:03 +00:00
/**
* Constructor
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
* @ param string $visiblename localised
* @ param string $description long localised info
* @ param string $defaultsetting default password
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting ) {
parent :: __construct ( $name , $visiblename , $description , $defaultsetting , PARAM_RAW , 30 );
2007-12-19 17:35:20 +00:00
}
2009-06-30 15:19:12 +00:00
2009-05-22 02:05:46 +00:00
/**
* Returns XHTML for the field
* Writes Javascript into the HTML below right before the last div
*
* @ todo Make javascript available through newer methods if possible
* @ param string $data Value for the field
* @ param string $query Passed as final argument for format_admin_setting
* @ return string XHTML field
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$id = $this -> get_id ();
$unmask = get_string ( 'unmaskpassword' , 'form' );
$unmaskjs = ' < script type = " text/javascript " >
2007-04-26 07:08:12 +00:00
//<![CDATA[
2008-08-26 06:41:37 +00:00
var is_ie = ( navigator . userAgent . toLowerCase () . indexOf ( " msie " ) != - 1 );
document . getElementById ( " '. $id .' " ) . setAttribute ( " autocomplete " , " off " );
var unmaskdiv = document . getElementById ( " '. $id .'unmaskdiv " );
var unmaskchb = document . createElement ( " input " );
unmaskchb . setAttribute ( " type " , " checkbox " );
unmaskchb . setAttribute ( " id " , " '. $id .'unmask " );
unmaskchb . onchange = function () { unmaskPassword ( " '. $id .' " );};
unmaskdiv . appendChild ( unmaskchb );
var unmasklbl = document . createElement ( " label " );
unmasklbl . innerHTML = " '.addslashes_js( $unmask ).' " ;
if ( is_ie ) {
unmasklbl . setAttribute ( " htmlFor " , " '. $id .'unmask " );
} else {
unmasklbl . setAttribute ( " for " , " '. $id .'unmask " );
}
unmaskdiv . appendChild ( unmasklbl );
if ( is_ie ) {
// ugly hack to work around the famous onchange IE bug
unmaskchb . onclick = function () { this . blur ();};
unmaskdiv . onclick = function () { this . blur ();};
}
2007-04-26 07:08:12 +00:00
//]]>
</ script > ' ;
2007-12-19 17:35:20 +00:00
return format_admin_setting ( $this , $this -> visiblename ,
2009-09-09 07:55:03 +00:00
'<div class="form-password"><input type="password" size="' . $this -> size . '" id="' . $id . '" name="' . $this -> get_full_name () . '" value="' . s ( $data ) . '" /><div class="unmask" id="' . $id . 'unmaskdiv"></div>' . $unmaskjs . '</div>' ,
$this -> description , true , '' , NULL , $query );
2007-12-19 17:35:20 +00:00
}
}
/**
2008-01-01 22:25:11 +00:00
* Path to directory
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2008-01-01 22:25:11 +00:00
class admin_setting_configfile extends admin_setting_configtext {
2009-09-09 07:55:03 +00:00
/**
* Constructor
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
* @ param string $visiblename localised
* @ param string $description long localised info
* @ param string $defaultdirectory default directory location
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultdirectory ) {
parent :: __construct ( $name , $visiblename , $description , $defaultdirectory , PARAM_RAW , 50 );
2007-12-19 17:35:20 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Returns XHTML for the field
2009-06-30 15:19:12 +00:00
*
2009-05-22 02:05:46 +00:00
* Returns XHTML for the field and also checks whether the file
* specified in $data exists using file_exists ()
*
* @ param string $data File name and path to use in value attr
* @ param string $query
* @ return string XHTML field
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$default = $this -> get_defaultsetting ();
if ( $data ) {
2008-01-01 22:25:11 +00:00
if ( file_exists ( $data )) {
2007-12-19 17:35:20 +00:00
$executable = '<span class="pathok">✔</span>' ;
} else {
$executable = '<span class="patherror">✘</span>' ;
}
} else {
$executable = '' ;
}
return format_admin_setting ( $this , $this -> visiblename ,
2009-09-09 07:55:03 +00:00
'<div class="form-file defaultsnext"><input type="text" size="' . $this -> size . '" id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . '" value="' . s ( $data ) . '" />' . $executable . '</div>' ,
$this -> description , true , '' , $default , $query );
2007-04-26 07:08:12 +00:00
}
2007-12-19 17:35:20 +00:00
}
/**
2008-01-01 22:25:11 +00:00
* Path to executable file
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2008-01-01 22:25:11 +00:00
class admin_setting_configexecutable extends admin_setting_configfile {
2009-09-09 07:55:03 +00:00
/**
* Returns an XHTML field
*
* @ param string $data This is the value for the field
* @ param string $query
* @ return string XHTML field
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2008-01-01 22:25:11 +00:00
$default = $this -> get_defaultsetting ();
if ( $data ) {
if ( file_exists ( $data ) and is_executable ( $data )) {
$executable = '<span class="pathok">✔</span>' ;
} else {
$executable = '<span class="patherror">✘</span>' ;
}
} else {
$executable = '' ;
}
return format_admin_setting ( $this , $this -> visiblename ,
2009-09-09 07:55:03 +00:00
'<div class="form-file defaultsnext"><input type="text" size="' . $this -> size . '" id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . '" value="' . s ( $data ) . '" />' . $executable . '</div>' ,
$this -> description , true , '' , $default , $query );
2007-12-19 17:35:20 +00:00
}
2008-01-01 22:25:11 +00:00
}
2007-12-19 17:35:20 +00:00
2008-01-01 22:25:11 +00:00
/**
* Path to directory
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2008-01-01 22:25:11 +00:00
*/
class admin_setting_configdirectory extends admin_setting_configfile {
2009-05-22 02:05:46 +00:00
2009-09-09 07:55:03 +00:00
/**
* Returns an XHTML field
*
* @ param string $data This is the value for the field
* @ param string $query
* @ return string XHTML
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$default = $this -> get_defaultsetting ();
if ( $data ) {
if ( file_exists ( $data ) and is_dir ( $data )) {
$executable = '<span class="pathok">✔</span>' ;
} else {
$executable = '<span class="patherror">✘</span>' ;
}
} else {
$executable = '' ;
}
2007-07-27 13:38:06 +00:00
2007-12-19 17:35:20 +00:00
return format_admin_setting ( $this , $this -> visiblename ,
2009-09-09 07:55:03 +00:00
'<div class="form-file defaultsnext"><input type="text" size="' . $this -> size . '" id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . '" value="' . s ( $data ) . '" />' . $executable . '</div>' ,
$this -> description , true , '' , $default , $query );
2007-12-19 17:35:20 +00:00
}
2007-04-26 07:08:12 +00:00
}
2007-12-19 17:35:20 +00:00
/**
* Checkbox
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2006-09-02 13:14:57 +00:00
class admin_setting_configcheckbox extends admin_setting {
2009-09-09 07:55:03 +00:00
/** @var string Value used when checked */
2009-01-11 16:42:19 +00:00
public $yes ;
2009-06-30 15:19:12 +00:00
/** @var string Value used when not checked */
2009-01-11 16:42:19 +00:00
public $no ;
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
/**
* Constructor
2008-09-18 10:23:03 +00:00
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
2007-12-19 17:35:20 +00:00
* @ param string $visiblename localised
* @ param string $description long localised info
* @ param string $defaultsetting
* @ param string $yes value used when checked
* @ param string $no value used when not checked
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting , $yes = '1' , $no = '0' ) {
parent :: __construct ( $name , $visiblename , $description , $defaultsetting );
2007-12-19 17:35:20 +00:00
$this -> yes = ( string ) $yes ;
$this -> no = ( string ) $no ;
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Retrieves the current setting using the objects name
*
* @ return string
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
return $this -> config_read ( $this -> name );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Sets the value for the setting
*
* Sets the value for the setting to either the yes or no values
* of the object by comparing $data to yes
*
* @ param mixed $data Gets converted to str for comparison against yes value
* @ return string empty string or error
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
if (( string ) $data === $this -> yes ) { // convert to strings before comparison
$data = $this -> yes ;
2006-09-02 13:14:57 +00:00
} else {
2007-12-19 17:35:20 +00:00
$data = $this -> no ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
return ( $this -> config_write ( $this -> name , $data ) ? '' : get_string ( 'errorsetting' , 'admin' ));
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Returns an XHTML checkbox field
*
* @ param string $data If $data matches yes then checkbox is checked
* @ param string $query
* @ return string XHTML field
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$default = $this -> get_defaultsetting ();
if ( ! is_null ( $default )) {
if (( string ) $default === $this -> yes ) {
2008-01-01 15:51:54 +00:00
$defaultinfo = get_string ( 'checkboxyes' , 'admin' );
2007-12-19 17:35:20 +00:00
} else {
2008-01-01 15:51:54 +00:00
$defaultinfo = get_string ( 'checkboxno' , 'admin' );
2007-12-19 17:35:20 +00:00
}
2006-09-17 12:11:23 +00:00
} else {
2008-01-01 15:51:54 +00:00
$defaultinfo = NULL ;
2006-09-17 12:11:23 +00:00
}
2007-12-19 17:35:20 +00:00
if (( string ) $data === $this -> yes ) { // convert to strings before comparison
$checked = 'checked="checked"' ;
} else {
$checked = '' ;
}
return format_admin_setting ( $this , $this -> visiblename ,
2009-09-09 07:55:03 +00:00
'<div class="form-checkbox defaultsnext" ><input type="hidden" name="' . $this -> get_full_name () . '" value="' . s ( $this -> no ) . '" /> '
. '<input type="checkbox" id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . '" value="' . s ( $this -> yes ) . '" ' . $checked . ' /></div>' ,
$this -> description , true , '' , $defaultinfo , $query );
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
/**
* Multiple checkboxes , each represents different value , stored in csv format
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_configmulticheckbox extends admin_setting {
2009-09-09 07:55:03 +00:00
/** @var array Array of choices value=>label */
2009-01-11 16:42:19 +00:00
public $choices ;
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
/**
2009-05-22 02:05:46 +00:00
* Constructor : uses parent :: __construct
*
2008-09-18 10:23:03 +00:00
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
2007-12-19 17:35:20 +00:00
* @ param string $visiblename localised
* @ param string $description long localised info
* @ param array $defaultsetting array of selected
* @ param array $choices array of $value => $label for each checkbox
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting , $choices ) {
2006-09-02 13:14:57 +00:00
$this -> choices = $choices ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( $name , $visiblename , $description , $defaultsetting );
2006-09-02 13:14:57 +00:00
}
2007-10-28 17:15:00 +00:00
/**
2009-01-11 16:42:19 +00:00
* This public function may be used in ancestors for lazy loading of choices
2009-05-22 02:05:46 +00:00
*
* @ todo Check if this function is still required content commented out only returns true
* @ return bool true if loaded , false if error
2007-10-28 17:15:00 +00:00
*/
2009-01-11 16:42:19 +00:00
public function load_choices () {
2007-10-28 17:15:00 +00:00
/*
2007-12-19 17:35:20 +00:00
if ( is_array ( $this -> choices )) {
return true ;
2007-10-28 17:15:00 +00:00
}
.... load choices here
*/
2007-12-19 17:35:20 +00:00
return true ;
}
/**
* Is setting related to query text - used when searching
2009-05-22 02:05:46 +00:00
*
2007-12-19 17:35:20 +00:00
* @ param string $query
2009-05-22 02:05:46 +00:00
* @ return bool true on related , false on not or failure
2007-12-19 17:35:20 +00:00
*/
2009-01-11 16:42:19 +00:00
public function is_related ( $query ) {
2007-12-19 17:35:20 +00:00
if ( ! $this -> load_choices () or empty ( $this -> choices )) {
return false ;
}
if ( parent :: is_related ( $query )) {
return true ;
}
$textlib = textlib_get_instance ();
foreach ( $this -> choices as $desc ) {
if ( strpos ( $textlib -> strtolower ( $desc ), $query ) !== false ) {
return true ;
}
}
return false ;
2007-10-28 17:15:00 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Returns the current setting if it is set
*
* @ return mixed null if null , else an array
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
$result = $this -> config_read ( $this -> name );
2008-08-28 07:08:08 +00:00
2007-12-19 17:35:20 +00:00
if ( is_null ( $result )) {
return NULL ;
}
if ( $result === '' ) {
return array ();
}
2008-08-28 07:08:08 +00:00
$enabled = explode ( ',' , $result );
$setting = array ();
foreach ( $enabled as $option ) {
$setting [ $option ] = 1 ;
}
return $setting ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Saves the setting ( s ) provided in $data
*
* @ param array $data An array of data , if not array returns empty str
* @ return mixed empty string on useless data or bool true = success , false = failed
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
if ( ! is_array ( $data )) {
return '' ; // ignore it
}
if ( ! $this -> load_choices () or empty ( $this -> choices )) {
return '' ;
}
unset ( $data [ 'xxxxx' ]);
$result = array ();
foreach ( $data as $key => $value ) {
if ( $value and array_key_exists ( $key , $this -> choices )) {
$result [] = $key ;
}
}
return $this -> config_write ( $this -> name , implode ( ',' , $result )) ? '' : get_string ( 'errorsetting' , 'admin' );
2006-09-02 13:14:57 +00:00
}
2009-06-30 15:19:12 +00:00
2009-05-22 02:05:46 +00:00
/**
* Returns XHTML field ( s ) as required by choices
*
* Relies on data being an array should data ever be another valid vartype with
* acceptable value this may cause a warning / error
* if ( ! is_array ( $data )) would fix the problem
*
* @ todo Add vartype handling to ensure $data is an array
*
* @ param array $data An array of checked values
* @ param string $query
* @ return string XHTML field
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
if ( ! $this -> load_choices () or empty ( $this -> choices )) {
return '' ;
}
$default = $this -> get_defaultsetting ();
if ( is_null ( $default )) {
$default = array ();
}
if ( is_null ( $data )) {
2008-08-16 12:16:01 +00:00
$data = array ();
2007-12-19 17:35:20 +00:00
}
$options = array ();
$defaults = array ();
2008-08-28 07:08:08 +00:00
foreach ( $this -> choices as $key => $description ) {
if ( ! empty ( $data [ $key ])) {
2007-12-19 17:35:20 +00:00
$checked = 'checked="checked"' ;
} else {
$checked = '' ;
}
2008-08-28 07:08:08 +00:00
if ( ! empty ( $default [ $key ])) {
2007-12-19 17:35:20 +00:00
$defaults [] = $description ;
}
$options [] = '<input type="checkbox" id="' . $this -> get_id () . '_' . $key . '" name="' . $this -> get_full_name () . '[' . $key . ']" value="1" ' . $checked . ' />'
2009-09-09 07:55:03 +00:00
. '<label for="' . $this -> get_id () . '_' . $key . '">' . highlightfast ( $query , $description ) . '</label>' ;
2007-12-19 17:35:20 +00:00
}
2008-01-01 15:51:54 +00:00
if ( is_null ( $default )) {
$defaultinfo = NULL ;
} else if ( ! empty ( $defaults )) {
2009-09-09 07:55:03 +00:00
$defaultinfo = implode ( ', ' , $defaults );
} else {
$defaultinfo = get_string ( 'none' );
}
2007-12-19 17:35:20 +00:00
$return = '<div class="form-multicheckbox">' ;
$return .= '<input type="hidden" name="' . $this -> get_full_name () . '[xxxxx]" value="1" />' ; // something must be submitted even if nothing selected
if ( $options ) {
$return .= '<ul>' ;
foreach ( $options as $option ) {
$return .= '<li>' . $option . '</li>' ;
}
$return .= '</ul>' ;
2006-09-02 13:14:57 +00:00
}
2008-01-01 15:51:54 +00:00
$return .= '</div>' ;
2006-09-25 07:35:43 +00:00
2008-01-01 15:51:54 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , false , '' , $defaultinfo , $query );
2008-07-31 06:01:12 +00:00
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
/**
* Multiple checkboxes 2 , value stored as string 00101011
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_configmulticheckbox2 extends admin_setting_configmulticheckbox {
2009-05-22 02:05:46 +00:00
2009-09-09 07:55:03 +00:00
/**
* Returns the setting if set
*
* @ return mixed null if not set , else an array of set settings
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
$result = $this -> config_read ( $this -> name );
if ( is_null ( $result )) {
return NULL ;
}
if ( ! $this -> load_choices ()) {
return NULL ;
}
$result = str_pad ( $result , count ( $this -> choices ), '0' );
$result = preg_split ( '//' , $result , - 1 , PREG_SPLIT_NO_EMPTY );
$setting = array ();
foreach ( $this -> choices as $key => $unused ) {
$value = array_shift ( $result );
if ( $value ) {
2008-08-28 07:08:08 +00:00
$setting [ $key ] = 1 ;
2007-12-19 17:35:20 +00:00
}
}
return $setting ;
}
2006-09-02 13:14:57 +00:00
2009-05-22 02:05:46 +00:00
/**
* Save setting ( s ) provided in $data param
*
* @ param array $data An array of settings to save
* @ return mixed empty string for bad data or bool true => success , false => error
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
if ( ! is_array ( $data )) {
return '' ; // ignore it
}
if ( ! $this -> load_choices () or empty ( $this -> choices )) {
return '' ;
}
$result = '' ;
foreach ( $this -> choices as $key => $unused ) {
if ( ! empty ( $data [ $key ])) {
$result .= '1' ;
} else {
$result .= '0' ;
}
}
return $this -> config_write ( $this -> name , $result ) ? '' : get_string ( 'errorsetting' , 'admin' );
}
}
/**
* Select one value from list
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_configselect extends admin_setting {
2009-09-09 07:55:03 +00:00
/** @var array Array of choices value=>label */
2009-01-11 16:42:19 +00:00
public $choices ;
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
/**
* Constructor
2008-09-18 10:23:03 +00:00
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
2007-12-19 17:35:20 +00:00
* @ param string $visiblename localised
* @ param string $description long localised info
* @ param string $defaultsetting
* @ param array $choices array of $value => $label for each selection
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting , $choices ) {
2007-12-19 17:35:20 +00:00
$this -> choices = $choices ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( $name , $visiblename , $description , $defaultsetting );
2007-12-19 17:35:20 +00:00
}
/**
* This function may be used in ancestors for lazy loading of choices
2009-05-22 02:05:46 +00:00
*
2009-06-30 15:19:12 +00:00
* Override this method if loading of choices is expensive , such
* as when it requires multiple db requests .
*
2009-05-22 02:05:46 +00:00
* @ return bool true if loaded , false if error
2007-12-19 17:35:20 +00:00
*/
2009-01-11 16:42:19 +00:00
public function load_choices () {
2007-12-19 17:35:20 +00:00
/*
if ( is_array ( $this -> choices )) {
return true ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
.... load choices here
*/
return true ;
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Check if this is $query is related to a choice
*
* @ param string $query
* @ return bool true if related , false if not
*/
2009-01-11 16:42:19 +00:00
public function is_related ( $query ) {
2007-12-31 15:55:36 +00:00
if ( parent :: is_related ( $query )) {
return true ;
}
if ( ! $this -> load_choices ()) {
return false ;
}
$textlib = textlib_get_instance ();
foreach ( $this -> choices as $key => $value ) {
if ( strpos ( $textlib -> strtolower ( $key ), $query ) !== false ) {
return true ;
}
if ( strpos ( $textlib -> strtolower ( $value ), $query ) !== false ) {
return true ;
}
2008-07-31 06:01:12 +00:00
}
2007-12-31 15:55:36 +00:00
return false ;
}
2009-05-22 02:05:46 +00:00
/**
* Return the setting
2009-06-30 15:19:12 +00:00
*
2009-05-22 02:05:46 +00:00
* @ return mixed returns config if successfull else null
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
return $this -> config_read ( $this -> name );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Save a setting
*
* @ param string $data
* @ return string empty of error string
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
if ( ! $this -> load_choices () or empty ( $this -> choices )) {
return '' ;
}
if ( ! array_key_exists ( $data , $this -> choices )) {
return '' ; // ignore it
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
return ( $this -> config_write ( $this -> name , $data ) ? '' : get_string ( 'errorsetting' , 'admin' ));
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2008-08-26 01:05:01 +00:00
/**
2009-05-22 02:05:46 +00:00
* Returns XHTML select field
*
* Ensure the options are loaded , and generate the XHTML for the select
2008-08-26 01:05:01 +00:00
* element and any warning message . Separating this out from output_html
* makes it easier to subclass this class .
*
* @ param string $data the option to show as selected .
* @ param string $current the currently selected option in the database , null if none .
* @ param string $default the default selected option .
* @ return array the HTML for the select element , and a warning message .
*/
2009-01-11 16:42:19 +00:00
public function output_select_html ( $data , $current , $default , $extraname = '' ) {
2007-12-19 17:35:20 +00:00
if ( ! $this -> load_choices () or empty ( $this -> choices )) {
2008-08-26 01:05:01 +00:00
return array ( '' , '' );
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
2007-12-19 22:32:43 +00:00
$warning = '' ;
if ( is_null ( $current )) {
2009-09-09 07:55:03 +00:00
// first run
2007-12-19 22:32:43 +00:00
} else if ( empty ( $current ) and ( array_key_exists ( '' , $this -> choices ) or array_key_exists ( 0 , $this -> choices ))) {
// no warning
2009-09-09 07:55:03 +00:00
} else if ( ! array_key_exists ( $current , $this -> choices )) {
$warning = get_string ( 'warningcurrentsetting' , 'admin' , s ( $current ));
if ( ! is_null ( $default ) and $data == $current ) {
$data = $default ; // use default instead of first value when showing the form
}
}
2007-12-19 22:32:43 +00:00
2008-08-26 01:05:01 +00:00
$selecthtml = '<select id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . $extraname . '">' ;
2006-09-02 13:14:57 +00:00
foreach ( $this -> choices as $key => $value ) {
2009-09-09 07:55:03 +00:00
// the string cast is needed because key may be integer - 0 is equal to most strings!
2008-08-26 01:05:01 +00:00
$selecthtml .= '<option value="' . $key . '"' . (( string ) $key == $data ? ' selected="selected"' : '' ) . '>' . $value . '</option>' ;
2006-09-20 21:00:45 +00:00
}
2008-08-26 01:05:01 +00:00
$selecthtml .= '</select>' ;
return array ( $selecthtml , $warning );
}
2009-05-22 02:05:46 +00:00
/**
* Returns XHTML select field and wrapping div ( s )
*
* @ see output_select_html ()
2009-06-30 15:19:12 +00:00
*
2009-05-22 02:05:46 +00:00
* @ param string $data the option to show as selected
* @ param string $query
* @ return string XHTML field and wrapping div
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2008-08-26 01:05:01 +00:00
$default = $this -> get_defaultsetting ();
$current = $this -> get_setting ();
list ( $selecthtml , $warning ) = $this -> output_select_html ( $data , $current , $default );
if ( ! $selecthtml ) {
return '' ;
}
if ( ! is_null ( $default ) and array_key_exists ( $default , $this -> choices )) {
$defaultinfo = $this -> choices [ $default ];
} else {
$defaultinfo = NULL ;
}
$return = '<div class="form-select defaultsnext">' . $selecthtml . '</div>' ;
2007-12-19 17:35:20 +00:00
2008-01-01 15:51:54 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , true , $warning , $defaultinfo , $query );
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
/**
* Select multiple items from list
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2006-09-02 13:14:57 +00:00
class admin_setting_configmultiselect extends admin_setting_configselect {
2009-09-09 07:55:03 +00:00
/**
* Constructor
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
* @ param string $visiblename localised
* @ param string $description long localised info
* @ param array $defaultsetting array of selected items
* @ param array $choices array of $value => $label for each list item
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting , $choices ) {
parent :: __construct ( $name , $visiblename , $description , $defaultsetting , $choices );
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Returns the select setting ( s )
*
* @ return mixed null or array . Null if no settings else array of setting ( s )
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
$result = $this -> config_read ( $this -> name );
if ( is_null ( $result )) {
2007-01-12 18:30:27 +00:00
return NULL ;
}
2007-12-19 17:35:20 +00:00
if ( $result === '' ) {
return array ();
}
return explode ( ',' , $result );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Saves setting ( s ) provided through $data
*
* Potential bug in the works should anyone call with this function
* using a vartype that is not an array
*
* @ todo Add vartype handling to ensure $data is an array
* @ param array $data
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
if ( ! is_array ( $data )) {
return '' ; //ignore it
}
if ( ! $this -> load_choices () or empty ( $this -> choices )) {
return '' ;
}
2007-12-22 21:58:10 +00:00
unset ( $data [ 'xxxxx' ]);
2007-12-19 17:35:20 +00:00
$save = array ();
foreach ( $data as $value ) {
if ( ! array_key_exists ( $value , $this -> choices )) {
continue ; // ignore it
}
$save [] = $value ;
}
return ( $this -> config_write ( $this -> name , implode ( ',' , $save )) ? '' : get_string ( 'errorsetting' , 'admin' ));
}
/**
* Is setting related to query text - used when searching
2009-05-22 02:05:46 +00:00
*
2007-12-19 17:35:20 +00:00
* @ param string $query
2009-05-22 02:05:46 +00:00
* @ return bool true if related , false if not
2007-12-19 17:35:20 +00:00
*/
2009-01-11 16:42:19 +00:00
public function is_related ( $query ) {
2007-12-19 17:35:20 +00:00
if ( ! $this -> load_choices () or empty ( $this -> choices )) {
return false ;
}
if ( parent :: is_related ( $query )) {
return true ;
}
$textlib = textlib_get_instance ();
foreach ( $this -> choices as $desc ) {
if ( strpos ( $textlib -> strtolower ( $desc ), $query ) !== false ) {
return true ;
}
}
return false ;
}
2009-05-22 02:05:46 +00:00
/**
* Returns XHTML multi - select field
*
* @ todo Add vartype handling to ensure $data is an array
* @ param array $data Array of values to select by default
* @ param string $query
* @ return string XHTML multi - select field
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
if ( ! $this -> load_choices () or empty ( $this -> choices )) {
return '' ;
}
$choices = $this -> choices ;
$default = $this -> get_defaultsetting ();
if ( is_null ( $default )) {
$default = array ();
}
if ( is_null ( $data )) {
2007-01-12 18:30:27 +00:00
$data = array ();
}
2007-12-19 17:35:20 +00:00
$defaults = array ();
2009-01-08 07:07:00 +00:00
$size = min ( 10 , count ( $this -> choices ));
2007-12-22 21:58:10 +00:00
$return = '<div class="form-select"><input type="hidden" name="' . $this -> get_full_name () . '[xxxxx]" value="1" />' ; // something must be submitted even if nothing selected
2009-01-08 07:07:00 +00:00
$return .= '<select id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . '[]" size="' . $size . '" multiple="multiple">' ;
2007-12-19 17:35:20 +00:00
foreach ( $this -> choices as $key => $description ) {
if ( in_array ( $key , $data )) {
$selected = 'selected="selected"' ;
} else {
$selected = '' ;
}
if ( in_array ( $key , $default )) {
$defaults [] = $description ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
$return .= '<option value="' . s ( $key ) . '" ' . $selected . '>' . $description . '</option>' ;
}
2008-01-01 15:51:54 +00:00
if ( is_null ( $default )) {
$defaultinfo = NULL ;
} if ( ! empty ( $defaults )) {
$defaultinfo = implode ( ', ' , $defaults );
2007-12-19 17:35:20 +00:00
} else {
2008-01-01 15:51:54 +00:00
$defaultinfo = get_string ( 'none' );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2008-01-01 15:51:54 +00:00
$return .= '</select></div>' ;
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , true , '' , $defaultinfo , $query );
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
/**
* Time selector
2009-05-22 02:05:46 +00:00
*
* This is a liiitle bit messy . we 're using two selects, but we' re returning
2007-12-19 17:35:20 +00:00
* them as an array named after $name ( so we only use $name2 internally for the setting )
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_configtime extends admin_setting {
2009-09-09 07:55:03 +00:00
/** @var string Used for setting second select (minutes) */
2009-01-11 16:42:19 +00:00
public $name2 ;
2007-12-19 17:35:20 +00:00
/**
* Constructor
* @ param string $hoursname setting for hours
* @ param string $minutesname setting for hours
* @ param string $visiblename localised
* @ param string $description long localised info
* @ param array $defaultsetting array representing default time 'h' => hours , 'm' => minutes
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $hoursname , $minutesname , $visiblename , $description , $defaultsetting ) {
2007-12-19 17:35:20 +00:00
$this -> name2 = $minutesname ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( $hoursname , $visiblename , $description , $defaultsetting );
2007-12-19 17:35:20 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Get the selected time
2009-06-30 15:19:12 +00:00
*
2009-05-22 02:05:46 +00:00
* @ return mixed An array containing 'h' => xx , 'm' => xx , or null if not set
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
$result1 = $this -> config_read ( $this -> name );
$result2 = $this -> config_read ( $this -> name2 );
if ( is_null ( $result1 ) or is_null ( $result2 )) {
return NULL ;
}
return array ( 'h' => $result1 , 'm' => $result2 );
}
2009-05-22 02:05:46 +00:00
/**
* Store the time ( hours and minutes )
2009-06-30 15:19:12 +00:00
*
2009-05-22 02:05:46 +00:00
* @ param array $data Must be form 'h' => xx , 'm' => xx
* @ return bool true if success , false if not
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
if ( ! is_array ( $data )) {
return '' ;
}
$result = $this -> config_write ( $this -> name , ( int ) $data [ 'h' ]) && $this -> config_write ( $this -> name2 , ( int ) $data [ 'm' ]);
return ( $result ? '' : get_string ( 'errorsetting' , 'admin' ));
}
2009-05-22 02:05:46 +00:00
/**
* Returns XHTML time select fields
*
* @ param array $data Must be form 'h' => xx , 'm' => xx
* @ param string $query
* @ return string XHTML time select fields and wrapping div ( s )
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$default = $this -> get_defaultsetting ();
if ( is_array ( $default )) {
2008-01-01 15:51:54 +00:00
$defaultinfo = $default [ 'h' ] . ':' . $default [ 'm' ];
2006-09-18 02:41:14 +00:00
} else {
2008-01-01 15:51:54 +00:00
$defaultinfo = NULL ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
2008-01-01 15:51:54 +00:00
$return = '<div class="form-time defaultsnext">' .
2009-09-09 07:55:03 +00:00
'<select id="' . $this -> get_id () . 'h" name="' . $this -> get_full_name () . '[h]">' ;
2007-12-19 17:35:20 +00:00
for ( $i = 0 ; $i < 24 ; $i ++ ) {
$return .= '<option value="' . $i . '"' . ( $i == $data [ 'h' ] ? ' selected="selected"' : '' ) . '>' . $i . '</option>' ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
$return .= '</select>:<select id="' . $this -> get_id () . 'm" name="' . $this -> get_full_name () . '[m]">' ;
for ( $i = 0 ; $i < 60 ; $i += 5 ) {
$return .= '<option value="' . $i . '"' . ( $i == $data [ 'm' ] ? ' selected="selected"' : '' ) . '>' . $i . '</option>' ;
}
2008-01-01 15:51:54 +00:00
$return .= '</select></div>' ;
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , false , '' , $defaultinfo , $query );
2006-09-02 13:14:57 +00:00
}
}
2009-05-22 02:05:46 +00:00
/**
* Used to validate a textarea used for ip addresses
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2008-07-16 02:16:42 +00:00
class admin_setting_configiplist extends admin_setting_configtextarea {
2009-05-22 02:05:46 +00:00
2009-09-09 07:55:03 +00:00
/**
* Validate the contents of the textarea as IP addresses
*
* Used to validate a new line seperated list of IP addresses collected from
* a textarea control
*
* @ param string $data A list of IP Addresses seperated by new lines
* @ return mixed bool true for success or string : error on failure
*/
2009-01-11 16:42:19 +00:00
public function validate ( $data ) {
2008-07-16 02:16:42 +00:00
if ( ! empty ( $data )) {
2008-07-31 06:01:12 +00:00
$ips = explode ( " \n " , $data );
2008-07-16 02:16:42 +00:00
} else {
return true ;
}
$result = true ;
foreach ( $ips as $ip ) {
$ip = trim ( $ip );
if ( preg_match ( '#^(\d{1,3})(\.\d{1,3}){0,3}$#' , $ip , $match ) ||
2009-09-09 07:55:03 +00:00
preg_match ( '#^(\d{1,3})(\.\d{1,3}){0,3}(\/\d{1,2})$#' , $ip , $match ) ||
preg_match ( '#^(\d{1,3})(\.\d{1,3}){3}(-\d{1,3})$#' , $ip , $match )) {
2008-07-16 02:16:42 +00:00
$result = true ;
} else {
$result = false ;
break ;
}
}
2009-09-09 07:55:03 +00:00
if ( $result ) {
2008-07-16 02:16:42 +00:00
return true ;
} else {
return get_string ( 'validateerror' , 'admin' );
}
}
}
2009-01-08 07:07:00 +00:00
/**
2009-05-22 02:05:46 +00:00
* An admin setting for selecting one or more users who have a capability
* in the system context
*
2009-01-08 07:07:00 +00:00
* An admin setting for selecting one or more users , who have a particular capability
* in the system context . Warning , make sure the list will never be too long . There is
* no paging or searching of this list .
*
* To correctly get a list of users from this config setting , you need to call the
* get_users_from_config ( $CFG -> mysetting , $capability ); function in moodlelib . php .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2009-01-08 07:07:00 +00:00
*/
class admin_setting_users_with_capability extends admin_setting_configmultiselect {
2010-05-18 16:59:08 +00:00
/** @var string The capabilities name */
2009-01-08 07:07:00 +00:00
protected $capability ;
2010-05-18 16:59:08 +00:00
/** @var int include admin users too */
protected $includeadmins ;
2009-01-08 07:07:00 +00:00
/**
* Constructor .
*
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
* @ param string $visiblename localised name
* @ param string $description localised long description
* @ param array $defaultsetting array of usernames
* @ param string $capability string capability name .
2010-05-18 16:59:08 +00:00
* @ param bool $include admins , include aadministrators
2009-01-08 07:07:00 +00:00
*/
2010-05-18 16:59:08 +00:00
function __construct ( $name , $visiblename , $description , $defaultsetting , $capability , $includeadmins = true ) {
$this -> capability = $capability ;
$this -> includeadmins = $includeadmins ;
2009-05-01 10:32:12 +00:00
parent :: __construct ( $name , $visiblename , $description , $defaultsetting , NULL );
}
2009-05-22 02:05:46 +00:00
/**
* Load all of the uses who have the capability into choice array
*
* @ return bool Always returns true
*/
2009-05-01 10:32:12 +00:00
function load_choices () {
if ( is_array ( $this -> choices )) {
return true ;
}
2009-01-08 07:07:00 +00:00
$users = get_users_by_capability ( get_context_instance ( CONTEXT_SYSTEM ),
2009-09-09 07:55:03 +00:00
$this -> capability , 'u.id,u.username,u.firstname,u.lastname' , 'u.lastname,u.firstname' );
2009-05-01 10:32:12 +00:00
$this -> choices = array (
2009-01-08 07:07:00 +00:00
'$@NONE@$' => get_string ( 'nobody' ),
2009-05-01 10:32:12 +00:00
'$@ALL@$' => get_string ( 'everyonewhocan' , 'admin' , get_capability_string ( $this -> capability )),
2009-01-08 07:07:00 +00:00
);
2010-05-18 16:59:08 +00:00
if ( $this -> includeadmins ) {
$admins = get_admins ();
foreach ( $admins as $user ) {
$this -> choices [ $user -> id ] = fullname ( $user );
}
}
2009-01-08 07:07:00 +00:00
foreach ( $users as $user ) {
2010-05-18 16:59:08 +00:00
$this -> choices [ $user -> id ] = fullname ( $user );
2009-01-08 07:07:00 +00:00
}
2009-05-01 10:32:12 +00:00
return true ;
2009-01-08 07:07:00 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Returns the default setting for class
*
* @ return mixed Array , or string . Empty string if no default
*/
2009-01-11 16:42:19 +00:00
public function get_defaultsetting () {
2009-01-08 07:07:00 +00:00
$this -> load_choices ();
2009-02-01 10:19:13 +00:00
$defaultsetting = parent :: get_defaultsetting ();
if ( empty ( $defaultsetting )) {
2009-01-08 07:07:00 +00:00
return array ( '$@NONE@$' );
2009-02-01 10:19:13 +00:00
} else if ( array_key_exists ( $defaultsetting , $this -> choices )) {
2009-09-09 07:55:03 +00:00
return $defaultsetting ;
} else {
return '' ;
}
2009-01-08 07:07:00 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Returns the current setting
*
* @ return mixed array or string
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2009-01-08 07:07:00 +00:00
$result = parent :: get_setting ();
2010-05-18 16:59:08 +00:00
if ( $result === null ) {
// this is necessary for settings upgrade
return null ;
}
2009-01-08 07:07:00 +00:00
if ( empty ( $result )) {
$result = array ( '$@NONE@$' );
}
return $result ;
}
2009-05-22 02:05:46 +00:00
/**
* Save the chosen setting provided as $data
*
* @ param array $data
* @ return mixed string or array
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2009-09-09 07:55:03 +00:00
// If all is selected, remove any explicit options.
2009-01-08 07:07:00 +00:00
if ( in_array ( '$@ALL@$' , $data )) {
$data = array ( '$@ALL@$' );
}
// None never needs to be writted to the DB.
if ( in_array ( '$@NONE@$' , $data )) {
unset ( $data [ array_search ( '$@NONE@$' , $data )]);
}
return parent :: write_setting ( $data );
}
}
2007-12-19 17:35:20 +00:00
/**
* Special checkbox for calendar - resets SESSION vars .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2006-09-02 13:14:57 +00:00
class admin_setting_special_adminseesall extends admin_setting_configcheckbox {
2009-09-09 07:55:03 +00:00
/**
* Calls the parent :: __construct with default values
*
* name => calendar_adminseesall
* visiblename => get_string ( 'adminseesall' , 'admin' )
* description => get_string ( 'helpadminseesall' , 'admin' )
* defaultsetting => 0
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'calendar_adminseesall' , get_string ( 'adminseesall' , 'admin' ),
2009-09-09 07:55:03 +00:00
get_string ( 'helpadminseesall' , 'admin' ), '0' );
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Stores the setting passed in $data
*
* @ param mixed gets converted to string for comparison
* @ return string empty string or error message
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2006-09-02 13:14:57 +00:00
global $SESSION ;
unset ( $SESSION -> cal_courses_shown );
2007-12-19 17:35:20 +00:00
return parent :: write_setting ( $data );
2006-09-02 13:14:57 +00:00
}
}
2007-12-23 13:10:35 +00:00
/**
* Special select for settings that are altered in setup . php and can not be altered on the fly
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-23 13:10:35 +00:00
*/
class admin_setting_special_selectsetup extends admin_setting_configselect {
2009-09-09 07:55:03 +00:00
/**
* Reads the setting directly from the database
*
* @ return mixed
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2009-09-09 07:55:03 +00:00
// read directly from db!
2007-12-23 13:10:35 +00:00
return get_config ( NULL , $this -> name );
}
2009-05-22 02:05:46 +00:00
/**
* Save the setting passed in $data
*
* @ param string $data The setting to save
* @ return string empty or error message
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-23 13:10:35 +00:00
global $CFG ;
// do not change active CFG setting!
$current = $CFG -> { $this -> name };
$result = parent :: write_setting ( $data );
$CFG -> { $this -> name } = $current ;
return $result ;
}
}
2007-12-19 17:35:20 +00:00
/**
* Special select for frontpage - stores data in course table
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2006-09-02 13:14:57 +00:00
class admin_setting_sitesetselect extends admin_setting_configselect {
2009-09-09 07:55:03 +00:00
/**
* Returns the site name for the selected site
*
* @ see get_site ()
* @ return string The site name of the selected site
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2009-03-26 08:56:08 +00:00
$site = get_site ();
return $site -> { $this -> name };
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Updates the database and save the setting
*
* @ param string data
* @ return string empty or error message
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2009-03-26 08:56:08 +00:00
global $DB , $SITE ;
2006-09-02 13:14:57 +00:00
if ( ! in_array ( $data , array_keys ( $this -> choices ))) {
2007-12-19 17:35:20 +00:00
return get_string ( 'errorsetting' , 'admin' );
2006-09-02 13:14:57 +00:00
}
$record = new stdClass ();
2007-12-19 17:35:20 +00:00
$record -> id = SITEID ;
$temp = $this -> name ;
$record -> $temp = $data ;
2006-09-02 13:14:57 +00:00
$record -> timemodified = time ();
2009-03-26 08:56:08 +00:00
// update $SITE
$SITE -> { $this -> name } = $data ;
2008-05-15 21:40:00 +00:00
return ( $DB -> update_record ( 'course' , $record ) ? '' : get_string ( 'errorsetting' , 'admin' ));
2006-09-02 13:14:57 +00:00
}
}
2009-09-15 07:19:03 +00:00
/**
* Select for blog ' s bloglevel setting : if set to 0 , will set blog_menu
* block to hidden .
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
class admin_setting_bloglevel extends admin_setting_configselect {
/**
* Updates the database and save the setting
*
* @ param string data
* @ return string empty or error message
*/
public function write_setting ( $data ) {
global $DB ;
if ( $data [ 'bloglevel' ] == 0 ) {
$DB -> set_field ( 'block' , 'visible' , 0 , array ( 'name' => 'blog_menu' ));
} else {
$DB -> set_field ( 'block' , 'visible' , 1 , array ( 'name' => 'blog_menu' ));
}
return parent :: write_setting ( $data );
}
}
2007-12-19 17:35:20 +00:00
/**
* Special select - lists on the frontpage - hacky
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_courselist_frontpage extends admin_setting {
2009-09-09 07:55:03 +00:00
/** @var array Array of choices value=>label */
2009-01-11 16:42:19 +00:00
public $choices ;
2006-09-02 13:14:57 +00:00
2009-05-22 02:05:46 +00:00
/**
* Construct override , requires one param
*
* @ param bool $loggedin Is the user logged in
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $loggedin ) {
2006-09-02 13:14:57 +00:00
global $CFG ;
2007-12-19 17:35:20 +00:00
require_once ( $CFG -> dirroot . '/course/lib.php' );
$name = 'frontpage' . ( $loggedin ? 'loggedin' : '' );
$visiblename = get_string ( 'frontpage' . ( $loggedin ? 'loggedin' : '' ), 'admin' );
$description = get_string ( 'configfrontpage' . ( $loggedin ? 'loggedin' : '' ), 'admin' );
$defaults = array ( FRONTPAGECOURSELIST );
2009-01-11 16:42:19 +00:00
parent :: __construct ( $name , $visiblename , $description , $defaults );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Loads the choices available
*
* @ return bool always returns true
*/
2009-01-11 16:42:19 +00:00
public function load_choices () {
2008-06-02 21:47:31 +00:00
global $DB ;
2007-12-19 17:35:20 +00:00
if ( is_array ( $this -> choices )) {
return true ;
}
$this -> choices = array ( FRONTPAGENEWS => get_string ( 'frontpagenews' ),
2009-09-09 07:55:03 +00:00
FRONTPAGECOURSELIST => get_string ( 'frontpagecourselist' ),
FRONTPAGECATEGORYNAMES => get_string ( 'frontpagecategorynames' ),
FRONTPAGECATEGORYCOMBO => get_string ( 'frontpagecategorycombo' ),
'none' => get_string ( 'none' ));
2008-06-02 21:47:31 +00:00
if ( $this -> name == 'frontpage' and $DB -> count_records ( 'course' ) > FRONTPAGECOURSELIMIT ) {
2007-12-19 17:35:20 +00:00
unset ( $this -> choices [ FRONTPAGECOURSELIST ]);
}
return true ;
}
2009-05-22 02:05:46 +00:00
/**
* Returns the selected settings
*
* @ param mixed array or setting or null
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
$result = $this -> config_read ( $this -> name );
if ( is_null ( $result )) {
return NULL ;
}
if ( $result === '' ) {
return array ();
}
return explode ( ',' , $result );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Save the selected options
*
* @ param array $data
* @ return mixed empty string ( data is not an array ) or bool true = success false = failure
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
if ( ! is_array ( $data )) {
return '' ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
$this -> load_choices ();
$save = array ();
2006-09-02 13:14:57 +00:00
foreach ( $data as $datum ) {
2007-12-19 17:35:20 +00:00
if ( $datum == 'none' or ! array_key_exists ( $datum , $this -> choices )) {
continue ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
$save [ $datum ] = $datum ; // no duplicates
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
return ( $this -> config_write ( $this -> name , implode ( ',' , $save )) ? '' : get_string ( 'errorsetting' , 'admin' ));
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Return XHTML select field and wrapping div
*
* @ todo Add vartype handling to make sure $data is an array
* @ param array $data Array of elements to select by default
* @ return string XHTML select field and wrapping div
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$this -> load_choices ();
$currentsetting = array ();
foreach ( $data as $key ) {
if ( $key != 'none' and array_key_exists ( $key , $this -> choices )) {
$currentsetting [] = $key ; // already selected first
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
2006-09-25 09:06:51 +00:00
$return = '<div class="form-group">' ;
2006-09-02 13:14:57 +00:00
for ( $i = 0 ; $i < count ( $this -> choices ) - 1 ; $i ++ ) {
2007-12-19 17:35:20 +00:00
if ( ! array_key_exists ( $i , $currentsetting )) {
$currentsetting [ $i ] = 'none' ; //none
}
$return .= '<select class="form-select" id="' . $this -> get_id () . $i . '" name="' . $this -> get_full_name () . '[]">' ;
2006-09-02 13:14:57 +00:00
foreach ( $this -> choices as $key => $value ) {
2007-12-19 17:35:20 +00:00
$return .= '<option value="' . $key . '"' . ( " $key " == $currentsetting [ $i ] ? ' selected="selected"' : '' ) . '>' . $value . '</option>' ;
2006-09-02 13:14:57 +00:00
}
$return .= '</select>' ;
if ( $i !== count ( $this -> choices ) - 2 ) {
2006-09-24 06:47:53 +00:00
$return .= '<br />' ;
2006-09-02 13:14:57 +00:00
}
}
2006-09-25 09:06:51 +00:00
$return .= '</div>' ;
2008-01-01 15:51:54 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , false , '' , NULL , $query );
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
/**
* Special checkbox for frontpage - stores data in course table
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2006-09-02 13:14:57 +00:00
class admin_setting_sitesetcheckbox extends admin_setting_configcheckbox {
2009-09-09 07:55:03 +00:00
/**
* Returns the current sites name
*
* @ return string
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2009-03-26 08:56:08 +00:00
$site = get_site ();
return $site -> { $this -> name };
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Save the selected setting
*
* @ param string $data The selected site
* @ return string empty string or error message
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2009-03-26 08:56:08 +00:00
global $DB , $SITE ;
2007-12-19 17:35:20 +00:00
$record = new object ();
$record -> id = SITEID ;
$record -> { $this -> name } = ( $data == '1' ? 1 : 0 );
$record -> timemodified = time ();
2009-03-26 08:56:08 +00:00
// update $SITE
$SITE -> { $this -> name } = $data ;
2008-05-15 21:40:00 +00:00
return ( $DB -> update_record ( 'course' , $record ) ? '' : get_string ( 'errorsetting' , 'admin' ));
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
/**
* Special text for frontpage - stores data in course table .
* Empty string means not set here . Manual setting is required .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2006-09-02 13:14:57 +00:00
class admin_setting_sitesettext extends admin_setting_configtext {
2009-09-09 07:55:03 +00:00
/**
* Return the current setting
*
* @ return mixed string or null
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2009-03-26 08:56:08 +00:00
$site = get_site ();
2009-03-26 13:32:28 +00:00
return $site -> { $this -> name } != '' ? $site -> { $this -> name } : NULL ;
2006-09-02 13:14:57 +00:00
}
2006-09-17 06:08:10 +00:00
2009-05-22 02:05:46 +00:00
/**
* Validate the selected data
*
* @ param string $data The selected value to validate
* @ return mixed true or message string
*/
2009-01-11 16:42:19 +00:00
public function validate ( $data ) {
2008-06-09 16:53:30 +00:00
$cleaned = clean_param ( $data , PARAM_MULTILANG );
2007-12-30 17:59:17 +00:00
if ( $cleaned === '' ) {
return get_string ( 'required' );
}
if ( " $data " == " $cleaned " ) { // implicit conversion to string is needed to do exact comparison
return true ;
} else {
return get_string ( 'validateerror' , 'admin' );
2006-10-16 07:37:41 +00:00
}
}
2009-05-22 02:05:46 +00:00
/**
* Save the selected setting
*
* @ param string $data The selected value
* @ return string emtpy or error message
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2009-03-26 08:56:08 +00:00
global $DB , $SITE ;
2006-10-16 07:37:41 +00:00
$data = trim ( $data );
2008-07-31 06:01:12 +00:00
$validated = $this -> validate ( $data );
2007-12-30 17:59:17 +00:00
if ( $validated !== true ) {
return $validated ;
2006-09-17 06:08:10 +00:00
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
$record = new object ();
$record -> id = SITEID ;
2008-05-15 21:40:00 +00:00
$record -> { $this -> name } = $data ;
2007-12-19 17:35:20 +00:00
$record -> timemodified = time ();
2009-03-26 08:56:08 +00:00
// update $SITE
$SITE -> { $this -> name } = $data ;
2008-05-15 21:40:00 +00:00
return ( $DB -> update_record ( 'course' , $record ) ? '' : get_string ( 'dbupdatefailed' , 'error' ));
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
/**
* Special text editor for site description .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2006-09-02 13:14:57 +00:00
class admin_setting_special_frontpagedesc extends admin_setting {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'summary' , get_string ( 'frontpagedescription' ), get_string ( 'frontpagedescriptionhelp' ), NULL );
2009-06-24 22:34:29 +00:00
editors_head_setup ();
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Return the current setting
* @ return string The current setting
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2009-03-26 08:56:08 +00:00
$site = get_site ();
return $site -> { $this -> name };
2007-10-03 10:35:34 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Save the new setting
*
* @ param string $data The new value to save
* @ return string empty or error message
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2009-03-26 08:56:08 +00:00
global $DB , $SITE ;
2007-10-03 10:35:34 +00:00
$record = new object ();
2007-12-19 17:35:20 +00:00
$record -> id = SITEID ;
2008-05-15 21:40:00 +00:00
$record -> { $this -> name } = $data ;
2007-10-03 10:35:34 +00:00
$record -> timemodified = time ();
2009-03-26 08:56:08 +00:00
$SITE -> { $this -> name } = $data ;
2009-03-11 02:42:28 +00:00
return ( $DB -> update_record ( 'course' , $record ) ? '' : get_string ( 'errorsetting' , 'admin' ));
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Returns XHTML for the field plus wrapping div
*
* @ param string $data The current value
* @ param string $query
* @ return string The XHTML output
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2008-07-30 07:58:05 +00:00
global $CFG ;
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
$CFG -> adminusehtmleditor = can_use_html_editor ();
2008-06-11 08:37:26 +00:00
$return = '<div class="form-htmlarea">' . print_textarea ( $CFG -> adminusehtmleditor , 15 , 60 , 0 , 0 , $this -> get_full_name (), $data , 0 , true , 'summary' ) . '</div>' ;
2007-12-19 17:35:20 +00:00
2008-01-01 15:51:54 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , false , '' , NULL , $query );
2007-12-19 17:35:20 +00:00
}
}
2006-09-02 13:14:57 +00:00
2009-05-22 02:05:46 +00:00
/**
* Special font selector for use in admin section
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2006-09-02 13:14:57 +00:00
class admin_setting_special_editorfontlist extends admin_setting {
2009-09-09 07:55:03 +00:00
/**
* Construct method , calls parent :: __construct with specific args
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
2006-09-02 13:14:57 +00:00
global $CFG ;
$name = 'editorfontlist' ;
$visiblename = get_string ( 'editorfontlist' , 'admin' );
$description = get_string ( 'configeditorfontlist' , 'admin' );
$defaults = array ( 'k0' => 'Trebuchet' ,
2009-09-09 07:55:03 +00:00
'v0' => 'Trebuchet MS,Verdana,Arial,Helvetica,sans-serif' ,
'k1' => 'Arial' ,
'v1' => 'arial,helvetica,sans-serif' ,
'k2' => 'Courier New' ,
'v2' => 'courier new,courier,monospace' ,
'k3' => 'Georgia' ,
'v3' => 'georgia,times new roman,times,serif' ,
'k4' => 'Tahoma' ,
'v4' => 'tahoma,arial,helvetica,sans-serif' ,
'k5' => 'Times New Roman' ,
'v5' => 'times new roman,times,serif' ,
'k6' => 'Verdana' ,
'v6' => 'verdana,arial,helvetica,sans-serif' ,
'k7' => 'Impact' ,
'v7' => 'impact' ,
'k8' => 'Wingdings' ,
'v8' => 'wingdings' );
2009-01-11 16:42:19 +00:00
parent :: __construct ( $name , $visiblename , $description , $defaults );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Return the current setting
2009-06-30 15:19:12 +00:00
*
2009-05-22 02:05:46 +00:00
* @ return array Array of the current setting ( s )
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2006-09-18 02:41:14 +00:00
global $CFG ;
2007-12-19 17:35:20 +00:00
$result = $this -> config_read ( $this -> name );
if ( is_null ( $result )) {
2006-09-18 02:41:14 +00:00
return NULL ;
}
2007-12-19 17:35:20 +00:00
$i = 0 ;
$currentsetting = array ();
$items = explode ( ';' , $result );
foreach ( $items as $item ) {
2009-09-09 07:55:03 +00:00
$item = explode ( ':' , $item );
$currentsetting [ 'k' . $i ] = $item [ 0 ];
$currentsetting [ 'v' . $i ] = $item [ 1 ];
$i ++ ;
2007-12-19 17:35:20 +00:00
}
return $currentsetting ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Save the new setting ( s )
*
* @ todo Add vartype handling to ensure $data is an array
* @ param array $data Array containing the new settings
* @ return bool
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2006-09-20 21:00:45 +00:00
2009-09-09 07:55:03 +00:00
// there miiight be an easier way to do this :)
// if this is changed, make sure the $defaults array above is modified so that this
// function processes it correctly
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
$keys = array ();
$values = array ();
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
foreach ( $data as $key => $value ) {
if ( substr ( $key , 0 , 1 ) == 'k' ) {
$keys [ substr ( $key , 1 )] = $value ;
} elseif ( substr ( $key , 0 , 1 ) == 'v' ) {
$values [ substr ( $key , 1 )] = $value ;
}
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
$result = array ();
2006-09-02 13:14:57 +00:00
for ( $i = 0 ; $i < count ( $keys ); $i ++ ) {
if (( $keys [ $i ] !== '' ) && ( $values [ $i ] !== '' )) {
2007-12-19 17:35:20 +00:00
$result [] = clean_param ( $keys [ $i ], PARAM_NOTAGS ) . ':' . clean_param ( $values [ $i ], PARAM_NOTAGS );
2006-09-02 13:14:57 +00:00
}
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
return ( $this -> config_write ( $this -> name , implode ( ';' , $result )) ? '' : get_string ( 'errorsetting' , 'admin' ));
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Returns XHTML for the options
*
* @ todo Add vartype handling to ensure that $data is an array
* @ param array $data An array of values to set
* @ param string $query
* @ return string XHTML
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$fullname = $this -> get_full_name ();
2006-09-25 14:34:33 +00:00
$return = '<div class="form-group">' ;
2007-12-19 17:35:20 +00:00
for ( $i = 0 ; $i < count ( $data ) / 2 ; $i ++ ) {
$return .= '<input type="text" class="form-text" name="' . $fullname . '[k' . $i . ']" value="' . $data [ 'k' . $i ] . '" />' ;
2006-09-02 13:14:57 +00:00
$return .= ' ' ;
2007-12-19 17:35:20 +00:00
$return .= '<input type="text" class="form-text" name="' . $fullname . '[v' . $i . ']" value="' . $data [ 'v' . $i ] . '" /><br />' ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
$return .= '<input type="text" class="form-text" name="' . $fullname . '[k' . $i . ']" value="" />' ;
2006-09-02 13:14:57 +00:00
$return .= ' ' ;
2007-12-19 17:35:20 +00:00
$return .= '<input type="text" class="form-text" name="' . $fullname . '[v' . $i . ']" value="" /><br />' ;
$return .= '<input type="text" class="form-text" name="' . $fullname . '[k' . ( $i + 1 ) . ']" value="" />' ;
2006-09-02 13:14:57 +00:00
$return .= ' ' ;
2007-12-19 17:35:20 +00:00
$return .= '<input type="text" class="form-text" name="' . $fullname . '[v' . ( $i + 1 ) . ']" value="" />' ;
2006-09-25 14:34:33 +00:00
$return .= '</div>' ;
2006-09-25 07:35:43 +00:00
2008-01-01 15:51:54 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , false , '' , NULL , $query );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Special settings for emoticons
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2007-12-03 06:27:21 +00:00
class admin_setting_emoticons extends admin_setting {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific args
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
2007-12-03 06:27:21 +00:00
global $CFG ;
$name = 'emoticons' ;
$visiblename = get_string ( 'emoticons' , 'admin' );
$description = get_string ( 'configemoticons' , 'admin' );
$defaults = array ( 'k0' => ':-)' ,
2009-09-09 07:55:03 +00:00
'v0' => 'smiley' ,
'k1' => ':)' ,
'v1' => 'smiley' ,
'k2' => ':-D' ,
'v2' => 'biggrin' ,
'k3' => ';-)' ,
'v3' => 'wink' ,
'k4' => ':-/' ,
'v4' => 'mixed' ,
'k5' => 'V-.' ,
'v5' => 'thoughtful' ,
'k6' => ':-P' ,
'v6' => 'tongueout' ,
'k7' => 'B-)' ,
'v7' => 'cool' ,
'k8' => '^-)' ,
'v8' => 'approve' ,
'k9' => '8-)' ,
'v9' => 'wideeyes' ,
'k10' => ':o)' ,
'v10' => 'clown' ,
'k11' => ':-(' ,
'v11' => 'sad' ,
'k12' => ':(' ,
'v12' => 'sad' ,
'k13' => '8-.' ,
'v13' => 'shy' ,
'k14' => ':-I' ,
'v14' => 'blush' ,
'k15' => ':-X' ,
'v15' => 'kiss' ,
'k16' => '8-o' ,
'v16' => 'surprise' ,
'k17' => 'P-|' ,
'v17' => 'blackeye' ,
'k18' => '8-[' ,
'v18' => 'angry' ,
'k19' => 'xx-P' ,
'v19' => 'dead' ,
'k20' => '|-.' ,
'v20' => 'sleepy' ,
'k21' => '}-]' ,
'v21' => 'evil' ,
'k22' => '(h)' ,
'v22' => 'heart' ,
'k23' => '(heart)' ,
'v23' => 'heart' ,
'k24' => '(y)' ,
'v24' => 'yes' ,
'k25' => '(n)' ,
'v25' => 'no' ,
'k26' => '(martin)' ,
'v26' => 'martin' ,
'k27' => '( )' ,
'v27' => 'egg' );
2009-01-11 16:42:19 +00:00
parent :: __construct ( $name , $visiblename , $description , $defaults );
2007-12-03 06:27:21 +00:00
}
2009-06-30 15:19:12 +00:00
2009-05-22 02:05:46 +00:00
/**
* Return the current setting ( s )
*
* @ return array Current settings array
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-03 06:27:21 +00:00
global $CFG ;
2007-12-19 17:35:20 +00:00
$result = $this -> config_read ( $this -> name );
if ( is_null ( $result )) {
2007-12-03 06:27:21 +00:00
return NULL ;
}
2007-12-19 17:35:20 +00:00
$i = 0 ;
$currentsetting = array ();
$items = explode ( '{;}' , $result );
foreach ( $items as $item ) {
2009-09-09 07:55:03 +00:00
$item = explode ( '{:}' , $item );
$currentsetting [ 'k' . $i ] = $item [ 0 ];
$currentsetting [ 'v' . $i ] = $item [ 1 ];
$i ++ ;
2007-12-19 17:35:20 +00:00
}
return $currentsetting ;
2007-12-03 06:27:21 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Save selected settings
*
* @ param array $data Array of settings to save
* @ return bool
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-03 06:27:21 +00:00
2009-09-09 07:55:03 +00:00
// there miiight be an easier way to do this :)
// if this is changed, make sure the $defaults array above is modified so that this
// function processes it correctly
2007-12-03 06:27:21 +00:00
$keys = array ();
$values = array ();
foreach ( $data as $key => $value ) {
if ( substr ( $key , 0 , 1 ) == 'k' ) {
$keys [ substr ( $key , 1 )] = $value ;
} elseif ( substr ( $key , 0 , 1 ) == 'v' ) {
$values [ substr ( $key , 1 )] = $value ;
}
}
2007-12-19 17:35:20 +00:00
$result = array ();
2007-12-03 06:27:21 +00:00
for ( $i = 0 ; $i < count ( $keys ); $i ++ ) {
if (( $keys [ $i ] !== '' ) && ( $values [ $i ] !== '' )) {
2007-12-19 17:35:20 +00:00
$result [] = clean_param ( $keys [ $i ], PARAM_NOTAGS ) . '{:}' . clean_param ( $values [ $i ], PARAM_NOTAGS );
2007-12-03 06:27:21 +00:00
}
}
2007-12-19 17:35:20 +00:00
return ( $this -> config_write ( $this -> name , implode ( '{;}' , $result )) ? '' : get_string ( 'errorsetting' , 'admin' ) . $this -> visiblename . '<br />' );
2007-12-03 06:27:21 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Return XHTML field ( s ) for options
*
* @ param array $data Array of options to set in HTML
* @ return string XHTML string for the fields and wrapping div ( s )
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$fullname = $this -> get_full_name ();
2007-12-03 06:27:21 +00:00
$return = '<div class="form-group">' ;
2007-12-19 17:35:20 +00:00
for ( $i = 0 ; $i < count ( $data ) / 2 ; $i ++ ) {
$return .= '<input type="text" class="form-text" name="' . $fullname . '[k' . $i . ']" value="' . $data [ 'k' . $i ] . '" />' ;
2007-12-03 06:27:21 +00:00
$return .= ' ' ;
2007-12-19 17:35:20 +00:00
$return .= '<input type="text" class="form-text" name="' . $fullname . '[v' . $i . ']" value="' . $data [ 'v' . $i ] . '" /><br />' ;
2007-12-03 06:27:21 +00:00
}
2007-12-19 17:35:20 +00:00
$return .= '<input type="text" class="form-text" name="' . $fullname . '[k' . $i . ']" value="" />' ;
2007-12-03 06:27:21 +00:00
$return .= ' ' ;
2007-12-19 17:35:20 +00:00
$return .= '<input type="text" class="form-text" name="' . $fullname . '[v' . $i . ']" value="" /><br />' ;
$return .= '<input type="text" class="form-text" name="' . $fullname . '[k' . ( $i + 1 ) . ']" value="" />' ;
2007-12-03 06:27:21 +00:00
$return .= ' ' ;
2007-12-19 17:35:20 +00:00
$return .= '<input type="text" class="form-text" name="' . $fullname . '[v' . ( $i + 1 ) . ']" value="" />' ;
2007-12-03 06:27:21 +00:00
$return .= '</div>' ;
2008-01-01 15:51:54 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , false , '' , NULL , $query );
2007-12-03 06:27:21 +00:00
}
}
2009-05-22 02:05:46 +00:00
/**
* Used to set editor options / settings
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2007-12-03 06:27:21 +00:00
2006-09-02 13:14:57 +00:00
class admin_setting_special_editorhidebuttons extends admin_setting {
2009-09-09 07:55:03 +00:00
/** @var array Array of possible options */
2009-01-11 16:42:19 +00:00
public $items ;
2006-09-02 13:14:57 +00:00
2009-05-22 02:05:46 +00:00
/**
* Calls parent :: __construct with specific options
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'editorhidebuttons' , get_string ( 'editorhidebuttons' , 'admin' ),
2009-09-09 07:55:03 +00:00
get_string ( 'confeditorhidebuttons' , 'admin' ), array ());
2006-09-02 13:14:57 +00:00
// weird array... buttonname => buttonimage (assume proper path appended). if you leave buttomimage blank, text will be printed instead
$this -> items = array ( 'fontname' => '' ,
2009-09-09 07:55:03 +00:00
'fontsize' => '' ,
'formatblock' => '' ,
'bold' => 'ed_format_bold.gif' ,
'italic' => 'ed_format_italic.gif' ,
'underline' => 'ed_format_underline.gif' ,
'strikethrough' => 'ed_format_strike.gif' ,
'subscript' => 'ed_format_sub.gif' ,
'superscript' => 'ed_format_sup.gif' ,
'copy' => 'ed_copy.gif' ,
'cut' => 'ed_cut.gif' ,
'paste' => 'ed_paste.gif' ,
'clean' => 'ed_wordclean.gif' ,
'undo' => 'ed_undo.gif' ,
'redo' => 'ed_redo.gif' ,
'justifyleft' => 'ed_align_left.gif' ,
'justifycenter' => 'ed_align_center.gif' ,
'justifyright' => 'ed_align_right.gif' ,
'justifyfull' => 'ed_align_justify.gif' ,
'lefttoright' => 'ed_left_to_right.gif' ,
'righttoleft' => 'ed_right_to_left.gif' ,
'insertorderedlist' => 'ed_list_num.gif' ,
'insertunorderedlist' => 'ed_list_bullet.gif' ,
'outdent' => 'ed_indent_less.gif' ,
'indent' => 'ed_indent_more.gif' ,
'forecolor' => 'ed_color_fg.gif' ,
'hilitecolor' => 'ed_color_bg.gif' ,
'inserthorizontalrule' => 'ed_hr.gif' ,
'createanchor' => 'ed_anchor.gif' ,
'createlink' => 'ed_link.gif' ,
'unlink' => 'ed_unlink.gif' ,
'insertimage' => 'ed_image.gif' ,
'inserttable' => 'insert_table.gif' ,
'insertsmile' => 'em.icon.smile.gif' ,
'insertchar' => 'icon_ins_char.gif' ,
'spellcheck' => 'spell-check.gif' ,
'htmlmode' => 'ed_html.gif' ,
'popupeditor' => 'fullscreen_maximize.gif' ,
'search_replace' => 'ed_replace.gif' );
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Get an array of current settings
*
* @ return array Array of current settings
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
$result = $this -> config_read ( $this -> name );
if ( is_null ( $result )) {
return NULL ;
}
if ( $result === '' ) {
return array ();
}
2008-03-15 16:37:41 +00:00
return explode ( ' ' , $result );
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Save the selected settings
*
* @ param array $data Array of settings to save
* @ return mixed empty string , error string , or bool true => success , false => error
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
if ( ! is_array ( $data )) {
return '' ; // ignore it
}
unset ( $data [ 'xxxxx' ]);
2006-09-02 13:14:57 +00:00
$result = array ();
2007-12-19 17:35:20 +00:00
2006-09-02 13:14:57 +00:00
foreach ( $data as $key => $value ) {
2008-03-15 16:37:41 +00:00
if ( ! isset ( $this -> items [ $key ])) {
2007-12-19 17:35:20 +00:00
return get_string ( 'errorsetting' , 'admin' );
2006-09-02 13:14:57 +00:00
}
if ( $value == '1' ) {
$result [] = $key ;
}
}
2007-12-19 17:35:20 +00:00
return ( $this -> config_write ( $this -> name , implode ( ' ' , $result )) ? '' : get_string ( 'errorsetting' , 'admin' ));
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Return XHTML for the field and wrapping div ( s )
*
* @ param array $data
* @ param string $query
* @ return string XHTML for output
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
global $CFG ;
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
// checkboxes with input name="$this->name[$key]" value="1"
// we do 15 fields per column
2006-09-20 21:00:45 +00:00
2006-09-25 14:34:33 +00:00
$return = '<div class="form-group">' ;
$return .= '<table><tr><td valign="top" align="right">' ;
2007-12-19 17:35:20 +00:00
$return .= '<input type="hidden" name="' . $this -> get_full_name () . '[xxxxx]" value="1" />' ; // something must be submitted even if nothing selected
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
$count = 0 ;
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
foreach ( $this -> items as $key => $value ) {
2006-11-30 09:28:06 +00:00
if ( $count % 15 == 0 and $count != 0 ) {
$return .= '</td><td valign="top" align="right">' ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2008-03-15 16:37:41 +00:00
$return .= '<label for="' . $this -> get_id () . $key . '">' ;
2007-12-19 17:35:20 +00:00
$return .= ( $value == '' ? get_string ( $key , 'editor' ) : '<img width="18" height="18" src="' . $CFG -> wwwroot . '/lib/editor/htmlarea/images/' . $value . '" alt="' . get_string ( $key , 'editor' ) . '" title="' . get_string ( $key , 'editor' ) . '" />' ) . ' ' ;
$return .= '<input type="checkbox" class="form-checkbox" value="1" id="' . $this -> get_id () . $key . '" name="' . $this -> get_full_name () . '[' . $key . ']"' . ( in_array ( $key , $data ) ? ' checked="checked"' : '' ) . ' /> ' ;
2008-03-15 16:37:41 +00:00
$return .= '</label>' ;
2006-09-02 13:14:57 +00:00
$count ++ ;
if ( $count % 15 != 0 ) {
$return .= '<br /><br />' ;
}
}
2006-09-20 21:00:45 +00:00
$return .= '</td></tr>' ;
2006-09-02 13:14:57 +00:00
$return .= '</table>' ;
2006-09-25 14:34:33 +00:00
$return .= '</div>' ;
2006-09-02 13:14:57 +00:00
2008-01-01 15:51:54 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , false , '' , NULL , $query );
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
/**
* Special setting for limiting of the list of available languages .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2007-04-24 16:33:06 +00:00
class admin_setting_langlist extends admin_setting_configtext {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'langlist' , get_string ( 'langlist' , 'admin' ), get_string ( 'configlanglist' , 'admin' ), '' , PARAM_NOTAGS );
2007-04-24 16:33:06 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Save the new setting
*
* @ param string $data The new setting
* @ return bool
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-04-24 16:33:06 +00:00
$return = parent :: write_setting ( $data );
2010-04-14 09:45:49 +00:00
//TODO: reset lang cache
2007-04-24 16:33:06 +00:00
return $return ;
}
}
2009-10-02 11:30:11 +00:00
/**
* Selection of one of the recognised countries using the list
* returned by { @ link get_list_of_countries ()} .
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
class admin_settings_country_select extends admin_setting_configselect {
2010-04-14 14:27:10 +00:00
protected $includeall ;
public function __construct ( $name , $visiblename , $description , $defaultsetting , $includeall = false ) {
$this -> includeall = $includeall ;
2009-10-02 11:30:11 +00:00
parent :: __construct ( $name , $visiblename , $description , $defaultsetting , NULL );
}
/**
* Lazy - load the available choices for the select box
*/
public function load_choices () {
global $CFG ;
if ( is_array ( $this -> choices )) {
return true ;
}
$this -> choices = array_merge (
array ( '0' => get_string ( 'choosedots' )),
2010-04-14 14:27:10 +00:00
get_string_manager () -> get_list_of_countries ( $this -> includeall ));
2009-10-02 11:30:11 +00:00
return true ;
}
}
2007-12-19 17:35:20 +00:00
/**
* Course category selection
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_settings_coursecat_select extends admin_setting_configselect {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting ) {
parent :: __construct ( $name , $visiblename , $description , $defaultsetting , NULL );
2007-12-19 17:35:20 +00:00
}
2006-09-25 07:35:43 +00:00
2009-05-22 02:05:46 +00:00
/**
* Load the available choices for the select box
*
* @ return bool
*/
2009-01-11 16:42:19 +00:00
public function load_choices () {
2007-12-19 17:35:20 +00:00
global $CFG ;
require_once ( $CFG -> dirroot . '/course/lib.php' );
if ( is_array ( $this -> choices )) {
return true ;
}
$this -> choices = make_categories_options ();
return true ;
}
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Special control for selecting days to backup
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2007-12-19 17:35:20 +00:00
class admin_setting_special_backupdays extends admin_setting_configmulticheckbox2 {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'backup_sche_weekdays' , get_string ( 'schedule' ), get_string ( 'backupschedulehelp' ), array (), NULL );
2007-12-19 17:35:20 +00:00
$this -> plugin = 'backup' ;
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Load the available choices for the select box
*
* @ return bool Always returns true
*/
2009-01-11 16:42:19 +00:00
public function load_choices () {
2007-12-19 17:35:20 +00:00
if ( is_array ( $this -> choices )) {
return true ;
}
$this -> choices = array ();
$days = array ( 'sunday' , 'monday' , 'tuesday' , 'wednesday' , 'thursday' , 'friday' , 'saturday' );
foreach ( $days as $day ) {
$this -> choices [ $day ] = get_string ( $day , 'calendar' );
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
return true ;
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
/**
* Special debug setting
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2006-09-13 09:22:16 +00:00
class admin_setting_special_debug extends admin_setting_configselect {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'debug' , get_string ( 'debug' , 'admin' ), get_string ( 'configdebug' , 'admin' ), DEBUG_NONE , NULL );
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Load the available choices for the select box
*
* @ return bool
*/
2009-01-11 16:42:19 +00:00
public function load_choices () {
2007-12-19 17:35:20 +00:00
if ( is_array ( $this -> choices )) {
return true ;
2006-09-13 09:22:16 +00:00
}
2007-12-19 17:35:20 +00:00
$this -> choices = array ( DEBUG_NONE => get_string ( 'debugnone' , 'admin' ),
2009-09-09 07:55:03 +00:00
DEBUG_MINIMAL => get_string ( 'debugminimal' , 'admin' ),
DEBUG_NORMAL => get_string ( 'debugnormal' , 'admin' ),
DEBUG_ALL => get_string ( 'debugall' , 'admin' ),
DEBUG_DEVELOPER => get_string ( 'debugdeveloper' , 'admin' ));
2007-12-19 17:35:20 +00:00
return true ;
2006-09-02 13:14:57 +00:00
}
}
2009-05-22 02:05:46 +00:00
/**
* Special admin control
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2006-09-02 13:14:57 +00:00
class admin_setting_special_calendar_weekend extends admin_setting {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
2006-09-02 13:14:57 +00:00
$name = 'calendar_weekend' ;
$visiblename = get_string ( 'calendar_weekend' , 'admin' );
$description = get_string ( 'helpweekenddays' , 'admin' );
2007-03-05 11:57:15 +00:00
$default = array ( '0' , '6' ); // Saturdays and Sundays
2009-01-11 16:42:19 +00:00
parent :: __construct ( $name , $visiblename , $description , $default );
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Gets the current settins as an array
*
* @ return mixed Null if none , else array of settings
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
$result = $this -> config_read ( $this -> name );
if ( is_null ( $result )) {
return NULL ;
}
if ( $result === '' ) {
return array ();
}
$settings = array ();
for ( $i = 0 ; $i < 7 ; $i ++ ) {
if ( $result & ( 1 << $i )) {
2008-08-31 20:45:10 +00:00
$settings [] = $i ;
2007-12-19 17:35:20 +00:00
}
}
2008-08-31 20:45:10 +00:00
return $settings ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Save the new settings
*
* @ param array $data Array of new settings
* @ return bool
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
if ( ! is_array ( $data )) {
return '' ;
}
unset ( $data [ 'xxxxx' ]);
2007-02-27 12:42:08 +00:00
$result = 0 ;
2007-12-19 17:35:20 +00:00
foreach ( $data as $index ) {
$result |= 1 << $index ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
return ( $this -> config_write ( $this -> name , $result ) ? '' : get_string ( 'errorsetting' , 'admin' ));
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2009-05-22 02:05:46 +00:00
/**
* Return XHTML to display the control
*
* @ param array $data array of selected days
* @ param string $query
* @ return string XHTML for display ( field + wrapping div ( s )
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2009-09-09 07:55:03 +00:00
// The order matters very much because of the implied numeric keys
2007-02-27 12:42:08 +00:00
$days = array ( 'sunday' , 'monday' , 'tuesday' , 'wednesday' , 'thursday' , 'friday' , 'saturday' );
$return = '<table><thead><tr>' ;
2007-12-19 17:35:20 +00:00
$return .= '<input type="hidden" name="' . $this -> get_full_name () . '[xxxxx]" value="1" />' ; // something must be submitted even if nothing selected
2007-02-27 12:42:08 +00:00
foreach ( $days as $index => $day ) {
2007-12-19 17:35:20 +00:00
$return .= '<td><label for="' . $this -> get_id () . $index . '">' . get_string ( $day , 'calendar' ) . '</label></td>' ;
2007-02-27 12:42:08 +00:00
}
$return .= '</tr></thead><tbody><tr>' ;
foreach ( $days as $index => $day ) {
2007-12-19 17:35:20 +00:00
$return .= '<td><input type="checkbox" class="form-checkbox" id="' . $this -> get_id () . $index . '" name="' . $this -> get_full_name () . '[]" value="' . $index . '" ' . ( in_array ( " $index " , $data ) ? 'checked="checked"' : '' ) . ' /></td>' ;
2007-02-27 12:42:08 +00:00
}
$return .= '</tr></tbody></table>' ;
2006-09-25 07:35:43 +00:00
2008-01-01 15:51:54 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , false , '' , NULL , $query );
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
}
}
2007-12-19 17:35:20 +00:00
2007-11-15 17:32:31 +00:00
/**
2008-07-28 12:31:29 +00:00
* Admin setting that allows a user to pick appropriate roles for something .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2006-10-25 08:51:26 +00:00
*/
2008-07-28 12:31:29 +00:00
class admin_setting_pickroles extends admin_setting_configmulticheckbox {
2009-09-09 07:55:03 +00:00
/** @var array Array of capabilities which identify roles */
2008-07-28 12:31:29 +00:00
private $types ;
/**
* @ param string $name Name of config variable
* @ param string $visiblename Display name
* @ param string $description Description
2010-03-31 07:41:31 +00:00
* @ param array $types Array of archetypes which identify
* roles that will be enabled by default .
2008-07-28 12:31:29 +00:00
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $types ) {
parent :: __construct ( $name , $visiblename , $description , NULL , NULL );
2008-08-16 12:16:01 +00:00
$this -> types = $types ;
2006-10-25 08:51:26 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Load roles as choices
*
* @ return bool true => success , false => error
*/
2009-01-11 16:42:19 +00:00
public function load_choices () {
2008-05-15 21:40:00 +00:00
global $CFG , $DB ;
2009-06-24 09:17:56 +00:00
if ( during_initial_install ()) {
2007-12-19 17:35:20 +00:00
return false ;
}
if ( is_array ( $this -> choices )) {
return true ;
}
2008-11-13 08:40:57 +00:00
if ( $roles = get_all_roles ()) {
2007-12-19 17:35:20 +00:00
$this -> choices = array ();
foreach ( $roles as $role ) {
$this -> choices [ $role -> id ] = format_string ( $role -> name );
2006-11-08 02:42:48 +00:00
}
2007-12-19 17:35:20 +00:00
return true ;
2006-10-25 08:51:26 +00:00
} else {
2007-12-19 17:35:20 +00:00
return false ;
2006-10-25 08:51:26 +00:00
}
}
2009-05-22 02:05:46 +00:00
/**
* Return the default setting for this control
*
* @ return array Array of default settings
*/
2009-01-11 16:42:19 +00:00
public function get_defaultsetting () {
2007-12-19 17:35:20 +00:00
global $CFG ;
2008-08-28 07:08:08 +00:00
2009-06-24 09:17:56 +00:00
if ( during_initial_install ()) {
2008-08-16 12:16:01 +00:00
return null ;
2007-12-19 17:35:20 +00:00
}
$result = array ();
2010-03-31 07:41:31 +00:00
foreach ( $this -> types as $archetype ) {
if ( $caproles = get_archetype_roles ( $archetype )) {
2008-07-28 12:31:29 +00:00
foreach ( $caproles as $caprole ) {
2008-08-28 07:08:08 +00:00
$result [ $caprole -> id ] = 1 ;
2008-07-28 12:31:29 +00:00
}
2006-10-25 08:51:26 +00:00
}
2006-10-27 21:07:18 +00:00
}
2007-12-19 17:35:20 +00:00
return $result ;
2006-10-25 08:51:26 +00:00
}
2007-12-19 17:35:20 +00:00
}
2006-10-25 08:51:26 +00:00
2008-08-26 01:05:01 +00:00
/**
2009-06-30 16:55:56 +00:00
* Text field with an advanced checkbox , that controls a additional $name . '_adv' setting .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2008-08-26 01:05:01 +00:00
*/
2009-06-30 15:23:33 +00:00
class admin_setting_configtext_with_advanced extends admin_setting_configtext {
2009-09-09 07:55:03 +00:00
/**
* Constructor
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
* @ param string $visiblename localised
* @ param string $description long localised info
* @ param array $defaultsetting ( 'value' => string , '__construct' => bool )
* @ param mixed $paramtype int means PARAM_XXX type , string is a allowed format in regex
* @ param int $size default field size
*/
2009-06-30 16:55:56 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting , $paramtype = PARAM_RAW , $size = null ) {
parent :: __construct ( $name , $visiblename , $description , $defaultsetting , $paramtype , $size );
2008-08-26 01:05:01 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Loads the current setting and returns array
*
2009-06-30 16:55:56 +00:00
* @ return array Returns array value => xx , __construct => xx
2009-05-22 02:05:46 +00:00
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2008-08-26 01:05:01 +00:00
$value = parent :: get_setting ();
2009-06-30 16:55:56 +00:00
$adv = $this -> config_read ( $this -> name . '_adv' );
if ( is_null ( $value ) or is_null ( $adv )) {
2008-08-26 01:05:01 +00:00
return NULL ;
}
2009-06-30 16:55:56 +00:00
return array ( 'value' => $value , 'adv' => $adv );
2008-08-26 01:05:01 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Saves the new settings passed in $data
*
* @ todo Add vartype handling to ensure $data is an array
* @ param array $data
* @ return mixed string or Array
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2008-08-26 01:05:01 +00:00
$error = parent :: write_setting ( $data [ 'value' ]);
if ( ! $error ) {
2009-06-30 16:55:56 +00:00
$value = empty ( $data [ 'adv' ]) ? 0 : 1 ;
$this -> config_write ( $this -> name . '_adv' , $value );
2008-08-26 01:05:01 +00:00
}
return $error ;
}
2009-05-22 02:05:46 +00:00
/**
* Return XHTML for the control
*
* @ param array $data Default data array
* @ param string $query
* @ return string XHTML to display control
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2008-08-26 01:05:01 +00:00
$default = $this -> get_defaultsetting ();
$defaultinfo = array ();
2009-03-10 06:43:07 +00:00
if ( isset ( $default [ 'value' ])) {
if ( $default [ 'value' ] === '' ) {
$defaultinfo [] = " '' " ;
} else {
$defaultinfo [] = $default [ 'value' ];
}
2008-08-26 01:05:01 +00:00
}
2009-06-30 16:55:56 +00:00
if ( ! empty ( $default [ 'adv' ])) {
2008-08-26 01:05:01 +00:00
$defaultinfo [] = get_string ( 'advanced' );
}
$defaultinfo = implode ( ', ' , $defaultinfo );
2009-06-30 16:55:56 +00:00
$adv = ! empty ( $data [ 'adv' ]);
2008-09-02 08:58:53 +00:00
$return = '<div class="form-text defaultsnext">' .
2009-09-09 07:55:03 +00:00
'<input type="text" size="' . $this -> size . '" id="' . $this -> get_id () .
'" name="' . $this -> get_full_name () . '[value]" value="' . s ( $data [ 'value' ]) . '" />' .
' <input type="checkbox" class="form-checkbox" id="' .
$this -> get_id () . '_adv" name="' . $this -> get_full_name () .
'[adv]" value="1" ' . ( $adv ? 'checked="checked"' : '' ) . ' />' .
' <label for="' . $this -> get_id () . '_adv">' .
get_string ( 'advanced' ) . '</label></div>' ;
2008-08-26 01:05:01 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return ,
2009-09-09 07:55:03 +00:00
$this -> description , true , '' , $defaultinfo , $query );
2008-08-26 01:05:01 +00:00
}
}
/**
2009-06-30 16:55:56 +00:00
* Checkbox with an advanced checkbox that controls an additional $name . '_adv' config setting .
*
* @ copyright 2009 Petr Skoda ( http :// skodak . org )
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
class admin_setting_configcheckbox_with_advanced extends admin_setting_configcheckbox {
2009-09-09 07:55:03 +00:00
/**
* Constructor
* @ param string $name unique ascii name , either 'mysetting' for settings that in config , or 'myplugin/mysetting' for ones in config_plugins .
* @ param string $visiblename localised
* @ param string $description long localised info
* @ param array $defaultsetting ( 'value' => string , 'adv' => bool )
* @ param string $yes value used when checked
* @ param string $no value used when not checked
*/
2009-06-30 16:55:56 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting , $yes = '1' , $no = '0' ) {
parent :: __construct ( $name , $visiblename , $description , $defaultsetting , $yes , $no );
}
/**
* Loads the current setting and returns array
*
* @ return array Returns array value => xx , adv => xx
*/
public function get_setting () {
$value = parent :: get_setting ();
$adv = $this -> config_read ( $this -> name . '_adv' );
if ( is_null ( $value ) or is_null ( $adv )) {
return NULL ;
}
return array ( 'value' => $value , 'adv' => $adv );
}
/**
* Sets the value for the setting
*
* Sets the value for the setting to either the yes or no values
* of the object by comparing $data to yes
*
* @ param mixed $data Gets converted to str for comparison against yes value
* @ return string empty string or error
*/
public function write_setting ( $data ) {
$error = parent :: write_setting ( $data [ 'value' ]);
if ( ! $error ) {
$value = empty ( $data [ 'adv' ]) ? 0 : 1 ;
$this -> config_write ( $this -> name . '_adv' , $value );
}
return $error ;
}
/**
* Returns an XHTML checkbox field and with extra advanced cehckbox
*
* @ param string $data If $data matches yes then checkbox is checked
* @ param string $query
* @ return string XHTML field
*/
public function output_html ( $data , $query = '' ) {
$defaults = $this -> get_defaultsetting ();
$defaultinfo = array ();
if ( ! is_null ( $defaults )) {
if (( string ) $defaults [ 'value' ] === $this -> yes ) {
$defaultinfo [] = get_string ( 'checkboxyes' , 'admin' );
} else {
$defaultinfo [] = get_string ( 'checkboxno' , 'admin' );
}
if ( ! empty ( $defaults [ 'adv' ])) {
$defaultinfo [] = get_string ( 'advanced' );
}
}
$defaultinfo = implode ( ', ' , $defaultinfo );
if (( string ) $data [ 'value' ] === $this -> yes ) { // convert to strings before comparison
$checked = 'checked="checked"' ;
} else {
$checked = '' ;
}
if ( ! empty ( $data [ 'adv' ])) {
$advanced = 'checked="checked"' ;
} else {
$advanced = '' ;
}
$fullname = $this -> get_full_name ();
$novalue = s ( $this -> no );
$yesvalue = s ( $this -> yes );
$id = $this -> get_id ();
$stradvanced = get_string ( 'advanced' );
$return = <<< EOT
< div class = " form-checkbox defaultsnext " >
< input type = " hidden " name = " { $fullname } [value] " value = " $novalue " />
< input type = " checkbox " id = " $id " name = " { $fullname } [value] " value = " $yesvalue " $checked />
< input type = " checkbox " class = " form-checkbox " id = " { $id } _adv " name = " { $fullname } [adv] " value = " 1 " $advanced />
< label for = " { $id } _adv " > $stradvanced </ label >
</ div >
EOT ;
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description ,
2009-09-09 07:55:03 +00:00
true , '' , $defaultinfo , $query );
2009-06-30 16:55:56 +00:00
}
}
/**
* Dropdown menu with an advanced checkbox , that controls a additional $name . '_adv' setting .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2008-08-26 01:05:01 +00:00
*/
2009-06-30 15:23:33 +00:00
class admin_setting_configselect_with_advanced extends admin_setting_configselect {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting , $choices ) {
parent :: __construct ( $name , $visiblename , $description , $defaultsetting , $choices );
2008-08-26 01:05:01 +00:00
}
2009-06-30 15:19:12 +00:00
2009-05-22 02:05:46 +00:00
/**
* Loads the current setting and returns array
*
2009-06-30 16:55:56 +00:00
* @ return array Returns array value => xx , adv => xx
2009-05-22 02:05:46 +00:00
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2008-08-26 01:05:01 +00:00
$value = parent :: get_setting ();
2009-06-30 16:55:56 +00:00
$adv = $this -> config_read ( $this -> name . '_adv' );
if ( is_null ( $value ) or is_null ( $adv )) {
2008-08-26 01:05:01 +00:00
return NULL ;
}
2009-06-30 16:55:56 +00:00
return array ( 'value' => $value , 'adv' => $adv );
2008-08-26 01:05:01 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Saves the new settings passed in $data
*
* @ todo Add vartype handling to ensure $data is an array
* @ param array $data
* @ return mixed string or Array
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2008-08-26 01:05:01 +00:00
$error = parent :: write_setting ( $data [ 'value' ]);
if ( ! $error ) {
2009-06-30 16:55:56 +00:00
$value = empty ( $data [ 'adv' ]) ? 0 : 1 ;
$this -> config_write ( $this -> name . '_adv' , $value );
2008-08-26 01:05:01 +00:00
}
return $error ;
}
2009-05-22 02:05:46 +00:00
/**
* Return XHTML for the control
*
* @ param array $data Default data array
* @ param string $query
* @ return string XHTML to display control
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2008-08-26 01:05:01 +00:00
$default = $this -> get_defaultsetting ();
$current = $this -> get_setting ();
list ( $selecthtml , $warning ) = $this -> output_select_html ( $data [ 'value' ],
2009-09-09 07:55:03 +00:00
$current [ 'value' ], $default [ 'value' ], '[value]' );
2008-08-26 01:05:01 +00:00
if ( ! $selecthtml ) {
return '' ;
}
if ( ! is_null ( $default ) and array_key_exists ( $default [ 'value' ], $this -> choices )) {
$defaultinfo = array ();
if ( isset ( $this -> choices [ $default [ 'value' ]])) {
$defaultinfo [] = $this -> choices [ $default [ 'value' ]];
}
2009-06-30 16:55:56 +00:00
if ( ! empty ( $default [ 'adv' ])) {
2008-08-26 01:05:01 +00:00
$defaultinfo [] = get_string ( 'advanced' );
}
$defaultinfo = implode ( ', ' , $defaultinfo );
} else {
$defaultinfo = '' ;
}
2009-06-30 16:55:56 +00:00
$adv = ! empty ( $data [ 'adv' ]);
2008-09-02 08:58:53 +00:00
$return = '<div class="form-select defaultsnext">' . $selecthtml .
2009-09-09 07:55:03 +00:00
' <input type="checkbox" class="form-checkbox" id="' .
$this -> get_id () . '_adv" name="' . $this -> get_full_name () .
'[adv]" value="1" ' . ( $adv ? 'checked="checked"' : '' ) . ' />' .
' <label for="' . $this -> get_id () . '_adv">' .
get_string ( 'advanced' ) . '</label></div>' ;
2008-08-26 01:05:01 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , true , $warning , $defaultinfo , $query );
}
}
2008-07-28 12:31:29 +00:00
/**
* Graded roles in gradebook
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2008-07-28 12:31:29 +00:00
*/
class admin_setting_special_gradebookroles extends admin_setting_pickroles {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'gradebookroles' , get_string ( 'gradebookroles' , 'admin' ),
2009-09-09 07:55:03 +00:00
get_string ( 'configgradebookroles' , 'admin' ),
2010-03-31 07:41:31 +00:00
array ( 'student' ));
2008-07-28 12:31:29 +00:00
}
}
2009-05-22 02:05:46 +00:00
/**
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2008-03-03 11:03:54 +00:00
class admin_setting_regradingcheckbox extends admin_setting_configcheckbox {
2009-09-09 07:55:03 +00:00
/**
* Saves the new settings passed in $data
*
* @ param string $data
* @ return mixed string or Array
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2008-05-15 21:40:00 +00:00
global $CFG , $DB ;
2008-03-03 11:03:54 +00:00
$oldvalue = $this -> config_read ( $this -> name );
$return = parent :: write_setting ( $data );
$newvalue = $this -> config_read ( $this -> name );
if ( $oldvalue !== $newvalue ) {
2009-09-09 07:55:03 +00:00
// force full regrading
2008-05-15 21:40:00 +00:00
$DB -> set_field ( 'grade_items' , 'needsupdate' , 1 , array ( 'needsupdate' => 0 ));
2008-03-03 11:03:54 +00:00
}
return $return ;
2008-07-31 06:01:12 +00:00
}
2008-03-03 11:03:54 +00:00
}
2007-12-19 17:35:20 +00:00
/**
* Which roles to show on course decription page
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2008-07-28 12:31:29 +00:00
class admin_setting_special_coursemanager extends admin_setting_pickroles {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'coursemanager' , get_string ( 'coursemanager' , 'admin' ),
2009-09-09 07:55:03 +00:00
get_string ( 'configcoursemanager' , 'admin' ),
2010-03-31 07:41:31 +00:00
array ( 'editingteacher' ));
2007-12-19 17:35:20 +00:00
}
}
2006-10-25 08:51:26 +00:00
2009-05-22 02:05:46 +00:00
/**
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2009-04-16 07:16:44 +00:00
class admin_setting_special_gradelimiting extends admin_setting_configcheckbox {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-04-16 07:16:44 +00:00
function admin_setting_special_gradelimiting () {
parent :: __construct ( 'unlimitedgrades' , get_string ( 'unlimitedgrades' , 'grades' ),
2009-09-09 07:55:03 +00:00
get_string ( 'configunlimitedgrades' , 'grades' ), '0' , '1' , '0' );
2009-04-16 07:16:44 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Force site regrading
*/
2009-04-16 07:16:44 +00:00
function regrade_all () {
global $CFG ;
require_once ( " $CFG->libdir /gradelib.php " );
grade_force_site_regrading ();
}
2009-05-22 02:05:46 +00:00
/**
* Saves the new settings
*
* @ param mixed $data
* @ return string empty string or error message
*/
2009-04-16 07:16:44 +00:00
function write_setting ( $data ) {
$previous = $this -> get_setting ();
if ( $previous === null ) {
if ( $data ) {
$this -> regrade_all ();
}
} else {
if ( $data != $previous ) {
$this -> regrade_all ();
}
}
return ( $this -> config_write ( $this -> name , $data ) ? '' : get_string ( 'errorsetting' , 'admin' ));
}
}
2007-12-19 17:35:20 +00:00
/**
* Primary grade export plugin - has state tracking .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_special_gradeexport extends admin_setting_configmulticheckbox {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'gradeexport' , get_string ( 'gradeexport' , 'admin' ),
2009-09-09 07:55:03 +00:00
get_string ( 'configgradeexport' , 'admin' ), array (), NULL );
2006-10-25 08:51:26 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Load the available choices for the multicheckbox
*
* @ return bool always returns true
*/
2009-01-11 16:42:19 +00:00
public function load_choices () {
2007-12-19 17:35:20 +00:00
if ( is_array ( $this -> choices )) {
return true ;
}
$this -> choices = array ();
2009-06-19 14:25:56 +00:00
if ( $plugins = get_plugin_list ( 'gradeexport' )) {
foreach ( $plugins as $plugin => $unused ) {
2007-12-19 17:35:20 +00:00
$this -> choices [ $plugin ] = get_string ( 'modulename' , 'gradeexport_' . $plugin );
}
}
return true ;
}
2006-10-25 08:51:26 +00:00
}
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
/**
* Grade category settings
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2006-11-17 08:57:50 +00:00
*/
2007-12-19 17:35:20 +00:00
class admin_setting_gradecat_combo extends admin_setting {
2009-09-09 07:55:03 +00:00
/** @var array Array of choices */
2009-01-11 16:42:19 +00:00
public $choices ;
2007-12-19 17:35:20 +00:00
2009-05-22 02:05:46 +00:00
/**
* Sets choices and calls parent :: __construct with passed arguments
* @ param string $name
* @ param string $visiblename
* @ param string $description
* @ param mixed $defaultsetting string or array depending on implementation
* @ param array $choices An array of choices for the control
*/
2009-01-11 16:42:19 +00:00
public function __construct ( $name , $visiblename , $description , $defaultsetting , $choices ) {
2007-12-19 17:35:20 +00:00
$this -> choices = $choices ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( $name , $visiblename , $description , $defaultsetting );
2006-11-17 08:57:50 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Return the current setting ( s ) array
2009-06-30 15:19:12 +00:00
*
2009-05-22 02:05:46 +00:00
* @ return array Array of value => xx , forced => xx , adv => xx
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2006-11-17 08:57:50 +00:00
global $CFG ;
2007-12-19 17:35:20 +00:00
$value = $this -> config_read ( $this -> name );
$flag = $this -> config_read ( $this -> name . '_flag' );
if ( is_null ( $value ) or is_null ( $flag )) {
return NULL ;
2006-11-17 08:57:50 +00:00
}
2007-12-19 17:35:20 +00:00
$flag = ( int ) $flag ;
$forced = ( boolean )( 1 & $flag ); // first bit
$adv = ( boolean )( 2 & $flag ); // second bit
return array ( 'value' => $value , 'forced' => $forced , 'adv' => $adv );
2006-11-17 08:57:50 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Save the new settings passed in $data
*
* @ todo Add vartype handling to ensure $data is array
* @ param array $data Associative array of value => xx , forced => xx , adv => xx
* @ return string empty or error message
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
global $CFG ;
2006-11-17 08:57:50 +00:00
2007-12-19 17:35:20 +00:00
$value = $data [ 'value' ];
$forced = empty ( $data [ 'forced' ]) ? 0 : 1 ;
$adv = empty ( $data [ 'adv' ]) ? 0 : 2 ;
$flag = ( $forced | $adv ); //bitwise or
if ( ! in_array ( $value , array_keys ( $this -> choices ))) {
return 'Error setting ' ;
}
$oldvalue = $this -> config_read ( $this -> name );
$oldflag = ( int ) $this -> config_read ( $this -> name . '_flag' );
$oldforced = ( 1 & $oldflag ); // first bit
$result1 = $this -> config_write ( $this -> name , $value );
$result2 = $this -> config_write ( $this -> name . '_flag' , $flag );
// force regrade if needed
if ( $oldforced != $forced or ( $forced and $value != $oldvalue )) {
2009-09-09 07:55:03 +00:00
require_once ( $CFG -> libdir . '/gradelib.php' );
grade_category :: updated_forced_settings ();
2007-12-19 17:35:20 +00:00
}
if ( $result1 and $result2 ) {
return '' ;
2006-11-17 08:57:50 +00:00
} else {
2007-12-19 17:35:20 +00:00
return get_string ( 'errorsetting' , 'admin' );
2006-11-17 08:57:50 +00:00
}
}
2009-05-22 02:05:46 +00:00
/**
* Return XHTML to display the field and wrapping div
*
* @ todo Add vartype handling to ensure $data is array
* @ param array $data Associative array of value => xx , forced => xx , adv => xx
2009-06-30 15:19:12 +00:00
* @ param string $query
2009-05-22 02:05:46 +00:00
* @ return string XHTML to display control
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$value = $data [ 'value' ];
$forced = ! empty ( $data [ 'forced' ]);
$adv = ! empty ( $data [ 'adv' ]);
2006-11-17 08:57:50 +00:00
2008-01-22 08:27:30 +00:00
$default = $this -> get_defaultsetting ();
if ( ! is_null ( $default )) {
$defaultinfo = array ();
if ( isset ( $this -> choices [ $default [ 'value' ]])) {
$defaultinfo [] = $this -> choices [ $default [ 'value' ]];
}
if ( ! empty ( $default [ 'forced' ])) {
$defaultinfo [] = get_string ( 'force' );
}
if ( ! empty ( $default [ 'adv' ])) {
$defaultinfo [] = get_string ( 'advanced' );
}
$defaultinfo = implode ( ', ' , $defaultinfo );
2008-07-31 06:01:12 +00:00
2008-01-22 08:27:30 +00:00
} else {
$defaultinfo = NULL ;
}
$return = '<div class="form-group">' ;
$return .= '<select class="form-select" id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . '[value]">' ;
2007-12-19 17:35:20 +00:00
foreach ( $this -> choices as $key => $val ) {
2009-09-09 07:55:03 +00:00
// the string cast is needed because key may be integer - 0 is equal to most strings!
2007-12-19 17:35:20 +00:00
$return .= '<option value="' . $key . '"' . (( string ) $key == $value ? ' selected="selected"' : '' ) . '>' . $val . '</option>' ;
}
$return .= '</select>' ;
2008-01-01 15:51:54 +00:00
$return .= '<input type="checkbox" class="form-checkbox" id="' . $this -> get_id () . 'force" name="' . $this -> get_full_name () . '[forced]" value="1" ' . ( $forced ? 'checked="checked"' : '' ) . ' />'
2009-09-09 07:55:03 +00:00
. '<label for="' . $this -> get_id () . 'force">' . get_string ( 'force' ) . '</label>' ;
2008-01-01 15:51:54 +00:00
$return .= '<input type="checkbox" class="form-checkbox" id="' . $this -> get_id () . 'adv" name="' . $this -> get_full_name () . '[adv]" value="1" ' . ( $adv ? 'checked="checked"' : '' ) . ' />'
2009-09-09 07:55:03 +00:00
. '<label for="' . $this -> get_id () . 'adv">' . get_string ( 'advanced' ) . '</label>' ;
2008-01-22 08:27:30 +00:00
$return .= '</div>' ;
2007-12-19 17:35:20 +00:00
2008-01-22 08:27:30 +00:00
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , true , '' , $defaultinfo , $query );
2007-12-19 17:35:20 +00:00
}
}
/**
* Selection of grade report in user profiles
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_grade_profilereport extends admin_setting_configselect {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'grade_profilereport' , get_string ( 'profilereport' , 'grades' ), get_string ( 'configprofilereport' , 'grades' ), 'user' , null );
2007-12-19 17:35:20 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Loads an array of choices for the configselect control
*
* @ return bool always return true
*/
2009-01-11 16:42:19 +00:00
public function load_choices () {
2007-12-19 17:35:20 +00:00
if ( is_array ( $this -> choices )) {
return true ;
}
$this -> choices = array ();
global $CFG ;
require_once ( $CFG -> libdir . '/gradelib.php' );
2009-06-19 14:25:56 +00:00
foreach ( get_plugin_list ( 'gradereport' ) as $plugin => $plugindir ) {
if ( file_exists ( $plugindir . '/lib.php' )) {
require_once ( $plugindir . '/lib.php' );
2007-12-19 17:35:20 +00:00
$functionname = 'grade_report_' . $plugin . '_profilereport' ;
if ( function_exists ( $functionname )) {
2008-10-25 17:52:38 +00:00
$this -> choices [ $plugin ] = get_string ( 'modulename' , 'gradereport_' . $plugin );
2006-11-17 08:57:50 +00:00
}
}
}
2007-12-19 17:35:20 +00:00
return true ;
2006-11-17 08:57:50 +00:00
}
}
2007-12-19 17:35:20 +00:00
/**
* Special class for register auth selection
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-05-10 08:23:44 +00:00
*/
2007-12-19 17:35:20 +00:00
class admin_setting_special_registerauth extends admin_setting_configselect {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
parent :: __construct ( 'registerauth' , get_string ( 'selfregistration' , 'auth' ), get_string ( 'selfregistration_help' , 'auth' ), '' , null );
2007-05-10 08:23:44 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Returns the default option
*
* @ return string emtpy or default option
*/
2009-02-01 10:19:13 +00:00
public function get_defaultsetting () {
2007-12-19 17:35:20 +00:00
$this -> load_choices ();
2009-02-01 10:19:13 +00:00
$defaultsetting = parent :: get_defaultsetting ();
if ( array_key_exists ( $defaultsetting , $this -> choices )) {
return $defaultsetting ;
2007-12-19 17:35:20 +00:00
} else {
return '' ;
}
}
2007-05-10 08:23:44 +00:00
2009-05-22 02:05:46 +00:00
/**
* Loads the possible choices for the array
*
* @ return bool always returns true
*/
2009-01-11 16:42:19 +00:00
public function load_choices () {
2007-05-10 08:23:44 +00:00
global $CFG ;
2007-12-19 17:35:20 +00:00
if ( is_array ( $this -> choices )) {
return true ;
}
$this -> choices = array ();
$this -> choices [ '' ] = get_string ( 'disable' );
$authsenabled = get_enabled_auth_plugins ( true );
foreach ( $authsenabled as $auth ) {
$authplugin = get_auth_plugin ( $auth );
if ( ! $authplugin -> can_signup ()) {
continue ;
2007-05-10 08:23:44 +00:00
}
2007-12-19 17:35:20 +00:00
// Get the auth title (from core or own auth lang files)
2008-01-31 22:02:44 +00:00
$authtitle = $authplugin -> get_title ();
2007-12-19 17:35:20 +00:00
$this -> choices [ $auth ] = $authtitle ;
2007-05-10 08:23:44 +00:00
}
2007-12-19 17:35:20 +00:00
return true ;
2007-05-10 08:23:44 +00:00
}
2007-12-19 17:35:20 +00:00
}
2007-05-10 08:23:44 +00:00
2007-12-19 17:35:20 +00:00
/**
* Module manage page
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_page_managemods extends admin_externalpage {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
2007-12-19 17:35:20 +00:00
global $CFG ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( 'managemodules' , get_string ( 'modsettings' , 'admin' ), " $CFG->wwwroot / $CFG->admin /modules.php " );
2007-12-19 17:35:20 +00:00
}
2007-05-10 08:23:44 +00:00
2009-05-22 02:05:46 +00:00
/**
* Try to find the specified module
*
* @ param string $query The module to search for
* @ return array
*/
2009-01-11 16:42:19 +00:00
public function search ( $query ) {
2010-04-11 09:21:18 +00:00
global $CFG , $DB ;
2007-12-20 14:39:12 +00:00
if ( $result = parent :: search ( $query )) {
return $result ;
2007-12-19 17:35:20 +00:00
}
$found = false ;
2008-05-15 21:40:00 +00:00
if ( $modules = $DB -> get_records ( 'modules' )) {
2007-12-19 17:35:20 +00:00
$textlib = textlib_get_instance ();
foreach ( $modules as $module ) {
2010-04-11 09:21:18 +00:00
if ( ! file_exists ( " $CFG->dirroot /mod/ $module->name /lib.php " )) {
continue ;
}
2007-12-19 17:35:20 +00:00
if ( strpos ( $module -> name , $query ) !== false ) {
$found = true ;
break ;
}
$strmodulename = get_string ( 'modulename' , $module -> name );
if ( strpos ( $textlib -> strtolower ( $strmodulename ), $query ) !== false ) {
$found = true ;
break ;
2007-05-10 08:23:44 +00:00
}
}
2007-12-19 17:35:20 +00:00
}
if ( $found ) {
$result = new object ();
$result -> page = $this ;
$result -> settings = array ();
return array ( $this -> name => $result );
2007-05-10 08:23:44 +00:00
} else {
2007-12-19 17:35:20 +00:00
return array ();
2007-05-10 08:23:44 +00:00
}
}
2007-12-19 17:35:20 +00:00
}
2007-05-10 08:23:44 +00:00
2008-07-26 16:50:33 +00:00
/**
* Enrolment manage page
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2008-07-26 16:50:33 +00:00
*/
class admin_enrolment_page extends admin_externalpage {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
2008-07-26 16:50:33 +00:00
global $CFG ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( 'enrolment' , get_string ( 'enrolments' ), $CFG -> wwwroot . '/' . $CFG -> admin . '/enrol.php' );
2008-07-26 16:50:33 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* @ param string The string to search for
* @ return array
*/
2009-01-11 16:42:19 +00:00
public function search ( $query ) {
2008-07-26 16:50:33 +00:00
if ( $result = parent :: search ( $query )) {
return $result ;
}
$found = false ;
2009-06-19 14:25:56 +00:00
if ( $modules = get_plugin_list ( 'enrol' )) {
2008-07-26 16:50:33 +00:00
$textlib = textlib_get_instance ();
2009-06-19 14:25:56 +00:00
foreach ( $modules as $plugin => $dir ) {
2008-07-26 16:50:33 +00:00
if ( strpos ( $plugin , $query ) !== false ) {
$found = true ;
break ;
}
$strmodulename = get_string ( 'enrolname' , " enrol_ $plugin " );
if ( strpos ( $textlib -> strtolower ( $strmodulename ), $query ) !== false ) {
$found = true ;
break ;
}
}
}
//ugly harcoded hacks
if ( strpos ( 'sendcoursewelcomemessage' , $query ) !== false ) {
2009-09-09 07:55:03 +00:00
$found = true ;
2008-07-26 16:50:33 +00:00
} else if ( strpos ( $textlib -> strtolower ( get_string ( 'sendcoursewelcomemessage' , 'admin' )), $query ) !== false ) {
2009-09-09 07:55:03 +00:00
$found = true ;
} else if ( strpos ( $textlib -> strtolower ( get_string ( 'configsendcoursewelcomemessage' , 'admin' )), $query ) !== false ) {
$found = true ;
} else if ( strpos ( $textlib -> strtolower ( get_string ( 'configenrolmentplugins' , 'admin' )), $query ) !== false ) {
$found = true ;
}
2008-07-26 16:50:33 +00:00
if ( $found ) {
$result = new object ();
$result -> page = $this ;
$result -> settings = array ();
return array ( $this -> name => $result );
} else {
return array ();
}
}
}
2007-12-19 17:35:20 +00:00
/**
* Blocks manage page
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_page_manageblocks extends admin_externalpage {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
2007-12-19 17:35:20 +00:00
global $CFG ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( 'manageblocks' , get_string ( 'blocksettings' , 'admin' ), " $CFG->wwwroot / $CFG->admin /blocks.php " );
2007-12-19 17:35:20 +00:00
}
2007-05-10 08:23:44 +00:00
2009-05-22 02:05:46 +00:00
/**
* Search for a specific block
*
* @ param string $query The string to search for
* @ return array
*/
2009-01-11 16:42:19 +00:00
public function search ( $query ) {
2008-05-15 21:40:00 +00:00
global $CFG , $DB ;
2007-12-20 14:39:12 +00:00
if ( $result = parent :: search ( $query )) {
return $result ;
2007-12-19 17:35:20 +00:00
}
$found = false ;
2009-01-10 21:06:53 +00:00
if ( $blocks = $DB -> get_records ( 'block' )) {
2007-12-19 17:35:20 +00:00
$textlib = textlib_get_instance ();
foreach ( $blocks as $block ) {
2010-04-11 09:21:18 +00:00
if ( ! file_exists ( " $CFG->dirroot /blocks/ $block->name / " )) {
continue ;
}
2007-12-19 17:35:20 +00:00
if ( strpos ( $block -> name , $query ) !== false ) {
$found = true ;
break ;
2007-05-10 08:23:44 +00:00
}
2010-04-11 10:09:59 +00:00
$strblockname = get_string ( 'pluginname' , 'block_' . $block -> name );
2007-12-19 17:35:20 +00:00
if ( strpos ( $textlib -> strtolower ( $strblockname ), $query ) !== false ) {
$found = true ;
break ;
2007-05-10 08:23:44 +00:00
}
}
}
2007-12-19 17:35:20 +00:00
if ( $found ) {
$result = new object ();
$result -> page = $this ;
$result -> settings = array ();
return array ( $this -> name => $result );
} else {
return array ();
}
2007-05-10 08:23:44 +00:00
}
}
2008-09-09 08:57:51 +00:00
/**
* Question type manage page
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2008-09-09 08:57:51 +00:00
*/
class admin_page_manageqtypes extends admin_externalpage {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
2008-09-09 08:57:51 +00:00
global $CFG ;
parent :: __construct ( 'manageqtypes' , get_string ( 'manageqtypes' , 'admin' ), " $CFG->wwwroot / $CFG->admin /qtypes.php " );
}
2009-05-22 02:05:46 +00:00
/**
* Search QTYPES for the specified string
*
* @ param string $query The string to search for in QTYPES
* @ return array
*/
2009-01-11 16:42:19 +00:00
public function search ( $query ) {
2008-09-09 08:57:51 +00:00
global $CFG ;
if ( $result = parent :: search ( $query )) {
return $result ;
}
$found = false ;
$textlib = textlib_get_instance ();
require_once ( $CFG -> libdir . '/questionlib.php' );
global $QTYPES ;
foreach ( $QTYPES as $qtype ) {
if ( strpos ( $textlib -> strtolower ( $qtype -> local_name ()), $query ) !== false ) {
$found = true ;
break ;
}
}
if ( $found ) {
$result = new object ();
$result -> page = $this ;
$result -> settings = array ();
return array ( $this -> name => $result );
} else {
return array ();
}
}
}
2007-12-19 17:35:20 +00:00
/**
* Special class for authentication administration .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
class admin_setting_manageauths extends admin_setting {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
2010-02-08 16:26:15 +00:00
$this -> nosave = true ;
2009-01-11 16:42:19 +00:00
parent :: __construct ( 'authsui' , get_string ( 'authsettings' , 'admin' ), '' , '' );
2007-12-19 17:35:20 +00:00
}
2007-05-10 08:23:44 +00:00
2009-05-22 02:05:46 +00:00
/**
* Always returns true
*
* @ return true
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2007-12-19 17:35:20 +00:00
return true ;
}
2007-05-10 08:23:44 +00:00
2009-05-22 02:05:46 +00:00
/**
* Always returns true
*
* @ return true
*/
2009-01-11 16:42:19 +00:00
public function get_defaultsetting () {
2007-12-19 17:35:20 +00:00
return true ;
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Always returns '' and doesn ' t write anything
*
* @ return string Always returns ''
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2009-09-09 07:55:03 +00:00
// do not write any setting
2007-12-19 17:35:20 +00:00
return '' ;
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Search to find if Query is related to auth plugin
*
* @ param string $query The string to search for
* @ return bool true for related false for not
*/
2009-01-11 16:42:19 +00:00
public function is_related ( $query ) {
2007-12-19 17:35:20 +00:00
if ( parent :: is_related ( $query )) {
return true ;
}
2006-11-17 08:57:50 +00:00
2007-12-19 17:35:20 +00:00
$textlib = textlib_get_instance ();
2009-06-19 14:25:56 +00:00
$authsavailable = get_plugin_list ( 'auth' );
foreach ( $authsavailable as $auth => $dir ) {
2007-12-19 17:35:20 +00:00
if ( strpos ( $auth , $query ) !== false ) {
return true ;
}
2008-01-31 22:02:44 +00:00
$authplugin = get_auth_plugin ( $auth );
$authtitle = $authplugin -> get_title ();
2007-12-19 17:35:20 +00:00
if ( strpos ( $textlib -> strtolower ( $authtitle ), $query ) !== false ) {
return true ;
}
2006-09-18 02:41:14 +00:00
}
2007-12-19 17:35:20 +00:00
return false ;
2006-09-02 13:14:57 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Return XHTML to display control
*
* @ param mixed $data Unused
* @ param string $query
* @ return string highlight
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2009-07-03 06:19:25 +00:00
global $CFG , $OUTPUT ;
2006-12-21 04:30:03 +00:00
2007-12-19 17:35:20 +00:00
// display strings
$txt = get_strings ( array ( 'authenticationplugins' , 'users' , 'administration' ,
2009-09-09 07:55:03 +00:00
'settings' , 'edit' , 'name' , 'enable' , 'disable' ,
'up' , 'down' , 'none' ));
2007-12-19 17:35:20 +00:00
$txt -> updown = " $txt->up / $txt->down " ;
2006-12-21 04:30:03 +00:00
2009-06-19 14:25:56 +00:00
$authsavailable = get_plugin_list ( 'auth' );
2007-12-19 17:35:20 +00:00
get_enabled_auth_plugins ( true ); // fix the list of enabled auths
if ( empty ( $CFG -> auth )) {
$authsenabled = array ();
2006-12-21 04:30:03 +00:00
} else {
2007-12-19 17:35:20 +00:00
$authsenabled = explode ( ',' , $CFG -> auth );
}
// construct the display array, with enabled auth plugins at the top, in order
$displayauths = array ();
$registrationauths = array ();
$registrationauths [ '' ] = $txt -> disable ;
foreach ( $authsenabled as $auth ) {
$authplugin = get_auth_plugin ( $auth );
2009-09-09 07:55:03 +00:00
/// Get the auth title (from core or own auth lang files)
2008-01-31 22:02:44 +00:00
$authtitle = $authplugin -> get_title ();
2009-09-09 07:55:03 +00:00
/// Apply titles
2007-12-19 17:35:20 +00:00
$displayauths [ $auth ] = $authtitle ;
if ( $authplugin -> can_signup ()) {
$registrationauths [ $auth ] = $authtitle ;
}
2006-12-21 04:30:03 +00:00
}
2009-06-19 14:25:56 +00:00
foreach ( $authsavailable as $auth => $dir ) {
2007-12-19 17:35:20 +00:00
if ( array_key_exists ( $auth , $displayauths )) {
continue ; //already in the list
}
$authplugin = get_auth_plugin ( $auth );
2009-09-09 07:55:03 +00:00
/// Get the auth title (from core or own auth lang files)
2008-01-31 22:02:44 +00:00
$authtitle = $authplugin -> get_title ();
2009-09-09 07:55:03 +00:00
/// Apply titles
2007-12-19 17:35:20 +00:00
$displayauths [ $auth ] = $authtitle ;
if ( $authplugin -> can_signup ()) {
$registrationauths [ $auth ] = $authtitle ;
}
2006-12-21 04:30:03 +00:00
}
2009-08-06 09:08:48 +00:00
$return = $OUTPUT -> heading ( get_string ( 'actauthhdr' , 'auth' ), 3 , 'main' );
2009-08-10 04:58:02 +00:00
$return .= $OUTPUT -> box_start ( 'generalbox authsui' );
2006-12-21 04:30:03 +00:00
2009-08-20 08:50:50 +00:00
$table = new html_table ();
2007-12-19 17:35:20 +00:00
$table -> head = array ( $txt -> name , $txt -> enable , $txt -> updown , $txt -> settings );
$table -> align = array ( 'left' , 'center' , 'center' , 'center' );
$table -> data = array ();
2010-03-25 06:38:21 +00:00
$table -> attributes [ 'class' ] = 'manageauthtable generaltable' ;
2006-12-21 04:30:03 +00:00
2007-12-19 17:35:20 +00:00
//add always enabled plugins first
$displayname = " <span> " . $displayauths [ 'manual' ] . " </span> " ;
2007-12-20 21:00:05 +00:00
$settings = " <a href= \" auth_config.php?auth=manual \" > { $txt -> settings } </a> " ;
//$settings = "<a href=\"settings.php?section=authsettingmanual\">{$txt->settings}</a>";
2007-12-19 17:35:20 +00:00
$table -> data [] = array ( $displayname , '' , '' , $settings );
$displayname = " <span> " . $displayauths [ 'nologin' ] . " </span> " ;
$settings = " <a href= \" auth_config.php?auth=nologin \" > { $txt -> settings } </a> " ;
$table -> data [] = array ( $displayname , '' , '' , $settings );
2007-10-20 15:00:31 +00:00
2007-11-14 11:52:21 +00:00
2007-12-19 17:35:20 +00:00
// iterate through auth plugins and add to the display table
$updowncount = 1 ;
$authcount = count ( $authsenabled );
$url = " auth.php?sesskey= " . sesskey ();
foreach ( $displayauths as $auth => $name ) {
if ( $auth == 'manual' or $auth == 'nologin' ) {
continue ;
}
// hide/show link
if ( in_array ( $auth , $authsenabled )) {
$hideshow = " <a href= \" $url &action=disable&auth= $auth\ " > " ;
2009-12-16 21:50:45 +00:00
$hideshow .= " <img src= \" " . $OUTPUT -> pix_url ( 'i/hide' ) . " \" class= \" icon \" alt= \" disable \" /></a> " ;
2007-12-19 17:35:20 +00:00
// $hideshow = "<a href=\"$url&action=disable&auth=$auth\"><input type=\"checkbox\" checked /></a>";
$enabled = true ;
$displayname = " <span> $name </span> " ;
}
else {
$hideshow = " <a href= \" $url &action=enable&auth= $auth\ " > " ;
2009-12-16 21:50:45 +00:00
$hideshow .= " <img src= \" " . $OUTPUT -> pix_url ( 'i/show' ) . " \" class= \" icon \" alt= \" enable \" /></a> " ;
2007-12-19 17:35:20 +00:00
// $hideshow = "<a href=\"$url&action=enable&auth=$auth\"><input type=\"checkbox\" /></a>";
$enabled = false ;
$displayname = " <span class= \" dimmed_text \" > $name </span> " ;
}
2007-11-14 11:52:21 +00:00
2007-12-19 17:35:20 +00:00
// up/down link (only if auth is enabled)
$updown = '' ;
if ( $enabled ) {
if ( $updowncount > 1 ) {
$updown .= " <a href= \" $url &action=up&auth= $auth\ " > " ;
2009-12-16 21:50:45 +00:00
$updown .= " <img src= \" " . $OUTPUT -> pix_url ( 't/up' ) . " \" alt= \" up \" /></a> " ;
2007-12-19 17:35:20 +00:00
}
else {
2009-12-16 21:50:45 +00:00
$updown .= " <img src= \" " . $OUTPUT -> pix_url ( 'spacer.gif' ) . " \" class= \" icon \" alt= \" \" /> " ;
2007-12-19 17:35:20 +00:00
}
if ( $updowncount < $authcount ) {
$updown .= " <a href= \" $url &action=down&auth= $auth\ " > " ;
2009-12-16 21:50:45 +00:00
$updown .= " <img src= \" " . $OUTPUT -> pix_url ( 't/down' ) . " \" alt= \" down \" /></a> " ;
2007-12-19 17:35:20 +00:00
}
else {
2009-12-16 21:50:45 +00:00
$updown .= " <img src= \" " . $OUTPUT -> pix_url ( 'spacer.gif' ) . " \" class= \" icon \" alt= \" \" /> " ;
2007-12-19 17:35:20 +00:00
}
++ $updowncount ;
}
2007-11-14 11:52:21 +00:00
2007-12-19 17:35:20 +00:00
// settings link
if ( file_exists ( $CFG -> dirroot . '/auth/' . $auth . '/settings.php' )) {
$settings = " <a href= \" settings.php?section=authsetting $auth\ " > { $txt -> settings } </ a > " ;
} else {
$settings = " <a href= \" auth_config.php?auth= $auth\ " > { $txt -> settings } </ a > " ;
}
2007-11-14 11:52:21 +00:00
2007-12-19 17:35:20 +00:00
// add a row to the table
$table -> data [] = array ( $displayname , $hideshow , $updown , $settings );
2007-11-14 11:52:21 +00:00
}
2010-03-20 22:15:54 +00:00
$return .= html_writer :: table ( $table );
2007-12-19 17:35:20 +00:00
$return .= get_string ( 'configauthenticationplugins' , 'admin' ) . '<br />' . get_string ( 'tablenosave' , 'filters' );
2009-08-10 04:58:02 +00:00
$return .= $OUTPUT -> box_end ();
2008-01-01 15:51:54 +00:00
return highlight ( $query , $return );
2007-12-19 17:35:20 +00:00
}
}
2009-05-17 21:10:06 +00:00
/**
* Special class for authentication administration .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2009-05-17 21:10:06 +00:00
*/
class admin_setting_manageeditors extends admin_setting {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-05-17 21:10:06 +00:00
public function __construct () {
2010-02-08 16:26:15 +00:00
$this -> nosave = true ;
2009-05-17 21:10:06 +00:00
parent :: __construct ( 'editorsui' , get_string ( 'editorsettings' , 'editor' ), '' , '' );
}
2009-05-22 02:05:46 +00:00
/**
2009-06-30 15:19:12 +00:00
* Always returns true , does nothing
2009-05-22 02:05:46 +00:00
*
* @ return true
*/
2009-05-17 21:10:06 +00:00
public function get_setting () {
return true ;
}
2009-05-22 02:05:46 +00:00
/**
2009-06-30 15:19:12 +00:00
* Always returns true , does nothing
2009-05-22 02:05:46 +00:00
*
* @ return true
*/
2009-05-17 21:10:06 +00:00
public function get_defaultsetting () {
return true ;
}
2009-05-22 02:05:46 +00:00
/**
* Always returns '' , does not write anything
*
* @ return string Always returns ''
*/
2009-05-17 21:10:06 +00:00
public function write_setting ( $data ) {
2009-09-09 07:55:03 +00:00
// do not write any setting
2009-05-17 21:10:06 +00:00
return '' ;
}
2009-05-22 02:05:46 +00:00
/**
* Checks if $query is one of the available editors
2009-06-30 15:19:12 +00:00
*
2009-05-22 02:05:46 +00:00
* @ param string $query The string to search for
* @ return bool Returns true if found , false if not
*/
2009-05-17 21:10:06 +00:00
public function is_related ( $query ) {
if ( parent :: is_related ( $query )) {
return true ;
}
$textlib = textlib_get_instance ();
$editors_available = get_available_editors ();
foreach ( $editors_available as $editor => $editorstr ) {
if ( strpos ( $editor , $query ) !== false ) {
return true ;
}
if ( strpos ( $textlib -> strtolower ( $editorstr ), $query ) !== false ) {
return true ;
}
}
return false ;
}
2009-05-22 02:05:46 +00:00
/**
* Builds the XHTML to display the control
*
* @ param string $data Unused
* @ param string $query
* @ return string
*/
2009-05-17 21:10:06 +00:00
public function output_html ( $data , $query = '' ) {
2009-07-03 06:19:25 +00:00
global $CFG , $OUTPUT ;
2009-05-17 21:10:06 +00:00
// display strings
$txt = get_strings ( array ( 'administration' , 'settings' , 'edit' , 'name' , 'enable' , 'disable' ,
2009-09-09 07:55:03 +00:00
'up' , 'down' , 'none' ));
2009-05-17 21:10:06 +00:00
$txt -> updown = " $txt->up / $txt->down " ;
$editors_available = get_available_editors ();
$active_editors = explode ( ',' , $CFG -> texteditors );
$active_editors = array_reverse ( $active_editors );
foreach ( $active_editors as $key => $editor ) {
if ( empty ( $editors_available [ $editor ])) {
unset ( $active_editors [ $key ]);
} else {
$name = $editors_available [ $editor ];
unset ( $editors_available [ $editor ]);
$editors_available [ $editor ] = $name ;
}
}
if ( empty ( $active_editors )) {
2009-09-09 07:55:03 +00:00
//$active_editors = array('textarea');
2009-05-17 21:10:06 +00:00
}
$editors_available = array_reverse ( $editors_available , true );
2009-08-06 08:19:21 +00:00
$return = $OUTPUT -> heading ( get_string ( 'acteditorshhdr' , 'editor' ), 3 , 'main' , true );
2009-08-10 04:58:02 +00:00
$return .= $OUTPUT -> box_start ( 'generalbox editorsui' );
2009-05-17 21:10:06 +00:00
2009-08-20 08:50:50 +00:00
$table = new html_table ();
2009-05-17 21:10:06 +00:00
$table -> head = array ( $txt -> name , $txt -> enable , $txt -> updown , $txt -> settings );
$table -> align = array ( 'left' , 'center' , 'center' , 'center' );
$table -> width = '90%' ;
$table -> data = array ();
// iterate through auth plugins and add to the display table
$updowncount = 1 ;
$editorcount = count ( $active_editors );
$url = " editors.php?sesskey= " . sesskey ();
foreach ( $editors_available as $editor => $name ) {
2009-09-09 07:55:03 +00:00
// hide/show link
2009-05-17 21:10:06 +00:00
if ( in_array ( $editor , $active_editors )) {
$hideshow = " <a href= \" $url &action=disable&editor= $editor\ " > " ;
2009-12-16 21:50:45 +00:00
$hideshow .= " <img src= \" " . $OUTPUT -> pix_url ( 'i/hide' ) . " \" class= \" icon \" alt= \" disable \" /></a> " ;
2009-05-17 21:10:06 +00:00
// $hideshow = "<a href=\"$url&action=disable&editor=$editor\"><input type=\"checkbox\" checked /></a>";
$enabled = true ;
$displayname = " <span> $name </span> " ;
}
else {
$hideshow = " <a href= \" $url &action=enable&editor= $editor\ " > " ;
2009-12-16 21:50:45 +00:00
$hideshow .= " <img src= \" " . $OUTPUT -> pix_url ( 'i/show' ) . " \" class= \" icon \" alt= \" enable \" /></a> " ;
2009-05-17 21:10:06 +00:00
// $hideshow = "<a href=\"$url&action=enable&editor=$editor\"><input type=\"checkbox\" /></a>";
$enabled = false ;
$displayname = " <span class= \" dimmed_text \" > $name </span> " ;
}
// up/down link (only if auth is enabled)
$updown = '' ;
if ( $enabled ) {
if ( $updowncount > 1 ) {
$updown .= " <a href= \" $url &action=up&editor= $editor\ " > " ;
2009-12-16 21:50:45 +00:00
$updown .= " <img src= \" " . $OUTPUT -> pix_url ( 't/up' ) . " \" alt= \" up \" /></a> " ;
2009-05-17 21:10:06 +00:00
}
else {
2009-12-16 21:50:45 +00:00
$updown .= " <img src= \" " . $OUTPUT -> pix_url ( 'spacer.gif' ) . " \" class= \" icon \" alt= \" \" /> " ;
2009-05-17 21:10:06 +00:00
}
if ( $updowncount < $editorcount ) {
$updown .= " <a href= \" $url &action=down&editor= $editor\ " > " ;
2009-12-16 21:50:45 +00:00
$updown .= " <img src= \" " . $OUTPUT -> pix_url ( 't/down' ) . " \" alt= \" down \" /></a> " ;
2009-05-17 21:10:06 +00:00
}
else {
2009-12-16 21:50:45 +00:00
$updown .= " <img src= \" " . $OUTPUT -> pix_url ( 'spacer.gif' ) . " \" class= \" icon \" alt= \" \" /> " ;
2009-05-17 21:10:06 +00:00
}
++ $updowncount ;
}
// settings link
2010-03-23 08:47:05 +00:00
if ( file_exists ( $CFG -> dirroot . '/lib/editor/' . $editor . '/settings.php' )) {
$settings = " <a href=' $url &editor= $editor &action=edit'> { $txt -> settings } </a> " ;
2009-05-17 21:10:06 +00:00
} else {
$settings = '' ;
}
// add a row to the table
$table -> data [] = array ( $displayname , $hideshow , $updown , $settings );
}
2010-03-20 22:15:54 +00:00
$return .= html_writer :: table ( $table );
2009-10-12 21:46:16 +00:00
$return .= get_string ( 'configeditorplugins' , 'editor' ) . '<br />' . get_string ( 'tablenosave' , 'admin' );
2009-08-10 04:58:02 +00:00
$return .= $OUTPUT -> box_end ();
2009-05-17 21:10:06 +00:00
return highlight ( $query , $return );
}
}
2010-03-29 03:39:08 +00:00
/**
* Special class for license administration .
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
class admin_setting_managelicenses extends admin_setting {
/**
* Calls parent :: __construct with specific arguments
*/
public function __construct () {
$this -> nosave = true ;
parent :: __construct ( 'licensesui' , get_string ( 'licensesettings' , 'admin' ), '' , '' );
}
/**
* Always returns true , does nothing
*
* @ return true
*/
public function get_setting () {
return true ;
}
/**
* Always returns true , does nothing
*
* @ return true
*/
public function get_defaultsetting () {
return true ;
}
/**
* Always returns '' , does not write anything
*
* @ return string Always returns ''
*/
public function write_setting ( $data ) {
// do not write any setting
return '' ;
}
/**
* Builds the XHTML to display the control
*
* @ param string $data Unused
* @ param string $query
* @ return string
*/
public function output_html ( $data , $query = '' ) {
global $CFG , $OUTPUT ;
require_once ( $CFG -> libdir . '/licenselib.php' );
2010-03-31 03:08:05 +00:00
$url = " licenses.php?sesskey= " . sesskey ();
2010-03-29 03:39:08 +00:00
// display strings
$txt = get_strings ( array ( 'administration' , 'settings' , 'name' , 'enable' , 'disable' , 'none' ));
2010-03-31 03:08:05 +00:00
$licenses = license_manager :: get_licenses ();
2010-03-29 03:39:08 +00:00
$return = $OUTPUT -> heading ( get_string ( 'managelicenses' , 'admin' ), 3 , 'main' , true );
2010-03-31 03:08:05 +00:00
2010-03-29 03:39:08 +00:00
$return .= $OUTPUT -> box_start ( 'generalbox editorsui' );
$table = new html_table ();
$table -> head = array ( $txt -> name , $txt -> enable );
$table -> align = array ( 'left' , 'center' );
$table -> width = '100%' ;
$table -> data = array ();
2010-03-31 03:08:05 +00:00
foreach ( $licenses as $value ) {
$displayname = html_writer :: link ( $value -> source , get_string ( $value -> shortname , 'license' ), array ( 'target' => '_blank' ));
2010-03-29 03:39:08 +00:00
if ( $value -> enabled == 1 ) {
2010-04-04 19:58:03 +00:00
$hideshow = html_writer :: link ( $url . '&action=disable&license=' . $value -> shortname ,
2010-03-29 03:39:08 +00:00
html_writer :: tag ( 'img' , '' , array ( 'src' => $OUTPUT -> pix_url ( 'i/hide' ), 'class' => 'icon' , 'alt' => 'disable' )));
} else {
2010-04-04 19:58:03 +00:00
$hideshow = html_writer :: link ( $url . '&action=enable&license=' . $value -> shortname ,
2010-03-29 03:39:08 +00:00
html_writer :: tag ( 'img' , '' , array ( 'src' => $OUTPUT -> pix_url ( 'i/show' ), 'class' => 'icon' , 'alt' => 'enable' )));
}
2010-04-09 19:40:23 +00:00
if ( $value -> shortname == $CFG -> sitedefaultlicense ) {
$displayname .= ' ' . html_writer :: tag ( 'img' , '' , array ( 'src' => $OUTPUT -> pix_url ( 'i/lock' ), 'class' => 'icon' , 'alt' => get_string ( 'default' ), 'title' => get_string ( 'default' )));
$hideshow = '' ;
}
2010-03-29 03:39:08 +00:00
$enabled = true ;
$table -> data [] = array ( $displayname , $hideshow );
}
$return .= html_writer :: table ( $table );
$return .= $OUTPUT -> box_end ();
return highlight ( $query , $return );
}
}
2007-12-19 17:35:20 +00:00
/**
* Special class for filter administration .
2009-05-22 02:05:46 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2007-12-19 17:35:20 +00:00
*/
2009-04-13 07:15:50 +00:00
class admin_page_managefilters extends admin_externalpage {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
2009-04-13 07:15:50 +00:00
global $CFG ;
parent :: __construct ( 'managefilters' , get_string ( 'filtersettings' , 'admin' ), " $CFG->wwwroot / $CFG->admin /filters.php " );
2007-12-19 17:35:20 +00:00
}
2007-10-20 15:00:31 +00:00
2009-05-22 02:05:46 +00:00
/**
* Searches all installed filters for specified filter
*
* @ param string $query The filter ( string ) to search for
* @ param string $query
*/
2009-04-13 07:15:50 +00:00
public function search ( $query ) {
global $CFG ;
if ( $result = parent :: search ( $query )) {
return $result ;
2007-11-14 11:52:21 +00:00
}
2007-10-20 15:00:31 +00:00
2009-04-13 07:15:50 +00:00
$found = false ;
2009-03-30 08:33:13 +00:00
$filternames = filter_get_all_installed ();
2007-12-19 17:35:20 +00:00
$textlib = textlib_get_instance ();
2009-03-30 08:33:13 +00:00
foreach ( $filternames as $path => $strfiltername ) {
if ( strpos ( $textlib -> strtolower ( $strfiltername ), $query ) !== false ) {
2009-04-13 07:15:50 +00:00
$found = true ;
break ;
2009-03-30 08:33:13 +00:00
}
list ( $type , $filter ) = explode ( '/' , $path );
if ( strpos ( $filter , $query ) !== false ) {
2009-04-13 07:15:50 +00:00
$found = true ;
break ;
2007-11-14 11:52:21 +00:00
}
}
2007-10-20 15:00:31 +00:00
2009-04-13 07:15:50 +00:00
if ( $found ) {
$result = new stdClass ;
$result -> page = $this ;
$result -> settings = array ();
return array ( $this -> name => $result );
2009-04-13 07:15:19 +00:00
} else {
2009-04-13 07:15:50 +00:00
return array ();
2007-10-28 17:15:00 +00:00
}
2007-12-19 17:35:20 +00:00
}
2007-10-28 17:15:00 +00:00
}
2009-05-22 02:05:46 +00:00
/**
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2008-07-29 10:51:18 +00:00
class admin_setting_manageportfolio extends admin_setting {
private $baseurl ;
2009-06-30 15:19:12 +00:00
2009-01-11 16:42:19 +00:00
public function __construct () {
2008-07-29 10:51:18 +00:00
global $CFG ;
2010-02-08 16:26:15 +00:00
$this -> nosave = true ;
2010-04-11 09:29:07 +00:00
parent :: __construct ( 'manageportfolio' , get_string ( 'manageportfolios' , 'portfolio' ), '' , '' );
2009-09-09 07:55:03 +00:00
$this -> baseurl = $CFG -> wwwroot . '/' . $CFG -> admin . '/portfolio.php?sesskey=' . sesskey ();
2008-07-29 10:51:18 +00:00
}
2009-05-22 02:05:46 +00:00
/**
2009-06-30 15:19:12 +00:00
* Always returns true , does nothing
2009-05-22 02:05:46 +00:00
*
* @ return true
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2008-07-29 10:51:18 +00:00
return true ;
}
2009-05-22 02:05:46 +00:00
/**
2009-06-30 15:19:12 +00:00
* Always returns true , does nothing
2009-05-22 02:05:46 +00:00
*
* @ return true
*/
2009-01-11 16:42:19 +00:00
public function get_defaultsetting () {
2008-07-29 10:51:18 +00:00
return true ;
}
2009-05-22 02:05:46 +00:00
/**
* Always returns '' , does not write anything
*
* @ return string Always returns ''
*/
2009-01-13 19:02:00 +00:00
public function write_setting ( $data ) {
return '' ;
}
2009-05-22 02:05:46 +00:00
/**
* Searches the portfolio types for the specified type ( string )
*
* @ param string $query The string to search for
* @ return bool true for found or related , false for not
*/
2009-01-11 16:42:19 +00:00
public function is_related ( $query ) {
2008-07-29 10:51:18 +00:00
if ( parent :: is_related ( $query )) {
return true ;
}
$textlib = textlib_get_instance ();
2009-06-19 14:25:56 +00:00
$portfolios = get_plugin_list ( 'portfolio' );
foreach ( $portfolios as $p => $dir ) {
2008-07-29 10:51:18 +00:00
if ( strpos ( $p , $query ) !== false ) {
return true ;
}
}
foreach ( portfolio_instances ( false , false ) as $instance ) {
$title = $instance -> get ( 'name' );
if ( strpos ( $textlib -> strtolower ( $title ), $query ) !== false ) {
return true ;
}
}
return false ;
}
2009-05-22 02:05:46 +00:00
/**
* Builds XHTML to display the control
*
* @ param string $data Unused
* @ param string $query
* @ return string XHTML to display the control
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2009-07-02 11:09:15 +00:00
global $CFG , $OUTPUT ;
2008-07-29 10:51:18 +00:00
2009-08-10 04:58:02 +00:00
$output = $OUTPUT -> box_start ( 'generalbox' );
2008-07-29 10:51:18 +00:00
$namestr = get_string ( 'name' );
$pluginstr = get_string ( 'plugin' , 'portfolio' );
2009-06-19 14:25:56 +00:00
$plugins = get_plugin_list ( 'portfolio' );
$plugins = array_keys ( $plugins );
2008-07-29 10:51:18 +00:00
$instances = portfolio_instances ( false , false );
$alreadyplugins = array ();
2008-09-16 19:09:30 +00:00
// to avoid notifications being sent out while admin is editing the page
define ( 'ADMIN_EDITING_PORTFOLIO' , true );
2008-07-29 10:51:18 +00:00
$insane = portfolio_plugin_sanity_check ( $plugins );
$insaneinstances = portfolio_instance_sanity_check ( $instances );
$output .= portfolio_report_insane ( $insane , null , true );
$output .= portfolio_report_insane ( $insaneinstances , $instances , true );
2009-08-20 08:50:50 +00:00
$table = new html_table ();
2008-07-29 10:51:18 +00:00
$table -> head = array ( $namestr , $pluginstr , '' );
$table -> data = array ();
foreach ( $instances as $i ) {
$row = '' ;
2009-12-16 21:50:45 +00:00
$row .= '<a href="' . $this -> baseurl . '&edit=' . $i -> get ( 'id' ) . '"><img src="' . $OUTPUT -> pix_url ( 't/edit' ) . '" alt="' . get_string ( 'edit' ) . '" /></a>' . " \n " ;
$row .= '<a href="' . $this -> baseurl . '&delete=' . $i -> get ( 'id' ) . '"><img src="' . $OUTPUT -> pix_url ( 't/delete' ) . '" alt="' . get_string ( 'delete' ) . '" /></a>' . " \n " ;
2008-07-29 10:51:18 +00:00
if ( array_key_exists ( $i -> get ( 'plugin' ), $insane ) || array_key_exists ( $i -> get ( 'id' ), $insaneinstances )) {
2009-12-16 21:50:45 +00:00
$row .= '<img src="' . $OUTPUT -> pix_url ( 't/show' ) . '" alt="' . get_string ( 'hidden' , 'portfolio' ) . '" />' . " \n " ;
2008-07-29 10:51:18 +00:00
} else {
2009-07-03 06:19:25 +00:00
$row .= ' <a href="' . $this -> baseurl . '&hide=' . $i -> get ( 'id' ) . '"><img src="' .
2009-12-16 21:50:45 +00:00
$OUTPUT -> pix_url ( 't/' . ( $i -> get ( 'visible' ) ? 'hide' : 'show' )) . '" alt="' . get_string ( $i -> get ( 'visible' ) ? 'hide' : 'show' ) . '" /></a>' . " \n " ;
2008-07-29 10:51:18 +00:00
}
2008-09-02 16:21:14 +00:00
$table -> data [] = array ( $i -> get ( 'name' ), $i -> get_name () . ' (' . $i -> get ( 'plugin' ) . ')' , $row );
2008-07-29 10:51:18 +00:00
if ( ! in_array ( $i -> get ( 'plugin' ), $alreadyplugins )) {
$alreadyplugins [] = $i -> get ( 'plugin' );
}
}
2010-03-20 22:15:54 +00:00
$output .= html_writer :: table ( $table );
2008-07-29 10:51:18 +00:00
2008-09-09 08:57:51 +00:00
$instancehtml = '<br /><br />' . get_string ( 'addnewportfolio' , 'portfolio' ) . ': <br /><br />' ;
2008-07-29 10:51:18 +00:00
$addable = 0 ;
foreach ( $plugins as $p ) {
2009-11-16 12:57:59 +00:00
if ( ! portfolio_static_function ( $p , 'allows_multiple_instances' ) && in_array ( $p , $alreadyplugins )) {
2008-07-29 10:51:18 +00:00
continue ;
}
if ( array_key_exists ( $p , $insane )) {
continue ;
}
2008-08-12 13:49:55 +00:00
2008-09-02 16:21:14 +00:00
$instancehtml .= '<a href="' . $this -> baseurl . '&new=' . $p . '">' . portfolio_static_function ( $p , 'get_name' ) . ' (' . s ( $p ) . ')' . '</a><br />' . " \n " ;
2008-07-29 10:51:18 +00:00
$addable ++ ;
}
if ( $addable ) {
$output .= $instancehtml ;
}
2009-08-10 04:58:02 +00:00
$output .= $OUTPUT -> box_end ();
2008-07-29 10:51:18 +00:00
return highlight ( $query , $output );
}
}
2007-12-19 17:35:20 +00:00
/**
* Initialise admin page - this function does require login and permission
* checks specified in page definition .
2009-05-22 02:05:46 +00:00
*
2007-12-19 17:35:20 +00:00
* This function must be called on each admin page before other code .
2009-05-22 02:05:46 +00:00
*
2007-12-19 17:35:20 +00:00
* @ param string $section name of page
2008-12-11 09:21:41 +00:00
* @ param string $extrabutton extra HTML that is added after the blocks editing on / off button .
2009-05-22 02:05:46 +00:00
* @ param array $extraurlparams an array paramname => paramvalue , or parameters that need to be
2008-12-11 09:21:41 +00:00
* added to the turn blocks editing on / off form , so this page reloads correctly .
* @ param string $actualurl if the actual page being viewed is not the normal one for this
* page ( e . g . admin / roles / allowassin . php , instead of admin / roles / manage . php , you can pass the alternate URL here .
2007-12-19 17:35:20 +00:00
*/
2010-02-27 22:45:29 +00:00
function admin_externalpage_setup ( $section , $extrabutton = '' , array $extraurlparams = null , $actualurl = '' ) {
global $CFG , $PAGE , $USER , $SITE , $OUTPUT ;
2006-09-02 13:14:57 +00:00
2010-04-13 07:28:24 +00:00
$PAGE -> set_context ( get_context_instance ( CONTEXT_SYSTEM ));
2009-11-01 09:21:41 +00:00
$site = get_site ();
2010-01-20 08:41:07 +00:00
require_login ();
2006-09-02 13:14:57 +00:00
2009-01-11 16:42:19 +00:00
$adminroot = admin_get_root ( false , false ); // settings not required for external pages
2010-02-27 22:45:29 +00:00
$extpage = $adminroot -> locate ( $section , true );
2009-05-06 08:55:53 +00:00
2009-01-11 16:42:19 +00:00
if ( empty ( $extpage ) or ! ( $extpage instanceof admin_externalpage )) {
2008-04-04 02:54:20 +00:00
print_error ( 'sectionerror' , 'admin' , " $CFG->wwwroot / $CFG->admin / " );
2006-09-02 13:14:57 +00:00
die ;
}
// this eliminates our need to authenticate on the actual pages
2010-02-27 22:45:29 +00:00
if ( ! $extpage -> check_access ()) {
2008-04-04 02:54:20 +00:00
print_error ( 'accessdenied' , 'admin' );
2006-09-02 13:14:57 +00:00
die ;
}
2006-09-20 21:00:45 +00:00
2010-02-27 22:45:29 +00:00
if ( $section === 'upgradesettings' ) {
$PAGE -> set_pagelayout ( 'maintenance' );
} else {
$PAGE -> set_pagelayout ( 'admin' );
2006-09-02 13:14:57 +00:00
}
2009-10-12 05:39:32 +00:00
2010-02-27 22:45:29 +00:00
// $PAGE->set_extra_button($extrabutton); TODO
2006-09-02 13:14:57 +00:00
2010-02-27 22:45:29 +00:00
if ( ! $actualurl ) {
$actualurl = $extpage -> url ;
}
2007-12-19 17:35:20 +00:00
2010-02-27 22:45:29 +00:00
$extraurlparams = ( array ) $extraurlparams ;
$extraurlparams [ 'section' ] = $section ; // TODO: this is an ugly hack for navigation that must be eliminated!
$PAGE -> set_url ( $actualurl , $extraurlparams );
if ( strpos ( $PAGE -> pagetype , 'admin-' ) !== 0 ) {
$PAGE -> set_pagetype ( 'admin-' . $PAGE -> pagetype );
2007-12-19 17:35:20 +00:00
}
2010-03-07 09:28:54 +00:00
$PAGE -> set_pagelayout ( 'admin' );
2006-09-02 13:14:57 +00:00
2009-07-09 07:35:03 +00:00
if ( empty ( $SITE -> fullname ) || empty ( $SITE -> shortname )) {
2010-02-27 22:45:29 +00:00
// During initial install.
2009-02-01 17:45:32 +00:00
$strinstallation = get_string ( 'installation' , 'install' );
$strsettings = get_string ( 'settings' );
2009-09-03 06:59:25 +00:00
$PAGE -> navbar -> add ( $strsettings );
$PAGE -> set_title ( $strinstallation );
$PAGE -> set_heading ( $strinstallation );
$PAGE -> set_cacheable ( false );
2009-07-09 07:35:03 +00:00
return ;
2006-09-12 09:22:27 +00:00
}
2006-09-02 13:14:57 +00:00
2009-07-09 07:35:03 +00:00
// Normal case.
2010-02-27 22:45:29 +00:00
$adminediting = optional_param ( 'adminedit' , - 1 , PARAM_BOOL );
if ( $PAGE -> user_allowed_editing () && $adminediting != - 1 ) {
$USER -> editing = $adminediting ;
}
2007-04-30 17:08:34 +00:00
2010-02-27 22:45:29 +00:00
$visiblepathtosection = array_reverse ( $extpage -> visiblepath );
2010-02-08 16:26:15 +00:00
2009-07-09 07:35:03 +00:00
if ( $PAGE -> user_allowed_editing ()) {
if ( $PAGE -> user_is_editing ()) {
$caption = get_string ( 'blockseditoff' );
2010-02-27 22:45:29 +00:00
$url = new moodle_url ( $PAGE -> url , array ( 'adminedit' => '0' ));
2009-07-09 07:35:03 +00:00
} else {
$caption = get_string ( 'blocksediton' );
2010-02-27 22:45:29 +00:00
$url = new moodle_url ( $PAGE -> url , array ( 'adminedit' => '1' ));
2007-08-07 07:34:21 +00:00
}
2010-02-27 22:45:29 +00:00
$PAGE -> set_button ( $OUTPUT -> single_button ( $url , $caption , 'get' ));
2009-07-09 07:35:03 +00:00
}
2007-08-17 07:25:47 +00:00
2010-02-27 22:45:29 +00:00
$PAGE -> set_title ( " $SITE->shortname : " . implode ( " : " , $visiblepathtosection ));
2009-09-03 06:59:25 +00:00
$PAGE -> set_heading ( $SITE -> fullname );
2010-02-27 22:45:29 +00:00
// prevent caching in nav block
$PAGE -> navigation -> clear_cache ();
}
2007-12-19 17:35:20 +00:00
/**
* Returns the reference to admin tree root
2009-05-22 02:05:46 +00:00
*
* @ return object admin_roow object
2007-12-19 17:35:20 +00:00
*/
2009-01-11 09:41:48 +00:00
function admin_get_root ( $reload = false , $requirefulltree = true ) {
2009-06-29 09:19:53 +00:00
global $CFG , $DB , $OUTPUT ;
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
static $ADMIN = NULL ;
2009-01-11 16:42:19 +00:00
if ( is_null ( $ADMIN )) {
2009-09-09 07:55:03 +00:00
// create the admin tree!
2009-01-11 16:42:19 +00:00
$ADMIN = new admin_root ( $requirefulltree );
2007-12-19 17:35:20 +00:00
}
2009-01-11 16:42:19 +00:00
if ( $reload or ( $requirefulltree and ! $ADMIN -> fulltree )) {
$ADMIN -> purge_children ( $requirefulltree );
2007-12-19 17:35:20 +00:00
}
2006-09-02 13:14:57 +00:00
2009-01-11 16:42:19 +00:00
if ( ! $ADMIN -> loaded ) {
2009-09-09 07:55:03 +00:00
// we process this file first to create categories first and in correct order
2007-12-19 17:35:20 +00:00
require ( $CFG -> dirroot . '/' . $CFG -> admin . '/settings/top.php' );
// now we process all other files in admin/settings to build the admin tree
foreach ( glob ( $CFG -> dirroot . '/' . $CFG -> admin . '/settings/*.php' ) as $file ) {
2008-11-28 08:04:23 +00:00
if ( $file == $CFG -> dirroot . '/' . $CFG -> admin . '/settings/top.php' ) {
continue ;
}
if ( $file == $CFG -> dirroot . '/' . $CFG -> admin . '/settings/plugins.php' ) {
2009-09-09 07:55:03 +00:00
// plugins are loaded last - they may insert pages anywhere
2008-11-28 08:04:23 +00:00
continue ;
2006-09-02 13:14:57 +00:00
}
2009-01-11 09:41:48 +00:00
require ( $file );
2006-09-02 13:14:57 +00:00
}
2009-01-11 09:41:48 +00:00
require ( $CFG -> dirroot . '/' . $CFG -> admin . '/settings/plugins.php' );
2008-09-08 11:32:31 +00:00
2009-01-11 16:42:19 +00:00
$ADMIN -> loaded = true ;
2006-09-02 13:14:57 +00:00
}
2010-05-01 05:05:55 +00:00
2006-09-02 13:14:57 +00:00
return $ADMIN ;
}
2007-10-02 21:38:53 +00:00
/// settings utility functions
2006-09-02 13:14:57 +00:00
2007-10-02 21:38:53 +00:00
/**
* This function applies default settings .
2009-05-22 02:05:46 +00:00
*
* @ param object $node , NULL means complete tree , null by default
* @ param bool $uncoditional if true overrides all values with defaults , null buy default
2007-10-02 21:38:53 +00:00
*/
2007-12-19 17:35:20 +00:00
function admin_apply_default_settings ( $node = NULL , $unconditional = true ) {
2006-09-02 13:14:57 +00:00
global $CFG ;
2007-12-19 17:35:20 +00:00
if ( is_null ( $node )) {
2009-01-11 09:41:48 +00:00
$node = admin_get_root ( true , true );
2007-12-19 17:35:20 +00:00
}
2009-01-11 16:42:19 +00:00
if ( $node instanceof admin_category ) {
2006-09-02 13:14:57 +00:00
$entries = array_keys ( $node -> children );
foreach ( $entries as $entry ) {
2007-12-19 17:35:20 +00:00
admin_apply_default_settings ( $node -> children [ $entry ], $unconditional );
2006-09-02 13:14:57 +00:00
}
2009-01-11 16:42:19 +00:00
} else if ( $node instanceof admin_settingpage ) {
2009-09-09 07:55:03 +00:00
foreach ( $node -> settings as $setting ) {
if ( ! $unconditional and ! is_null ( $setting -> get_setting ())) {
2007-10-02 21:38:53 +00:00
//do not override existing defaults
2009-09-09 07:55:03 +00:00
continue ;
}
$defaultsetting = $setting -> get_defaultsetting ();
if ( is_null ( $defaultsetting )) {
2007-10-02 21:38:53 +00:00
// no value yet - default maybe applied after admin user creation or in upgradesettings
2009-09-09 07:55:03 +00:00
continue ;
}
$setting -> write_setting ( $defaultsetting );
2007-10-02 21:38:53 +00:00
}
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
}
/**
* Store changed settings , this function updates the errors variable in $ADMIN
2009-05-22 02:05:46 +00:00
*
2008-05-30 22:11:31 +00:00
* @ param object $formdata from form
2007-12-19 17:35:20 +00:00
* @ return int number of changed settings
*/
function admin_write_settings ( $formdata ) {
2009-07-01 05:54:26 +00:00
global $CFG , $SITE , $DB ;
2007-12-19 17:35:20 +00:00
$olddbsessions = ! empty ( $CFG -> dbsessions );
2008-05-30 22:11:31 +00:00
$formdata = ( array ) $formdata ;
2007-12-19 17:35:20 +00:00
$data = array ();
foreach ( $formdata as $fullname => $value ) {
if ( strpos ( $fullname , 's_' ) !== 0 ) {
continue ; // not a config value
}
$data [ $fullname ] = $value ;
}
2009-01-11 16:42:19 +00:00
$adminroot = admin_get_root ();
2007-12-19 17:35:20 +00:00
$settings = admin_find_write_settings ( $adminroot , $data );
$count = 0 ;
foreach ( $settings as $fullname => $setting ) {
$original = serialize ( $setting -> get_setting ()); // comparison must work for arrays too
$error = $setting -> write_setting ( $data [ $fullname ]);
if ( $error !== '' ) {
$adminroot -> errors [ $fullname ] = new object ();
$adminroot -> errors [ $fullname ] -> data = $data [ $fullname ];
$adminroot -> errors [ $fullname ] -> id = $setting -> get_id ();
$adminroot -> errors [ $fullname ] -> error = $error ;
}
2009-03-24 11:01:45 +00:00
if ( $original !== serialize ( $setting -> get_setting ())) {
2007-12-19 17:35:20 +00:00
$count ++ ;
$callbackfunction = $setting -> updatedcallback ;
if ( function_exists ( $callbackfunction )) {
$callbackfunction ( $fullname );
}
}
}
if ( $olddbsessions != ! empty ( $CFG -> dbsessions )) {
require_logout ();
2006-09-02 13:14:57 +00:00
}
2009-07-01 05:54:26 +00:00
// Now update $SITE - just update the fields, in case other people have a
// a reference to it (e.g. $PAGE, $COURSE).
$newsite = $DB -> get_record ( 'course' , array ( 'id' => $SITE -> id ));
foreach ( get_object_vars ( $newsite ) as $field => $value ) {
$SITE -> $field = $value ;
}
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
// now reload all settings - some of them might depend on the changed
admin_get_root ( true );
return $count ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
/**
* Internal recursive function - finds all settings from submitted form
2009-05-22 02:05:46 +00:00
*
* @ param object $node Instance of admin_category , or admin_settingpage
* @ param array $data
* @ return array
2007-12-19 17:35:20 +00:00
*/
function admin_find_write_settings ( $node , $data ) {
$return = array ();
if ( empty ( $data )) {
return $return ;
}
2009-01-11 16:42:19 +00:00
if ( $node instanceof admin_category ) {
2007-12-19 17:35:20 +00:00
$entries = array_keys ( $node -> children );
foreach ( $entries as $entry ) {
$return = array_merge ( $return , admin_find_write_settings ( $node -> children [ $entry ], $data ));
}
2009-01-11 16:42:19 +00:00
} else if ( $node instanceof admin_settingpage ) {
2009-09-09 07:55:03 +00:00
foreach ( $node -> settings as $setting ) {
$fullname = $setting -> get_full_name ();
if ( array_key_exists ( $fullname , $data )) {
$return [ $fullname ] = $setting ;
}
2007-12-19 17:35:20 +00:00
}
2009-09-09 07:55:03 +00:00
}
2007-12-19 17:35:20 +00:00
return $return ;
}
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
/**
* Internal function - prints the search results
2009-05-22 02:05:46 +00:00
*
* @ param string $query String to search for
* @ return string empty or XHTML
2007-12-19 17:35:20 +00:00
*/
function admin_search_settings_html ( $query ) {
2009-08-06 08:19:21 +00:00
global $CFG , $OUTPUT ;
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
$textlib = textlib_get_instance ();
if ( $textlib -> strlen ( $query ) < 2 ) {
return '' ;
}
$query = $textlib -> strtolower ( $query );
2009-01-11 16:42:19 +00:00
$adminroot = admin_get_root ();
2007-12-19 17:35:20 +00:00
$findings = $adminroot -> search ( $query );
$return = '' ;
2007-12-29 16:49:26 +00:00
$savebutton = false ;
2007-12-19 17:35:20 +00:00
foreach ( $findings as $found ) {
$page = $found -> page ;
$settings = $found -> settings ;
2007-12-29 16:38:25 +00:00
if ( $page -> is_hidden ()) {
2009-09-09 07:55:03 +00:00
// hidden pages are not displayed in search results
2007-12-19 17:35:20 +00:00
continue ;
}
2009-01-11 16:42:19 +00:00
if ( $page instanceof admin_externalpage ) {
2009-08-06 08:19:21 +00:00
$return .= $OUTPUT -> heading ( get_string ( 'searchresults' , 'admin' ) . ' - <a href="' . $page -> url . '">' . highlight ( $query , $page -> visiblename ) . '</a>' , 2 , 'main' );
2009-01-11 16:42:19 +00:00
} else if ( $page instanceof admin_settingpage ) {
2009-09-09 07:55:03 +00:00
$return .= $OUTPUT -> heading ( get_string ( 'searchresults' , 'admin' ) . ' - <a href="' . $CFG -> wwwroot . '/' . $CFG -> admin . '/settings.php?section=' . $page -> name . '">' . highlight ( $query , $page -> visiblename ) . '</a>' , 2 , 'main' );
} else {
continue ;
}
2007-12-19 17:35:20 +00:00
if ( ! empty ( $settings )) {
$return .= '<fieldset class="adminsettings">' . " \n " ;
foreach ( $settings as $setting ) {
2010-02-08 16:26:15 +00:00
if ( empty ( $setting -> nosave )) {
$savebutton = true ;
}
2007-12-19 17:35:20 +00:00
$return .= '<div class="clearer"><!-- --></div>' . " \n " ;
$fullname = $setting -> get_full_name ();
if ( array_key_exists ( $fullname , $adminroot -> errors )) {
$data = $adminroot -> errors [ $fullname ] -> data ;
} else {
$data = $setting -> get_setting ();
2009-09-09 07:55:03 +00:00
// do not use defaults if settings not available - upgrdesettings handles the defaults!
2007-12-19 17:35:20 +00:00
}
2008-01-01 15:51:54 +00:00
$return .= $setting -> output_html ( $data , $query );
2007-12-19 17:35:20 +00:00
}
$return .= '</fieldset>' ;
}
}
2007-12-29 16:49:26 +00:00
if ( $savebutton ) {
2009-09-09 07:55:03 +00:00
$return .= '<div class="form-buttons"><input class="form-submit" type="submit" value="' . get_string ( 'savechanges' , 'admin' ) . '" /></div>' ;
2007-12-29 16:49:26 +00:00
}
2007-12-19 17:35:20 +00:00
return $return ;
}
/**
2008-07-04 23:53:13 +00:00
* Internal function - returns arrays of html pages with uninitialised settings
2009-05-22 02:05:46 +00:00
*
* @ param object $node Instance of admin_category or admin_settingpage
* @ return array
2007-12-19 17:35:20 +00:00
*/
function admin_output_new_settings_by_page ( $node ) {
2009-08-06 08:19:21 +00:00
global $OUTPUT ;
2008-07-04 23:53:13 +00:00
$return = array ();
2007-12-19 17:35:20 +00:00
2009-01-11 16:42:19 +00:00
if ( $node instanceof admin_category ) {
2007-12-19 17:35:20 +00:00
$entries = array_keys ( $node -> children );
foreach ( $entries as $entry ) {
2008-07-04 23:53:13 +00:00
$return += admin_output_new_settings_by_page ( $node -> children [ $entry ]);
2007-12-19 17:35:20 +00:00
}
2009-01-11 16:42:19 +00:00
} else if ( $node instanceof admin_settingpage ) {
2009-09-09 07:55:03 +00:00
$newsettings = array ();
foreach ( $node -> settings as $setting ) {
if ( is_null ( $setting -> get_setting ())) {
$newsettings [] = $setting ;
}
2007-12-19 17:35:20 +00:00
}
2009-09-09 07:55:03 +00:00
if ( count ( $newsettings ) > 0 ) {
$adminroot = admin_get_root ();
$page = $OUTPUT -> heading ( get_string ( 'upgradesettings' , 'admin' ) . ' - ' . $node -> visiblename , 2 , 'main' );
$page .= '<fieldset class="adminsettings">' . " \n " ;
foreach ( $newsettings as $setting ) {
$fullname = $setting -> get_full_name ();
if ( array_key_exists ( $fullname , $adminroot -> errors )) {
$data = $adminroot -> errors [ $fullname ] -> data ;
} else {
$data = $setting -> get_setting ();
if ( is_null ( $data )) {
$data = $setting -> get_defaultsetting ();
}
2007-12-19 17:35:20 +00:00
}
2009-09-09 07:55:03 +00:00
$page .= '<div class="clearer"><!-- --></div>' . " \n " ;
$page .= $setting -> output_html ( $data );
2007-12-19 17:35:20 +00:00
}
2009-09-09 07:55:03 +00:00
$page .= '</fieldset>' ;
$return [ $node -> name ] = $page ;
2007-12-19 17:35:20 +00:00
}
}
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
return $return ;
}
/**
* Format admin settings
2009-05-22 02:05:46 +00:00
*
* @ param object $setting
2007-12-19 17:35:20 +00:00
* @ param string $title label element
2008-01-01 15:51:54 +00:00
* @ param string $form form fragment , html code - not highlighed automaticaly
2007-12-19 17:35:20 +00:00
* @ param string $description
2009-05-22 02:05:46 +00:00
* @ param bool $label link label to id , true by default
2008-01-01 15:51:54 +00:00
* @ param string $warning warning text
2009-05-22 02:05:46 +00:00
* @ param sting $defaultinfo defaults info , null means nothing , '' is converted to " Empty " string , defaults to null
2008-01-01 15:51:54 +00:00
* @ param string $query search query to be highlighted
2009-05-22 02:05:46 +00:00
* @ return string XHTML
2007-12-19 17:35:20 +00:00
*/
2008-01-01 15:51:54 +00:00
function format_admin_setting ( $setting , $title = '' , $form = '' , $description = '' , $label = true , $warning = '' , $defaultinfo = NULL , $query = '' ) {
2007-12-19 17:35:20 +00:00
global $CFG ;
2009-05-29 07:56:52 +00:00
$name = empty ( $setting -> plugin ) ? $setting -> name : " $setting->plugin | $setting->name " ;
2007-12-19 17:35:20 +00:00
$fullname = $setting -> get_full_name ();
2007-07-27 13:38:06 +00:00
2007-02-06 08:24:37 +00:00
// sometimes the id is not id_s_name, but id_s_name_m or something, and this does not validate
if ( $label ) {
2007-12-19 17:35:20 +00:00
$labelfor = 'for = "' . $setting -> get_id () . '"' ;
2007-02-06 08:24:37 +00:00
} else {
2007-07-27 13:38:06 +00:00
$labelfor = '' ;
2007-02-06 08:24:37 +00:00
}
2007-07-27 13:38:06 +00:00
2010-05-19 13:30:13 +00:00
$override = '' ;
if ( empty ( $setting -> plugin )) {
if ( array_key_exists ( $setting -> name , $CFG -> config_php_settings )) {
$override = '<div class="form-overridden">' . get_string ( 'configoverride' , 'admin' ) . '</div>' ;
}
2007-12-19 17:35:20 +00:00
} else {
2010-05-19 13:30:13 +00:00
if ( array_key_exists ( $setting -> plugin , $CFG -> forced_plugin_settings ) and array_key_exists ( $setting -> name , $CFG -> forced_plugin_settings [ $setting -> plugin ])) {
$override = '<div class="form-overridden">' . get_string ( 'configoverride' , 'admin' ) . '</div>' ;
}
2007-12-19 17:35:20 +00:00
}
2007-12-19 22:32:43 +00:00
if ( $warning !== '' ) {
$warning = '<div class="form-warning">' . $warning . '</div>' ;
}
2008-01-01 15:51:54 +00:00
if ( is_null ( $defaultinfo )) {
$defaultinfo = '' ;
} else {
if ( $defaultinfo === '' ) {
$defaultinfo = get_string ( 'emptysettingvalue' , 'admin' );
}
$defaultinfo = highlight ( $query , nl2br ( s ( $defaultinfo )));
$defaultinfo = '<div class="form-defaultinfo">' . get_string ( 'defaultsettinginfo' , 'admin' , $defaultinfo ) . '</div>' ;
}
2007-12-19 17:35:20 +00:00
$str = '
2007-12-27 21:00:00 +00:00
< div class = " form-item clearfix " id = " admin-'. $setting->name .' " >
2008-01-01 15:51:54 +00:00
< div class = " form-label " >
< label '.$labelfor.' > '.highlightfast($query, $title).' < span class = " form-shortname " > '.highlightfast($query, $name).' </ span >
'.$override.$warning.'
</ label >
</ div >
< div class = " form-setting " > '.$form.$defaultinfo.' </ div >
< div class = " form-description " > '.highlight($query, $description).' </ div >
2007-12-19 17:35:20 +00:00
</ div > ' ;
2009-01-11 16:42:19 +00:00
$adminroot = admin_get_root ();
2007-12-19 17:35:20 +00:00
if ( array_key_exists ( $fullname , $adminroot -> errors )) {
$str = '<fieldset class="error"><legend>' . $adminroot -> errors [ $fullname ] -> error . '</legend>' . $str . '</fieldset>' ;
}
2007-07-27 13:38:06 +00:00
2007-02-06 08:24:37 +00:00
return $str ;
2006-09-24 11:11:40 +00:00
}
2007-04-18 09:39:49 +00:00
/**
* Based on find_new_settings { @ link ()} in upgradesettings . php
* Looks to find any admin settings that have not been initialized . Returns 1 if it finds any .
*
2009-05-22 02:05:46 +00:00
* @ param object $node Instance of admin_category , or admin_settingpage
2007-12-19 17:35:20 +00:00
* @ return boolen true if any settings haven ' t been initialised , false if they all have
2007-04-18 09:39:49 +00:00
*/
2007-12-19 17:35:20 +00:00
function any_new_admin_settings ( $node ) {
2007-04-18 09:39:49 +00:00
2009-01-11 16:42:19 +00:00
if ( $node instanceof admin_category ) {
2007-04-18 09:39:49 +00:00
$entries = array_keys ( $node -> children );
foreach ( $entries as $entry ) {
2009-09-09 07:55:03 +00:00
if ( any_new_admin_settings ( $node -> children [ $entry ])) {
2007-12-19 17:35:20 +00:00
return true ;
2007-04-18 09:39:49 +00:00
}
}
2009-01-11 16:42:19 +00:00
} else if ( $node instanceof admin_settingpage ) {
2009-09-09 07:55:03 +00:00
foreach ( $node -> settings as $setting ) {
if ( $setting -> get_setting () === NULL ) {
return true ;
}
2007-04-18 09:39:49 +00:00
}
}
2007-12-19 17:35:20 +00:00
return false ;
2007-04-18 09:39:49 +00:00
}
2007-12-03 04:46:37 +00:00
/**
* Moved from admin / replace . php so that we can use this in cron
2009-05-22 02:05:46 +00:00
*
* @ param string $search string to look for
* @ param string $replace string to replace
* @ return bool success or fail
2007-12-03 04:46:37 +00:00
*/
function db_replace ( $search , $replace ) {
2007-12-19 17:35:20 +00:00
2008-05-15 21:40:00 +00:00
global $DB , $CFG ;
2007-12-19 17:35:20 +00:00
2007-12-03 04:46:37 +00:00
/// Turn off time limits, sometimes upgrades can be slow.
@ set_time_limit ( 0 );
@ ob_implicit_flush ( true );
while ( @ ob_end_flush ());
2007-12-19 17:35:20 +00:00
2008-05-15 21:40:00 +00:00
if ( ! $tables = $DB -> get_tables () ) { // No tables yet at all.
2007-12-03 04:46:37 +00:00
return false ;
}
foreach ( $tables as $table ) {
2007-12-19 17:35:20 +00:00
2008-05-15 21:40:00 +00:00
if ( in_array ( $table , array ( 'config' ))) { // Don't process these
2007-12-03 04:46:37 +00:00
continue ;
}
2007-12-19 17:35:20 +00:00
2008-05-15 21:40:00 +00:00
if ( $columns = $DB -> get_columns ( $table )) {
$DB -> set_debug ( true );
2007-12-03 04:46:37 +00:00
foreach ( $columns as $column => $data ) {
2008-05-15 21:40:00 +00:00
if ( in_array ( $data -> meta_type , array ( 'C' , 'X' ))) { // Text stuff only
2008-06-05 20:35:28 +00:00
$DB -> execute ( " UPDATE { " . $table . " } SET $column = REPLACE( $column , ?, ?) " , array ( $search , $replace ));
2007-12-03 04:46:37 +00:00
}
}
2008-05-15 21:40:00 +00:00
$DB -> set_debug ( false );
2007-12-03 04:46:37 +00:00
}
}
2007-12-19 17:35:20 +00:00
2007-12-03 04:46:37 +00:00
return true ;
}
2008-01-23 22:48:54 +00:00
/**
* Prints tables of detected plugins , one table per plugin type ,
2008-07-31 06:01:12 +00:00
* and prints whether they are part of the standard Moodle
2008-01-23 22:48:54 +00:00
* distribution or not .
*/
function print_plugin_tables () {
2008-05-15 21:40:00 +00:00
global $DB ;
2008-01-25 12:56:22 +00:00
$plugins_standard = array ();
$plugins_standard [ 'mod' ] = array ( 'assignment' ,
2009-09-09 07:55:03 +00:00
'chat' ,
'choice' ,
'data' ,
'feedback' ,
'folder' ,
'forum' ,
'glossary' ,
'hotpot' ,
'imscp' ,
'label' ,
'lesson' ,
'page' ,
'quiz' ,
'resource' ,
'scorm' ,
'survey' ,
'url' ,
2010-01-14 11:30:10 +00:00
'wiki' ,
'workshop' );
2008-07-31 06:01:12 +00:00
2008-01-25 12:56:22 +00:00
$plugins_standard [ 'blocks' ] = array ( 'activity_modules' ,
2009-09-09 07:55:03 +00:00
'admin_bookmarks' ,
'blog_menu' ,
'blog_recent' ,
'blog_tags' ,
'calendar_month' ,
'calendar_upcoming' ,
'comments' ,
2010-05-01 05:05:55 +00:00
'community' ,
2010-05-01 07:12:57 +00:00
'completionstatus' ,
2009-09-09 07:55:03 +00:00
'course_list' ,
2010-05-04 13:04:35 +00:00
'course_overview' ,
2009-09-09 07:55:03 +00:00
'course_summary' ,
'glossary_random' ,
'html' ,
'loancalc' ,
'login' ,
'mentees' ,
'messages' ,
'mnet_hosts' ,
2010-05-04 13:04:35 +00:00
'myprofile' ,
2010-04-20 02:03:39 +00:00
'navigation' ,
2009-09-09 07:55:03 +00:00
'news_items' ,
'online_users' ,
'participants' ,
2010-03-21 10:25:15 +00:00
'private_files' ,
2009-09-09 07:55:03 +00:00
'quiz_results' ,
'recent_activity' ,
'rss_client' ,
'search' ,
'search_forums' ,
'section_links' ,
2010-05-01 07:12:57 +00:00
'selfcompletion' ,
2010-04-19 06:30:30 +00:00
'settings' ,
2009-09-09 07:55:03 +00:00
'site_main_menu' ,
'social_activities' ,
'tag_flickr' ,
'tag_youtube' ,
'tags' );
2008-07-31 06:01:12 +00:00
2008-01-25 12:56:22 +00:00
$plugins_standard [ 'filter' ] = array ( 'activitynames' ,
2009-09-09 07:55:03 +00:00
'algebra' ,
'censor' ,
'emailprotect' ,
'filter' ,
'mediaplugin' ,
'multilang' ,
'tex' ,
'tidy' );
2008-01-25 12:56:22 +00:00
$plugins_installed = array ();
2008-06-16 11:34:19 +00:00
$installed_mods = $DB -> get_records ( 'modules' , null , 'name' );
$installed_blocks = $DB -> get_records ( 'block' , null , 'name' );
2008-01-24 08:40:36 +00:00
foreach ( $installed_mods as $mod ) {
2008-01-25 12:56:22 +00:00
$plugins_installed [ 'mod' ][] = $mod -> name ;
2008-01-24 08:40:36 +00:00
}
foreach ( $installed_blocks as $block ) {
2008-01-25 12:56:22 +00:00
$plugins_installed [ 'blocks' ][] = $block -> name ;
2008-01-24 08:40:36 +00:00
}
2009-02-02 04:42:07 +00:00
$plugins_installed [ 'filter' ] = array ();
2008-01-25 12:56:22 +00:00
$plugins_ondisk = array ();
2009-06-19 14:25:56 +00:00
$plugins_ondisk [ 'mod' ] = array_keys ( get_plugin_list ( 'mod' ));
$plugins_ondisk [ 'blocks' ] = array_keys ( get_plugin_list ( 'block' ));
$plugins_ondisk [ 'filter' ] = array_keys ( get_plugin_list ( 'filter' ));
2008-07-31 06:01:12 +00:00
2008-01-23 22:48:54 +00:00
$strstandard = get_string ( 'standard' );
$strnonstandard = get_string ( 'nonstandard' );
2008-01-25 16:31:50 +00:00
$strmissingfromdisk = '(' . get_string ( 'missingfromdisk' ) . ')' ;
$strabouttobeinstalled = '(' . get_string ( 'abouttobeinstalled' ) . ')' ;
2008-01-23 22:48:54 +00:00
$html = '' ;
2008-07-31 06:01:12 +00:00
2008-02-04 11:03:29 +00:00
$html .= '<table class="generaltable plugincheckwrapper" cellspacing="4" cellpadding="1"><tr valign="top">' ;
2008-01-23 22:48:54 +00:00
2008-01-25 16:31:50 +00:00
foreach ( $plugins_ondisk as $cat => $list_ondisk ) {
2008-01-24 08:40:36 +00:00
if ( $cat == 'mod' ) {
$strcaption = get_string ( 'activitymodule' );
} elseif ( $cat == 'filter' ) {
$strcaption = get_string ( 'managefilters' );
2010-04-10 07:24:56 +00:00
} else {
$strcaption = get_string ( $cat );
2008-01-24 08:40:36 +00:00
}
2008-02-04 11:03:29 +00:00
$html .= '<td><table class="plugincompattable generaltable boxaligncenter" cellspacing="1" cellpadding="5" '
2009-09-09 07:55:03 +00:00
. 'id="' . $cat . 'compattable" summary="compatibility table"><caption>' . $strcaption . '</caption>' . " \n " ;
2008-01-24 08:40:36 +00:00
$html .= '<tr class="r0"><th class="header c0">' . get_string ( 'directory' ) . " </th> \n "
2009-09-09 07:55:03 +00:00
. '<th class="header c1">' . get_string ( 'name' ) . " </th> \n "
. '<th class="header c2">' . get_string ( 'status' ) . " </th> \n </tr> \n " ;
2008-07-31 06:01:12 +00:00
$row = 1 ;
2008-01-24 08:40:36 +00:00
2008-01-25 16:31:50 +00:00
foreach ( $list_ondisk as $k => $plugin ) {
$status = 'ok' ;
2008-01-23 22:48:54 +00:00
$standard = 'standard' ;
2008-01-25 16:31:50 +00:00
$note = '' ;
2008-01-23 22:48:54 +00:00
2008-01-25 12:56:22 +00:00
if ( ! in_array ( $plugin , $plugins_standard [ $cat ])) {
2008-01-23 22:48:54 +00:00
$standard = 'nonstandard' ;
2008-01-25 16:31:50 +00:00
$status = 'warning' ;
2008-07-31 06:01:12 +00:00
}
2008-01-24 08:40:36 +00:00
// Get real name and full path of plugin
$plugin_name = " [[ $plugin ]] " ;
2008-07-31 06:01:12 +00:00
2008-02-18 02:12:22 +00:00
$plugin_path = " $cat / $plugin " ;
2008-07-31 06:01:12 +00:00
2008-01-25 12:56:22 +00:00
$plugin_name = get_plugin_name ( $plugin , $cat );
2008-07-31 06:01:12 +00:00
2008-01-24 08:40:36 +00:00
// Determine if the plugin is about to be installed
2008-01-25 12:56:22 +00:00
if ( $cat != 'filter' && ! in_array ( $plugin , $plugins_installed [ $cat ])) {
2008-01-25 16:31:50 +00:00
$note = $strabouttobeinstalled ;
2008-01-25 12:56:22 +00:00
$plugin_name = $plugin ;
2008-01-24 08:40:36 +00:00
}
$html .= " <tr class= \" r $row\ " > \n "
2009-09-09 07:55:03 +00:00
. " <td class= \" cell c0 \" > $plugin_path </td> \n "
. " <td class= \" cell c1 \" > $plugin_name </td> \n "
. " <td class= \" $standard $status cell c2 \" > " . $ { 'str' . $standard } . " $note </td> \n </tr> \n " ;
2008-01-23 22:48:54 +00:00
$row ++ ;
2008-01-25 12:56:22 +00:00
// If the plugin was both on disk and in the db, unset the value from the installed plugins list
2008-01-25 16:31:50 +00:00
if ( $key = array_search ( $plugin , $plugins_installed [ $cat ])) {
unset ( $plugins_installed [ $cat ][ $key ]);
2008-07-31 06:01:12 +00:00
}
}
2008-01-25 12:56:22 +00:00
// If there are plugins left in the plugins_installed list, it means they are missing from disk
2008-07-31 06:01:12 +00:00
foreach ( $plugins_installed [ $cat ] as $k => $missing_plugin ) {
2009-09-09 07:55:03 +00:00
// Make sure the plugin really is missing from disk
2008-01-25 12:56:22 +00:00
if ( ! in_array ( $missing_plugin , $plugins_ondisk [ $cat ])) {
2008-01-25 16:31:50 +00:00
$standard = 'standard' ;
$status = 'warning' ;
2008-01-26 10:00:08 +00:00
if ( ! in_array ( $missing_plugin , $plugins_standard [ $cat ])) {
2008-01-25 16:31:50 +00:00
$standard = 'nonstandard' ;
}
$plugin_name = $missing_plugin ;
2008-01-25 12:56:22 +00:00
$html .= " <tr class= \" r $row\ " > \n "
2009-09-09 07:55:03 +00:00
. " <td class= \" cell c0 \" >?</td> \n "
. " <td class= \" cell c1 \" > $plugin_name </td> \n "
. " <td class= \" $standard $status cell c2 \" > " . $ { 'str' . $standard } . " $strmissingfromdisk </td> \n </tr> \n " ;
2008-07-31 06:01:12 +00:00
$row ++ ;
2008-01-25 12:56:22 +00:00
}
}
2008-02-04 11:03:29 +00:00
$html .= '</table></td>' ;
2008-01-23 22:48:54 +00:00
}
2008-07-31 06:01:12 +00:00
2008-02-04 11:03:29 +00:00
$html .= '</tr></table><br />' ;
2008-07-31 06:01:12 +00:00
2008-01-23 22:48:54 +00:00
echo $html ;
}
2009-05-22 02:05:46 +00:00
/**
* Manage repository settings
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2008-08-13 04:09:13 +00:00
class admin_setting_managerepository extends admin_setting {
2009-09-09 07:55:03 +00:00
/** @var string */
2008-08-13 04:09:13 +00:00
private $baseurl ;
2009-06-30 15:19:12 +00:00
2009-05-22 02:05:46 +00:00
/**
* calls parent :: __construct with specific arguments
*/
2009-01-11 16:42:19 +00:00
public function __construct () {
2008-08-13 04:09:13 +00:00
global $CFG ;
2010-04-11 09:41:25 +00:00
parent :: __construct ( 'managerepository' , get_string ( 'manage' , 'repository' ), '' , '' );
2008-08-13 04:09:13 +00:00
$this -> baseurl = $CFG -> wwwroot . '/' . $CFG -> admin . '/repository.php?sesskey=' . sesskey ();
}
2008-08-16 12:16:01 +00:00
2009-05-22 02:05:46 +00:00
/**
* Always returns true , does nothing
*
* @ return true
*/
2009-01-11 16:42:19 +00:00
public function get_setting () {
2008-08-13 04:09:13 +00:00
return true ;
}
2009-05-22 02:05:46 +00:00
/**
* Always returns true does nothing
*
* @ return true
*/
2009-01-11 16:42:19 +00:00
public function get_defaultsetting () {
2008-08-13 04:09:13 +00:00
return true ;
}
2009-05-22 02:05:46 +00:00
/**
* Always returns s_managerepository
*
* @ return string Always return 's_managerepository'
*/
2009-01-11 16:42:19 +00:00
public function get_full_name () {
2008-08-13 04:09:13 +00:00
return 's_managerepository' ;
}
2009-05-22 02:05:46 +00:00
/**
* Always returns '' doesn ' t do anything
*/
2009-01-11 16:42:19 +00:00
public function write_setting ( $data ) {
2008-08-13 04:09:13 +00:00
$url = $this -> baseurl . '&new=' . $data ;
2009-01-13 19:02:00 +00:00
return '' ;
2009-09-09 07:55:03 +00:00
// TODO
// Should not use redirect and exit here
// Find a better way to do this.
// redirect($url);
// exit;
2008-08-13 04:09:13 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Searches repository plugins for one that matches $query
*
* @ param string $query The string to search for
* @ return bool true if found , false if not
*/
2009-01-11 16:42:19 +00:00
public function is_related ( $query ) {
2008-08-13 04:09:13 +00:00
if ( parent :: is_related ( $query )) {
return true ;
}
$textlib = textlib_get_instance ();
2009-06-19 14:25:56 +00:00
$repositories = get_plugin_list ( 'repository' );
foreach ( $repositories as $p => $dir ) {
2008-08-13 04:09:13 +00:00
if ( strpos ( $p , $query ) !== false ) {
return true ;
}
}
2008-11-26 07:03:10 +00:00
foreach ( repository :: get_types () as $instance ) {
2008-09-02 08:58:53 +00:00
$title = $instance -> get_typename ();
2008-08-13 04:09:13 +00:00
if ( strpos ( $textlib -> strtolower ( $title ), $query ) !== false ) {
return true ;
}
}
return false ;
}
2010-04-30 08:03:32 +00:00
/**
* Helper function that generates a moodle_url object
* relevant to the repository
*/
function repository_action_url ( $repository ) {
return new moodle_url ( '/admin/repository.php' , array ( 'sesskey' => sesskey (), 'repos' => $repository ));
}
2009-05-22 02:05:46 +00:00
/**
* Builds XHTML to display the control
*
* @ param string $data Unused
2009-06-30 15:19:12 +00:00
* @ param string $query
2009-05-22 02:05:46 +00:00
* @ return string XHTML
*/
2009-01-11 16:42:19 +00:00
public function output_html ( $data , $query = '' ) {
2009-07-03 06:19:25 +00:00
global $CFG , $USER , $OUTPUT ;
2010-04-30 08:03:32 +00:00
$actionchoicesforexisting = array (
'show' => get_string ( 'on' , 'repository' ),
'hide' => get_string ( 'off' , 'repository' ),
'delete' => get_string ( 'disabled' , 'repository' )
);
$actionchoicesfornew = array (
'newon' => get_string ( 'on' , 'repository' ),
'newoff' => get_string ( 'off' , 'repository' ),
'delete' => get_string ( 'disabled' , 'repository' )
);
$return = '' ;
$return .= $OUTPUT -> box_start ( 'generalbox' );
// Set strings that are used multiple times
2008-09-04 07:03:01 +00:00
$settingsstr = get_string ( 'settings' );
2010-04-30 08:03:32 +00:00
$disablestr = get_string ( 'disable' );
// Table to list plug-ins
2009-08-20 08:50:50 +00:00
$table = new html_table ();
2010-04-30 08:03:32 +00:00
$table -> head = array ( get_string ( 'name' ), get_string ( 'isactive' , 'repository' ), get_string ( 'order' ), $settingsstr );
$table -> align = array ( 'left' , 'center' , 'center' , 'center' , 'center' );
2008-08-13 04:09:13 +00:00
$table -> data = array ();
2009-05-01 06:55:10 +00:00
2010-04-30 08:03:32 +00:00
// Get list of used plug-ins
$instances = repository :: get_types ();
if ( ! empty ( $instances )) {
// Array to store plugins being used
$alreadyplugins = array ();
$totalinstances = count ( $instances );
$updowncount = 1 ;
foreach ( $instances as $i ) {
$settings = '' ;
$typename = $i -> get_typename ();
// Display edit link only if you can config the type or if it has multiple instances (e.g. has instance config)
$typeoptionnames = repository :: static_function ( $typename , 'get_type_option_names' );
$instanceoptionnames = repository :: static_function ( $typename , 'get_instance_option_names' );
if ( ! empty ( $typeoptionnames ) || ! empty ( $instanceoptionnames )) {
// Calculate number of instances in order to display them for the Moodle administrator
if ( ! empty ( $instanceoptionnames )) {
$params = array ();
$params [ 'context' ] = array ( get_system_context ());
$params [ 'onlyvisible' ] = false ;
$params [ 'type' ] = $typename ;
$admininstancenumber = count ( repository :: static_function ( $typename , 'get_instances' , $params ));
$admininstancenumbertext = " <br/> " . $admininstancenumber . " " . get_string ( 'instancesforadmin' , 'repository' );
$params [ 'context' ] = array ();
$instancenumber = count ( repository :: static_function ( $typename , 'get_instances' , $params )) - $admininstancenumber ;
$instancenumbertext = " <br/> " . $instancenumber . " " . get_string ( 'instancesforothers' , 'repository' );
} else {
$admininstancenumbertext = " " ;
$instancenumbertext = " " ;
}
2008-09-03 09:45:27 +00:00
2010-04-30 08:03:32 +00:00
$settings .= '<a href="' . $this -> baseurl . '&action=edit&repos=' . $typename . '">' . $settingsstr . '</a>' . $admininstancenumbertext . $instancenumbertext . " \n " ;
}
// Get the current visibility
if ( $i -> get_visible ()) {
$currentaction = 'show' ;
} else {
$currentaction = 'hide' ;
}
$select = new single_select ( $this -> repository_action_url ( $typename , 'repos' ), 'action' , $actionchoicesforexisting , $currentaction , null , 'applyto' . basename ( $typename ));
2009-12-27 23:31:46 +00:00
2010-04-30 08:03:32 +00:00
// Display up/down link
$updown = '' ;
$spacer = $OUTPUT -> spacer ( array ( 'height' => 15 , 'width' => 15 )); // should be done with CSS instead
2008-09-03 09:45:27 +00:00
2010-04-30 08:03:32 +00:00
if ( $updowncount > 1 ) {
$updown .= " <a href= \" $this->baseurl &action=moveup&repos= " . $typename . " \" > " ;
$updown .= " <img src= \" " . $OUTPUT -> pix_url ( 't/up' ) . " \" alt= \" up \" /></a> " ;
}
else {
$updown .= $spacer ;
}
if ( $updowncount < $totalinstances ) {
$updown .= " <a href= \" $this->baseurl &action=movedown&repos= " . $typename . " \" > " ;
$updown .= " <img src= \" " . $OUTPUT -> pix_url ( 't/down' ) . " \" alt= \" down \" /></a> " ;
}
else {
$updown .= $spacer ;
}
2008-09-03 09:45:27 +00:00
2010-04-30 08:03:32 +00:00
$updowncount ++ ;
2008-09-04 03:41:23 +00:00
2010-04-30 08:03:32 +00:00
$table -> data [] = array ( $i -> get_readablename (), $OUTPUT -> render ( $select ), $updown , $settings );
2008-09-04 03:41:23 +00:00
2010-04-30 08:03:32 +00:00
if ( ! in_array ( $typename , $alreadyplugins )) {
$alreadyplugins [] = $typename ;
}
2008-09-02 08:58:53 +00:00
}
2008-08-13 04:09:13 +00:00
}
2010-04-30 08:03:32 +00:00
// Get all the plugins that exist on disk
$plugins = get_plugin_list ( 'repository' );
if ( ! empty ( $plugins )) {
foreach ( $plugins as $plugin => $dir ) {
// Check that it has not already been listed
if ( ! in_array ( $plugin , $alreadyplugins )) {
$select = new single_select ( $this -> repository_action_url ( $plugin , 'repos' ), 'action' , $actionchoicesfornew , 'delete' , null , 'applyto' . basename ( $plugin ));
$table -> data [] = array ( get_string ( 'repositoryname' , 'repository_' . $plugin ), $OUTPUT -> render ( $select ), '' , '' );
}
2008-09-02 08:58:53 +00:00
}
2008-08-13 04:09:13 +00:00
}
2010-04-30 08:03:32 +00:00
$return .= html_writer :: table ( $table );
$return .= $OUTPUT -> box_end ();
return highlight ( $query , $return );
2008-08-13 04:09:13 +00:00
}
}
2009-02-13 03:08:35 +00:00
2009-05-22 02:05:46 +00:00
/**
2009-10-12 21:46:16 +00:00
* Special class for management of external services
2009-06-30 15:19:12 +00:00
*
2009-10-12 21:46:16 +00:00
* @ author Petr Skoda ( skodak )
2009-05-22 02:05:46 +00:00
*/
2009-10-12 21:46:16 +00:00
class admin_setting_manageexternalservices extends admin_setting {
2009-05-22 02:05:46 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
2009-02-13 03:08:35 +00:00
public function __construct () {
2010-02-08 16:26:15 +00:00
$this -> nosave = true ;
2009-10-12 21:46:16 +00:00
parent :: __construct ( 'webservicesui' , get_string ( 'externalservices' , 'webservice' ), '' , '' );
2009-02-13 03:08:35 +00:00
}
2009-05-22 02:05:46 +00:00
/**
* Always returns true , does nothing
2009-10-12 21:46:16 +00:00
*
2009-05-22 02:05:46 +00:00
* @ return true
*/
2009-02-13 03:08:35 +00:00
public function get_setting () {
return true ;
}
2009-04-16 07:16:44 +00:00
2009-05-22 02:05:46 +00:00
/**
2009-10-12 21:46:16 +00:00
* Always returns true , does nothing
*
* @ return true
*/
public function get_defaultsetting () {
return true ;
}
/**
* Always returns '' , does not write anything
2009-05-22 02:05:46 +00:00
*
* @ return string Always returns ''
*/
2009-02-13 03:08:35 +00:00
public function write_setting ( $data ) {
2009-10-12 21:46:16 +00:00
// do not write any setting
2009-02-13 03:08:35 +00:00
return '' ;
}
2009-05-22 02:05:46 +00:00
/**
2009-10-12 21:46:16 +00:00
* Checks if $query is one of the available external services
2009-05-22 02:05:46 +00:00
*
2009-10-12 21:46:16 +00:00
* @ param string $query The string to search for
* @ return bool Returns true if found , false if not
*/
public function is_related ( $query ) {
global $DB ;
if ( parent :: is_related ( $query )) {
return true ;
}
$textlib = textlib_get_instance ();
$services = $DB -> get_records ( 'external_services' , array (), 'id, name' );
foreach ( $services as $service ) {
if ( strpos ( $textlib -> strtolower ( $service -> name ), $query ) !== false ) {
return true ;
}
}
return false ;
}
/**
* Builds the XHTML to display the control
*
* @ param string $data Unused
2009-05-22 02:05:46 +00:00
* @ param string $query
2009-10-12 21:46:16 +00:00
* @ return string
2009-05-22 02:05:46 +00:00
*/
2009-02-13 03:08:35 +00:00
public function output_html ( $data , $query = '' ) {
2009-10-12 21:46:16 +00:00
global $CFG , $OUTPUT , $DB ;
// display strings
$stradministration = get_string ( 'administration' );
$stredit = get_string ( 'edit' );
$strservice = get_string ( 'externalservice' , 'webservice' );
$strdelete = get_string ( 'delete' );
$strplugin = get_string ( 'plugin' , 'admin' );
$stradd = get_string ( 'add' );
$strfunctions = get_string ( 'functions' , 'webservice' );
2010-02-12 04:14:26 +00:00
$strusers = get_string ( 'users' );
2009-10-21 19:36:39 +00:00
$strserviceusers = get_string ( 'serviceusers' , 'webservice' );
2009-10-12 21:46:16 +00:00
2009-10-21 19:58:50 +00:00
$esurl = " $CFG->wwwroot / $CFG->admin /webservice/service.php " ;
$efurl = " $CFG->wwwroot / $CFG->admin /webservice/service_functions.php " ;
$euurl = " $CFG->wwwroot / $CFG->admin /webservice/service_users.php " ;
2009-10-12 21:46:16 +00:00
// built in services
2009-12-21 06:11:50 +00:00
$services = $DB -> get_records_select ( 'external_services' , 'component IS NOT NULL' , null , 'name' );
$return = " " ;
if ( ! empty ( $services )) {
$return .= $OUTPUT -> heading ( get_string ( 'servicesbuiltin' , 'webservice' ), 3 , 'main' );
2009-10-12 21:46:16 +00:00
2009-04-16 07:16:44 +00:00
2009-02-13 03:08:35 +00:00
2009-12-21 06:11:50 +00:00
$table = new html_table ();
$table -> head = array ( $strservice , $strplugin , $strfunctions , $strusers , $stredit );
$table -> align = array ( 'left' , 'left' , 'center' , 'center' , 'center' );
$table -> size = array ( '30%' , '20%' , '20%' , '20%' , '10%' );
$table -> width = '100%' ;
$table -> data = array ();
2009-02-13 03:08:35 +00:00
2009-12-21 06:11:50 +00:00
// iterate through auth plugins and add to the display table
foreach ( $services as $service ) {
$name = $service -> name ;
2009-02-13 03:08:35 +00:00
2009-12-21 06:11:50 +00:00
// hide/show link
if ( $service -> enabled ) {
$displayname = " <span> $name </span> " ;
} else {
$displayname = " <span class= \" dimmed_text \" > $name </span> " ;
}
2009-10-12 21:46:16 +00:00
2009-12-21 06:11:50 +00:00
$plugin = $service -> component ;
2009-10-12 21:46:16 +00:00
2009-12-21 06:11:50 +00:00
$functions = " <a href= \" $efurl ?id= $service->id\ " > $strfunctions </ a > " ;
2009-02-13 03:08:35 +00:00
2009-12-21 06:11:50 +00:00
if ( $service -> restrictedusers ) {
$users = " <a href= \" $euurl ?id= $service->id\ " > $strserviceusers </ a > " ;
} else {
2010-02-12 04:14:26 +00:00
$users = get_string ( 'allusers' , 'webservice' );
2009-12-21 06:11:50 +00:00
}
2009-06-30 15:19:12 +00:00
2009-12-21 06:11:50 +00:00
$edit = " <a href= \" $esurl ?id= $service->id\ " > $stredit </ a > " ;
// add a row to the table
$table -> data [] = array ( $displayname , $plugin , $functions , $users , $edit );
}
2010-03-20 22:15:54 +00:00
$return .= html_writer :: table ( $table );
2009-10-12 21:46:16 +00:00
}
2009-02-13 03:08:35 +00:00
2009-10-12 21:46:16 +00:00
// Custom services
2009-10-21 19:36:39 +00:00
$return .= $OUTPUT -> heading ( get_string ( 'servicescustom' , 'webservice' ), 3 , 'main' );
2009-10-12 21:46:16 +00:00
$services = $DB -> get_records_select ( 'external_services' , 'component IS NULL' , null , 'name' );
2009-02-13 03:08:35 +00:00
2009-10-12 21:46:16 +00:00
$table = new html_table ();
$table -> head = array ( $strservice , $strdelete , $strfunctions , $strusers , $stredit );
$table -> align = array ( 'left' , 'center' , 'center' , 'center' , 'center' );
$table -> size = array ( '30%' , '20%' , '20%' , '20%' , '10%' );
$table -> width = '100%' ;
$table -> data = array ();
2009-02-13 03:08:35 +00:00
2009-10-12 21:46:16 +00:00
// iterate through auth plugins and add to the display table
foreach ( $services as $service ) {
$name = $service -> name ;
// hide/show link
if ( $service -> enabled ) {
$displayname = " <span> $name </span> " ;
} else {
$displayname = " <span class= \" dimmed_text \" > $name </span> " ;
}
2009-02-13 03:08:35 +00:00
2009-10-12 21:46:16 +00:00
// delete link
$delete = " <a href= \" $esurl ?action=delete&sesskey= " . sesskey () . " &id= $service->id\ " > $strdelete </ a > " ;
2009-02-13 03:08:35 +00:00
2009-10-12 21:46:16 +00:00
$functions = " <a href= \" $efurl ?id= $service->id\ " > $strfunctions </ a > " ;
2009-02-13 03:08:35 +00:00
2009-10-12 21:46:16 +00:00
if ( $service -> restrictedusers ) {
2009-10-21 19:36:39 +00:00
$users = " <a href= \" $euurl ?id= $service->id\ " > $strserviceusers </ a > " ;
2009-10-12 21:46:16 +00:00
} else {
2010-02-12 04:14:26 +00:00
$users = get_string ( 'allusers' , 'webservice' );
2009-02-13 03:08:35 +00:00
}
2009-10-12 21:46:16 +00:00
$edit = " <a href= \" $esurl ?id= $service->id\ " > $stredit </ a > " ;
// add a row to the table
$table -> data [] = array ( $displayname , $delete , $functions , $users , $edit );
2009-02-13 03:08:35 +00:00
}
2009-10-12 21:46:16 +00:00
// add new custom service option
2010-03-20 22:15:54 +00:00
$return .= html_writer :: table ( $table );
2009-02-13 03:08:35 +00:00
2010-01-19 10:07:26 +00:00
$return .= '<br />' ;
// add a token to the table
$return .= " <a href= \" $esurl ?id=0 \" > $stradd </a> " ;
2009-10-12 21:46:16 +00:00
return highlight ( $query , $return );
2009-09-09 07:55:03 +00:00
}
}
2010-01-22 02:04:12 +00:00
/**
* Special class for overview of external services
*
* @ author Jerome Mouneyrac
*/
class admin_setting_webservicesoverview extends admin_setting {
/**
* Calls parent :: __construct with specific arguments
*/
public function __construct () {
2010-02-08 16:26:15 +00:00
$this -> nosave = true ;
2010-01-22 02:04:12 +00:00
parent :: __construct ( 'webservicesoverviewui' , get_string ( 'webservicesoverview' , 'webservice' ), '' , '' );
}
/**
* Always returns true , does nothing
*
* @ return true
*/
public function get_setting () {
return true ;
}
/**
* Always returns true , does nothing
*
* @ return true
*/
public function get_defaultsetting () {
return true ;
}
/**
* Always returns '' , does not write anything
*
* @ return string Always returns ''
*/
public function write_setting ( $data ) {
// do not write any setting
return '' ;
}
/**
* Builds the XHTML to display the control
*
* @ param string $data Unused
* @ param string $query
* @ return string
*/
public function output_html ( $data , $query = '' ) {
global $CFG , $OUTPUT ;
$return = " " ;
/// One system controlling Moodle with Token
$return .= $OUTPUT -> heading ( get_string ( 'onesystemcontrolling' , 'webservice' ), 3 , 'main' );
$table = new html_table ();
$table -> head = array ( get_string ( 'step' , 'webservice' ), get_string ( 'status' ), get_string ( 'description' ));
$table -> size = array ( '30%' , '10%' , '60%' );
$table -> align = array ( 'left' , 'left' , 'left' );
$table -> width = '90%' ;
$table -> data = array ();
$return .= " <br/> " . get_string ( 'onesystemcontrollingdescription' , 'webservice' ) . " <br/><br/> " ;
/// 1. Enable Web Services
$row = array ();
2010-02-02 02:45:32 +00:00
$url = new moodle_url ( " /admin/search.php?query=enablewebservices " );
2010-01-22 02:04:12 +00:00
$row [ 0 ] = " 1. " . " <a href= " . $url . " > " . get_string ( 'enablews' , 'webservice' ) . " </a> " ;
$status = '<span class="statuscritical">' . get_string ( 'no' ) . '</span>' ; //should never happens as this page should only be seen once web service are activated
if ( $CFG -> enablewebservices ) {
$status = get_string ( 'yes' );
}
$row [ 1 ] = $status ;
$row [ 2 ] = get_string ( 'enablewsdescription' , 'webservice' );
$table -> data [] = $row ;
/// 2. Enable protocols
$row = array ();
$url = new moodle_url ( " /admin/settings.php?section=webserviceprotocols " );
$row [ 0 ] = " 2. " . " <a href= " . $url . " > " . get_string ( 'enableprotocols' , 'webservice' ) . " </a> " ;
$status = '<span class="statuscritical">' . get_string ( 'none' ) . '</span>' ; //should never happens as this page should only be seen once web service are activated
//retrieve activated protocol
$active_protocols = empty ( $CFG -> webserviceprotocols ) ? array () : explode ( ',' , $CFG -> webserviceprotocols );
if ( ! empty ( $active_protocols )) {
$status = " " ;
foreach ( $active_protocols as $protocol ) {
$status .= $protocol . " <br/> " ;
}
}
$row [ 1 ] = $status ;
$row [ 2 ] = get_string ( 'enableprotocolsdescription' , 'webservice' );
$table -> data [] = $row ;
/// 3. Create user account
$row = array ();
$url = new moodle_url ( " /user/editadvanced.php?id=-1 " );
$row [ 0 ] = " 3. " . " <a href= " . $url . " > " . get_string ( 'createuser' , 'webservice' ) . " </a> " ;
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'createuserdescription' , 'webservice' );
$table -> data [] = $row ;
/// 4. Add capability to users
$row = array ();
$url = new moodle_url ( " /admin/roles/check.php?contextid=1 " );
$row [ 0 ] = " 4. " . " <a href= " . $url . " > " . get_string ( 'checkusercapability' , 'webservice' ) . " </a> " ;
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'checkusercapabilitydescription' , 'webservice' );
$table -> data [] = $row ;
2010-02-04 07:06:27 +00:00
/// 5. Select a web service
2010-01-22 02:04:12 +00:00
$row = array ();
2010-02-04 07:06:27 +00:00
$url = new moodle_url ( " /admin/settings.php?section=externalservices " );
$row [ 0 ] = " 5. " . " <a href= " . $url . " > " . get_string ( 'selectservice' , 'webservice' ) . " </a> " ;
2010-01-22 02:04:12 +00:00
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'createservicedescription' , 'webservice' );
$table -> data [] = $row ;
/// 6. Add functions
$row = array ();
$url = new moodle_url ( " /admin/settings.php?section=externalservices " );
$row [ 0 ] = " 6. " . " <a href= " . $url . " > " . get_string ( 'addfunctions' , 'webservice' ) . " </a> " ;
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'addfunctionsdescription' , 'webservice' );
$table -> data [] = $row ;
/// 7. Add the specific user
$row = array ();
$url = new moodle_url ( " /admin/settings.php?section=externalservices " );
$row [ 0 ] = " 7. " . " <a href= " . $url . " > " . get_string ( 'selectspecificuser' , 'webservice' ) . " </a> " ;
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'selectspecificuserdescription' , 'webservice' );
$table -> data [] = $row ;
/// 8. Create token for the specific user
$row = array ();
$url = new moodle_url ( " /admin/webservice/tokens.php?sesskey= " . sesskey () . " &action=create " );
$row [ 0 ] = " 8. " . " <a href= " . $url . " > " . get_string ( 'createtokenforuser' , 'webservice' ) . " </a> " ;
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'createtokenforuserdescription' , 'webservice' );
$table -> data [] = $row ;
/// 9. Enable the documentation
$row = array ();
2010-02-04 07:06:27 +00:00
$url = new moodle_url ( " /admin/search.php?query=enablewsdocumentation " );
2010-01-22 02:04:12 +00:00
$row [ 0 ] = " 9. " . " <a href= " . $url . " > " . get_string ( 'enabledocumentation' , 'webservice' ) . " </a> " ;
$status = '<span class="warning">' . get_string ( 'no' ) . '</span>' ; //should never happens as this page should only be seen once web service are activated
if ( $CFG -> enablewsdocumentation ) {
$status = get_string ( 'yes' );
}
$row [ 1 ] = $status ;
$row [ 2 ] = get_string ( 'enabledocumentationdescription' , 'webservice' );
$table -> data [] = $row ;
2010-01-29 03:50:06 +00:00
/// 10. Test the service
$row = array ();
$url = new moodle_url ( " /admin/webservice/testclient.php " );
$row [ 0 ] = " 10. " . " <a href= " . $url . " > " . get_string ( 'testwithtestclient' , 'webservice' ) . " </a> " ;
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'testwithtestclientdescription' , 'webservice' );
$table -> data [] = $row ;
2010-02-08 16:26:15 +00:00
2010-03-20 22:15:54 +00:00
$return .= html_writer :: table ( $table );
2010-01-22 02:04:12 +00:00
/// Users as clients with token
$return .= " <br/><br/><br/> " ;
$return .= $OUTPUT -> heading ( get_string ( 'userasclients' , 'webservice' ), 3 , 'main' );
$table = new html_table ();
$table -> head = array ( get_string ( 'step' , 'webservice' ), get_string ( 'status' ), get_string ( 'description' ));
$table -> size = array ( '30%' , '10%' , '60%' );
$table -> align = array ( 'left' , 'left' , 'left' );
$table -> width = '90%' ;
$table -> data = array ();
$return .= " <br/> " . get_string ( 'userasclientsdescription' , 'webservice' ) . " <br/><br/> " ;
/// 1. Enable Web Services
$row = array ();
2010-02-04 07:06:27 +00:00
$url = new moodle_url ( " /admin/search.php?query=enablewebservices " );
2010-01-22 02:04:12 +00:00
$row [ 0 ] = " 1. " . " <a href= " . $url . " > " . get_string ( 'enablews' , 'webservice' ) . " </a> " ;
$status = '<span class="statuscritical">' . get_string ( 'no' ) . '</span>' ; //should never happens as this page should only be seen once web service are activated
if ( $CFG -> enablewebservices ) {
$status = get_string ( 'yes' );
}
$row [ 1 ] = $status ;
$row [ 2 ] = get_string ( 'enablewsdescription' , 'webservice' );
$table -> data [] = $row ;
/// 2. Enable protocols
$row = array ();
$url = new moodle_url ( " /admin/settings.php?section=webserviceprotocols " );
$row [ 0 ] = " 2. " . " <a href= " . $url . " > " . get_string ( 'enableprotocols' , 'webservice' ) . " </a> " ;
$status = '<span class="statuscritical">' . get_string ( 'none' ) . '</span>' ; //should never happens as this page should only be seen once web service are activated
//retrieve activated protocol
$active_protocols = empty ( $CFG -> webserviceprotocols ) ? array () : explode ( ',' , $CFG -> webserviceprotocols );
if ( ! empty ( $active_protocols )) {
$status = " " ;
foreach ( $active_protocols as $protocol ) {
$status .= $protocol . " <br/> " ;
}
}
$row [ 1 ] = $status ;
$row [ 2 ] = get_string ( 'enableprotocolsdescription' , 'webservice' );
$table -> data [] = $row ;
2010-02-04 07:06:27 +00:00
/// 3. Select a web service
2010-01-22 02:04:12 +00:00
$row = array ();
2010-02-04 07:06:27 +00:00
$url = new moodle_url ( " /admin/settings.php?section=externalservices " );
$row [ 0 ] = " 3. " . " <a href= " . $url . " > " . get_string ( 'selectservice' , 'webservice' ) . " </a> " ;
2010-01-22 02:04:12 +00:00
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'createserviceforusersdescription' , 'webservice' );
$table -> data [] = $row ;
/// 4. Add functions
$row = array ();
$url = new moodle_url ( " /admin/settings.php?section=externalservices " );
$row [ 0 ] = " 4. " . " <a href= " . $url . " > " . get_string ( 'addfunctions' , 'webservice' ) . " </a> " ;
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'addfunctionsdescription' , 'webservice' );
$table -> data [] = $row ;
/// 5. Add capability to users
$row = array ();
$url = new moodle_url ( " /admin/roles/check.php?contextid=1 " );
$row [ 0 ] = " 5. " . " <a href= " . $url . " > " . get_string ( 'addcapabilitytousers' , 'webservice' ) . " </a> " ;
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'addcapabilitytousersdescription' , 'webservice' );
$table -> data [] = $row ;
2010-01-29 03:50:06 +00:00
/// 6. Test the service
$row = array ();
$url = new moodle_url ( " /admin/webservice/testclient.php " );
$row [ 0 ] = " 6. " . " <a href= " . $url . " > " . get_string ( 'testwithtestclient' , 'webservice' ) . " </a> " ;
$row [ 1 ] = " " ;
$row [ 2 ] = get_string ( 'testauserwithtestclientdescription' , 'webservice' );
$table -> data [] = $row ;
2010-01-22 02:04:12 +00:00
2010-03-20 22:15:54 +00:00
$return .= html_writer :: table ( $table );
2010-01-22 02:04:12 +00:00
return highlight ( $query , $return );
}
}
2009-09-09 07:55:03 +00:00
/**
2009-10-12 21:46:16 +00:00
* Special class for web service protocol administration .
2009-09-09 07:55:03 +00:00
*
2009-10-12 21:46:16 +00:00
* @ author Petr Skoda ( skodak )
2009-09-09 07:55:03 +00:00
*/
2009-10-13 06:16:06 +00:00
class admin_setting_managewebserviceprotocols extends admin_setting {
2009-09-09 07:55:03 +00:00
/**
* Calls parent :: __construct with specific arguments
*/
public function __construct () {
2010-02-08 16:26:15 +00:00
$this -> nosave = true ;
2009-10-12 21:46:16 +00:00
parent :: __construct ( 'webservicesui' , get_string ( 'manageprotocols' , 'webservice' ), '' , '' );
2009-09-09 07:55:03 +00:00
}
/**
2009-10-12 21:46:16 +00:00
* Always returns true , does nothing
2009-09-09 07:55:03 +00:00
*
* @ return true
*/
public function get_setting () {
return true ;
}
/**
2009-10-12 21:46:16 +00:00
* Always returns true , does nothing
*
* @ return true
*/
public function get_defaultsetting () {
return true ;
}
/**
* Always returns '' , does not write anything
2009-09-09 07:55:03 +00:00
*
* @ return string Always returns ''
*/
public function write_setting ( $data ) {
2009-10-12 21:46:16 +00:00
// do not write any setting
2009-09-09 07:55:03 +00:00
return '' ;
}
/**
2009-10-12 21:46:16 +00:00
* Checks if $query is one of the available webservices
*
* @ param string $query The string to search for
* @ return bool Returns true if found , false if not
*/
public function is_related ( $query ) {
if ( parent :: is_related ( $query )) {
return true ;
}
$textlib = textlib_get_instance ();
$protocols = get_plugin_list ( 'webservice' );
foreach ( $protocols as $protocol => $location ) {
if ( strpos ( $protocol , $query ) !== false ) {
return true ;
}
$protocolstr = get_string ( 'pluginname' , 'webservice_' . $protocol );
if ( strpos ( $textlib -> strtolower ( $protocolstr ), $query ) !== false ) {
return true ;
}
}
return false ;
}
/**
* Builds the XHTML to display the control
2009-09-09 07:55:03 +00:00
*
* @ param string $data Unused
* @ param string $query
2009-10-12 21:46:16 +00:00
* @ return string
2009-09-09 07:55:03 +00:00
*/
public function output_html ( $data , $query = '' ) {
2009-10-12 21:46:16 +00:00
global $CFG , $OUTPUT ;
2009-09-09 07:55:03 +00:00
2009-10-12 21:46:16 +00:00
// display strings
$stradministration = get_string ( 'administration' );
$strsettings = get_string ( 'settings' );
$stredit = get_string ( 'edit' );
$strprotocol = get_string ( 'protocol' , 'webservice' );
$strenable = get_string ( 'enable' );
$strdisable = get_string ( 'disable' );
$strversion = get_string ( 'version' );
$struninstall = get_string ( 'uninstallplugin' , 'admin' );
2009-09-09 07:55:03 +00:00
2009-10-12 21:46:16 +00:00
$protocols_available = get_plugin_list ( 'webservice' );
$active_protocols = empty ( $CFG -> webserviceprotocols ) ? array () : explode ( ',' , $CFG -> webserviceprotocols );
ksort ( $protocols_available );
2009-09-09 07:55:03 +00:00
2009-10-12 21:46:16 +00:00
foreach ( $active_protocols as $key => $protocol ) {
if ( empty ( $protocols_available [ $protocol ])) {
unset ( $active_protocols [ $key ]);
2009-09-09 07:55:03 +00:00
}
2009-10-12 21:46:16 +00:00
}
$return = $OUTPUT -> heading ( get_string ( 'actwebserviceshhdr' , 'webservice' ), 3 , 'main' , true );
$return .= $OUTPUT -> box_start ( 'generalbox webservicesui' );
$table = new html_table ();
$table -> head = array ( $strprotocol , $strversion , $strenable , $struninstall , $strsettings );
$table -> align = array ( 'left' , 'center' , 'center' , 'center' , 'center' );
$table -> width = '100%' ;
$table -> data = array ();
// iterate through auth plugins and add to the display table
2009-10-21 19:58:50 +00:00
$url = " $CFG->wwwroot / $CFG->admin /webservice/protocols.php?sesskey= " . sesskey ();
2009-10-12 21:46:16 +00:00
foreach ( $protocols_available as $protocol => $location ) {
$name = get_string ( 'pluginname' , 'webservice_' . $protocol );
$plugin = new object ();
if ( file_exists ( $CFG -> dirroot . '/webservice/' . $protocol . '/version.php' )) {
include ( $CFG -> dirroot . '/webservice/' . $protocol . '/version.php' );
2009-09-09 07:55:03 +00:00
}
2009-10-12 21:46:16 +00:00
$version = isset ( $plugin -> version ) ? $plugin -> version : '' ;
2009-09-09 07:55:03 +00:00
2009-10-12 21:46:16 +00:00
// hide/show link
if ( in_array ( $protocol , $active_protocols )) {
$hideshow = " <a href= \" $url &action=disable&webservice= $protocol\ " > " ;
2009-12-16 21:50:45 +00:00
$hideshow .= " <img src= \" " . $OUTPUT -> pix_url ( 'i/hide' ) . " \" class= \" icon \" alt= \" $strdisable\ " /></ a > " ;
2009-10-12 21:46:16 +00:00
$displayname = " <span> $name </span> " ;
} else {
$hideshow = " <a href= \" $url &action=enable&webservice= $protocol\ " > " ;
2009-12-16 21:50:45 +00:00
$hideshow .= " <img src= \" " . $OUTPUT -> pix_url ( 'i/show' ) . " \" class= \" icon \" alt= \" $strenable\ " /></ a > " ;
2009-10-12 21:46:16 +00:00
$displayname = " <span class= \" dimmed_text \" > $name </span> " ;
}
2009-09-09 07:55:03 +00:00
2009-10-12 21:46:16 +00:00
// delete link
$uninstall = " <a href= \" $url &action=uninstall&webservice= $protocol\ " > $struninstall </ a > " ;
2009-09-09 07:55:03 +00:00
2009-10-12 21:46:16 +00:00
// settings link
if ( file_exists ( $CFG -> dirroot . '/webservice/' . $protocol . '/settings.php' )) {
$settings = " <a href= \" settings.php?section=webservicesetting $protocol\ " > $strsettings </ a > " ;
} else {
$settings = '' ;
}
2009-09-09 07:55:03 +00:00
2009-10-12 21:46:16 +00:00
// add a row to the table
$table -> data [] = array ( $displayname , $version , $hideshow , $uninstall , $settings );
}
2010-03-20 22:15:54 +00:00
$return .= html_writer :: table ( $table );
2010-01-19 08:36:16 +00:00
$return .= get_string ( 'configwebserviceplugins' , 'webservice' );
2009-10-12 21:46:16 +00:00
$return .= $OUTPUT -> box_end ();
2009-09-09 07:55:03 +00:00
2009-10-12 21:46:16 +00:00
return highlight ( $query , $return );
2009-02-13 03:08:35 +00:00
}
}
2010-01-06 09:33:05 +00:00
/**
* Special class for web service token administration .
*
* @ author Jerome Mouneyrac
*/
class admin_setting_managewebservicetokens extends admin_setting {
/**
* Calls parent :: __construct with specific arguments
*/
public function __construct () {
2010-02-08 16:26:15 +00:00
$this -> nosave = true ;
2010-01-06 09:33:05 +00:00
parent :: __construct ( 'webservicestokenui' , get_string ( 'managetokens' , 'webservice' ), '' , '' );
}
/**
* Always returns true , does nothing
*
* @ return true
*/
public function get_setting () {
return true ;
}
/**
* Always returns true , does nothing
*
* @ return true
*/
public function get_defaultsetting () {
return true ;
}
/**
* Always returns '' , does not write anything
*
* @ return string Always returns ''
*/
public function write_setting ( $data ) {
// do not write any setting
return '' ;
}
/**
* Builds the XHTML to display the control
*
* @ param string $data Unused
* @ param string $query
* @ return string
*/
public function output_html ( $data , $query = '' ) {
global $CFG , $OUTPUT , $DB , $USER ;
// display strings
$stroperation = get_string ( 'operation' , 'webservice' );
$strtoken = get_string ( 'token' , 'webservice' );
$strservice = get_string ( 'service' , 'webservice' );
$struser = get_string ( 'user' );
$strcontext = get_string ( 'context' , 'webservice' );
2010-01-11 08:23:39 +00:00
$strvaliduntil = get_string ( 'validuntil' , 'webservice' );
2010-01-25 02:43:23 +00:00
$striprestriction = get_string ( 'iprestriction' , 'webservice' );
2010-01-06 09:33:05 +00:00
2010-01-19 10:07:26 +00:00
$return = $OUTPUT -> box_start ( 'generalbox webservicestokenui' );
2010-01-06 09:33:05 +00:00
$table = new html_table ();
2010-01-25 02:43:23 +00:00
$table -> head = array ( $strtoken , $struser , $strservice , $strcontext , $striprestriction , $strvaliduntil , $stroperation );
$table -> align = array ( 'left' , 'left' , 'left' , 'center' , 'center' , 'center' , 'center' );
2010-01-06 09:33:05 +00:00
$table -> width = '100%' ;
$table -> data = array ();
$tokenpageurl = " $CFG->wwwroot / $CFG->admin /webservice/tokens.php?sesskey= " . sesskey ();
2010-01-11 08:23:39 +00:00
//TODO: in order to let the administrator delete obsolete token, split this request in multiple request or use LEFT JOIN
2010-01-06 09:33:05 +00:00
//here retrieve token list (including linked users firstname/lastname and linked services name)
2010-02-12 04:14:26 +00:00
$sql = " SELECT t.id, t.token, u.id AS userid, u.firstname, u.lastname, s.name, t.validuntil
2010-01-14 08:37:53 +00:00
FROM { external_tokens } t , { user } u , { external_services } s
WHERE t . creatorid = ? AND t . tokentype = ? AND s . id = t . externalserviceid AND t . userid = u . id " ;
$tokens = $DB -> get_records_sql ( $sql , array ( $USER -> id , EXTERNAL_TOKEN_PERMANENT ));
2010-01-06 09:33:05 +00:00
if ( ! empty ( $tokens )) {
foreach ( $tokens as $token ) {
//TODO: retrieve context
$delete = " <a href= \" " . $tokenpageurl . " &action=delete&tokenid= " . $token -> id . " \" > " ;
$delete .= get_string ( 'delete' ) . " </a> " ;
2010-01-11 08:23:39 +00:00
if ( empty ( $_SERVER [ 'HTTPS' ])) {
$token -> token = get_string ( 'activatehttps' , 'webservice' );
}
$validuntil = '' ;
if ( ! empty ( $token -> validuntil )) {
$validuntil = date ( " F j, Y " ); //TODO: language support (look for moodle function)
}
2010-01-06 09:33:05 +00:00
2010-01-25 02:43:23 +00:00
$iprestriction = '' ;
if ( ! empty ( $token -> iprestriction )) {
2010-02-08 16:26:15 +00:00
$iprestriction = $token -> iprestriction ;
2010-01-25 02:43:23 +00:00
}
2010-05-04 13:04:35 +00:00
$userprofilurl = new moodle_url ( '/user/profile.php?id=' . $token -> userid );
2010-02-12 04:14:26 +00:00
$useratag = html_writer :: start_tag ( 'a' , array ( 'href' => $userprofilurl ));
$useratag .= $token -> firstname . " " . $token -> lastname ;
$useratag .= html_writer :: end_tag ( 'a' );
$table -> data [] = array ( $token -> token , $useratag , $token -> name , '' , $iprestriction , $validuntil , $delete );
2010-01-06 09:33:05 +00:00
}
2010-03-20 22:15:54 +00:00
$return .= html_writer :: table ( $table );
2010-01-06 09:33:05 +00:00
$return .= get_string ( 'httpswarning' , 'webservice' );
} else {
$return .= get_string ( 'notoken' , 'webservice' );
}
$return .= $OUTPUT -> box_end ();
// add a token to the table
$return .= " <a href= \" " . $tokenpageurl . " &action=create \" > " ;
$return .= get_string ( 'add' ) . " </a> " ;
return highlight ( $query , $return );
}
2010-02-02 02:45:32 +00:00
}