2006-09-18 05:50:02 +00:00
< ? php
2004-09-26 05:10:38 +00:00
/**
* adminlib . php - Contains functions that only administrators will ever need to use
*
2006-09-18 05:50:02 +00:00
* @ author Martin Dougiamas and many others
2004-09-26 05:10:38 +00:00
* @ version $Id $
* @ license http :// www . gnu . org / copyleft / gpl . html GNU Public License
* @ package moodlecore
*/
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-30 18:47:22 +00:00
require_once ( $CFG -> libdir . '/messagelib.php' ); // Messagelib functions
2008-06-15 10:32:50 +00:00
2008-08-21 15:29:42 +00:00
define ( 'INSECURE_DATAROOT_WARNING' , 1 );
define ( 'INSECURE_DATAROOT_ERROR' , 2 );
2008-08-16 12:16:01 +00:00
/**
* Upgrade savepoint , marks end of each upgrade block .
* It stores new main version , resets upgrade timeout
* and abort upgrade if user cancels page loading .
*
* Please do not make large upgrade blocks with lots of operations ,
* for example when adding tables keep only one table operation per block .
*
* @ param bool $result false if upgrade step failed , true if completed
* @ param string or float $version main version
* @ return void
*/
2007-10-10 13:14:56 +00:00
function upgrade_main_savepoint ( $result , $version ) {
global $CFG ;
if ( $result ) {
if ( $CFG -> version >= $version ) {
// something really wrong is going on in main upgrade script
2008-08-16 12:16:01 +00:00
print_error ( 'cannotdowngrade' , 'debug' , '' , ( object ) array ( 'oldversion' => $CFG -> version , 'newversion' => $version ));
2007-10-10 13:14:56 +00:00
}
set_config ( 'version' , $version );
} else {
notify ( " Upgrade savepoint: Error during main upgrade to version $version " );
}
2008-08-16 12:16:01 +00:00
// reset upgrade timeout to default
upgrade_set_timeout ();
// this is a safe place to stop upgrades if user aborts page loading
if ( connection_aborted ()) {
die ;
}
2007-10-10 13:14:56 +00:00
}
2008-08-16 12:16:01 +00:00
/**
* Module upgrade savepoint , marks end of module upgrade blocks
* It stores module version , resets upgrade timeout
* and abort upgrade if usercancels page loading .
*
* @ param bool $result false if upgrade step failed , true if completed
* @ param string or float $version main version
* @ return void
*/
2008-06-22 23:35:52 +00:00
function upgrade_mod_savepoint ( $result , $version , $modname ) {
global $DB ;
if ( ! $module = $DB -> get_record ( 'modules' , array ( 'name' => $modname ))) {
print_error ( 'modulenotexist' , 'debug' , '' , $modname );
}
if ( $result ) {
if ( $module -> version >= $version ) {
// something really wrong is going on in upgrade script
2008-08-16 12:16:01 +00:00
print_error ( 'cannotdowngrade' , 'debug' , '' , ( object ) array ( 'oldversion' => $module -> version , 'newversion' => $version ));
2008-06-22 23:35:52 +00:00
}
2008-09-14 07:39:41 +00:00
$module -> version = $version ;
2008-06-22 23:35:52 +00:00
$DB -> update_record ( 'modules' , $module );
} else {
notify ( " Upgrade savepoint: Error during mod upgrade to version $version " );
}
2008-08-16 12:16:01 +00:00
// reset upgrade timeout to default
upgrade_set_timeout ();
// this is a safe place to stop upgrades if user aborts page loading
if ( connection_aborted ()) {
die ;
}
}
function upgrade_blocks_savepoint ( $result , $version , $blockname ) {
global $DB ;
if ( ! $block = $DB -> get_record ( 'block' , array ( 'name' => $blockname ))) {
print_error ( 'blocknotexist' , 'debug' , '' , $blockname );
}
if ( $result ) {
if ( $block -> version >= $version ) {
// something really wrong is going on in upgrade script
print_error ( 'cannotdowngrade' , 'debug' , '' , ( object ) array ( 'oldversion' => $block -> version , 'newversion' => $version ));
}
2008-09-14 07:39:41 +00:00
$block -> version = $version ;
2008-08-16 12:16:01 +00:00
$DB -> update_record ( 'block' , $block );
} else {
notify ( " Upgrade savepoint: Error during mod upgrade to version $version " );
}
// reset upgrade timeout to default
upgrade_set_timeout ();
// this is a safe place to stop upgrades if user aborts page loading
if ( connection_aborted ()) {
die ;
}
2007-10-10 13:14:56 +00:00
}
function upgrade_plugin_savepoint ( $result , $version , $type , $dir ) {
2008-09-10 10:15:05 +00:00
if ( $result ) {
$fullname = $type . '_' . $dir ;
$installedversion = get_config ( $fullname , 'version' );
if ( $installedversion >= $version ) {
// Something really wrong is going on in the upgrade script
$a = new stdClass ;
$a -> oldversion = $installedversion ;
$a -> newversion = $version ;
print_error ( 'cannotdowngrade' , 'debug' , '' , $a );
}
set_config ( 'version' , $version , $fullname );
} else {
notify ( " Upgrade savepoint: Error during mod upgrade to version $version " );
}
// Reset upgrade timeout to default
upgrade_set_timeout ();
// This is a safe place to stop upgrades if user aborts page loading
if ( connection_aborted ()) {
die ;
}
2007-10-10 13:14:56 +00:00
}
2008-06-15 10:32:50 +00:00
/**
* Delete all plugin tables
* @ name string name of plugin , used as table prefix
* @ file string path to install . xml file
* @ feedback boolean
*/
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 .
* @ return array of lowercase table names
*/
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 ();
$structure =& $xmldb_file -> getStructure ();
if ( $loaded and $tables = $structure -> getTables ()) {
foreach ( $tables as $table ) {
$table_names [] = strtolower ( $table -> name );
}
}
}
return $table_names ;
}
2009-01-10 22:01:20 +00:00
/**
* Lists all plugin types
* @ return array of strings - name => location
*/
function get_plugin_types () {
global $CFG ;
return array ( 'mod' => 'mod' ,
'qtype' => 'question/type' ,
'blocks' => 'blocks' ,
'auth' => 'auth' ,
'enrol' => 'enrol' ,
'format' => 'course/format' ,
'gradeexport' => 'grade/export' ,
'gradeimport' => 'grade/import' ,
'gradereport' => 'grade/report' ,
'message' => 'message/output' ,
'coursereport' => 'course/report' ,
'report' => $CFG -> admin . '/report' ,
'quizreport' => 'mod/quiz/report' ,
'portfolio' => 'portfolio/type' ,
'trackerexport' => 'tracker/export' ,
'trackerimport' => 'tracker/import' ,
'trackerreport' => 'tracker/report' ,
);
}
2008-06-15 10:32:50 +00:00
/**
* Returns list of all directories where we expect install . xml files
* @ return array of paths
*/
function get_db_directories () {
global $CFG ;
$dbdirs = array ();
/// First, the main one (lib/db)
$dbdirs [] = $CFG -> libdir . '/db' ;
/// Now, activity modules (mod/xxx/db)
if ( $plugins = get_list_of_plugins ( 'mod' )) {
foreach ( $plugins as $plugin ) {
$dbdirs [] = $CFG -> dirroot . '/mod/' . $plugin . '/db' ;
}
}
/// Now, assignment submodules (mod/assignment/type/xxx/db)
if ( $plugins = get_list_of_plugins ( 'mod/assignment/type' )) {
foreach ( $plugins as $plugin ) {
$dbdirs [] = $CFG -> dirroot . '/mod/assignment/type/' . $plugin . '/db' ;
}
}
/// Now, question types (question/type/xxx/db)
if ( $plugins = get_list_of_plugins ( 'question/type' )) {
foreach ( $plugins as $plugin ) {
$dbdirs [] = $CFG -> dirroot . '/question/type/' . $plugin . '/db' ;
}
}
/// Now, blocks (blocks/xxx/db)
if ( $plugins = get_list_of_plugins ( 'blocks' , 'db' )) {
foreach ( $plugins as $plugin ) {
$dbdirs [] = $CFG -> dirroot . '/blocks/' . $plugin . '/db' ;
}
}
/// Now, course formats (course/format/xxx/db)
if ( $plugins = get_list_of_plugins ( 'course/format' , 'db' )) {
foreach ( $plugins as $plugin ) {
$dbdirs [] = $CFG -> dirroot . '/course/format/' . $plugin . '/db' ;
}
}
/// Now, enrolment plugins (enrol/xxx/db)
if ( $plugins = get_list_of_plugins ( 'enrol' , 'db' )) {
foreach ( $plugins as $plugin ) {
$dbdirs [] = $CFG -> dirroot . '/enrol/' . $plugin . '/db' ;
}
}
/// Now admin report plugins (admin/report/xxx/db)
if ( $plugins = get_list_of_plugins ( $CFG -> admin . '/report' , 'db' )) {
foreach ( $plugins as $plugin ) {
$dbdirs [] = $CFG -> dirroot . '/' . $CFG -> admin . '/report/' . $plugin . '/db' ;
}
}
2008-07-31 06:01:12 +00:00
2008-06-20 09:11:08 +00:00
/// Now quiz report plugins (mod/quiz/report/xxx/db)
if ( $plugins = get_list_of_plugins ( 'mod/quiz/report' , 'db' )) {
foreach ( $plugins as $plugin ) {
$dbdirs [] = $CFG -> dirroot . '/mod/quiz/report/' . $plugin . '/db' ;
}
2008-08-30 11:25:29 +00:00
}
if ( $plugins = get_list_of_plugins ( 'portfolio/type' , 'db' )) {
foreach ( $plugins as $plugin ) {
$dbdirs [] = $CFG -> dirroot . '/portfolio/type/' . $plugin . '/db' ;
}
2008-06-20 09:11:08 +00:00
}
2008-06-15 10:32:50 +00:00
/// Local database changes, if the local folder exists.
if ( file_exists ( $CFG -> dirroot . '/local' )) {
$dbdirs [] = $CFG -> dirroot . '/local/db' ;
}
return $dbdirs ;
}
2009-01-10 22:01:20 +00:00
function print_upgrade_header () {
if ( defined ( 'HEADER_PRINTED' )) {
return ;
}
$strpluginsetup = get_string ( 'pluginsetup' );
print_header ( $strpluginsetup , $strpluginsetup ,
build_navigation ( array ( array ( 'name' => $strpluginsetup , 'link' => null , 'type' => 'misc' ))), '' ,
upgrade_get_javascript (), false , ' ' , ' ' );
}
2004-09-26 05:10:38 +00:00
/**
2006-03-22 10:44:54 +00:00
* Upgrade plugins
2004-09-26 05:10:38 +00:00
*
* @ uses $CFG
2006-03-22 10:44:54 +00:00
* @ param string $type The type of plugins that should be updated ( e . g . 'enrol' , 'qtype' )
* @ param string $dir The directory where the plugins are located ( e . g . 'question/questiontypes' )
* @ param string $return The url to prompt the user to continue to
2006-09-20 21:00:45 +00:00
*/
2009-01-10 22:01:20 +00:00
function upgrade_plugins ( $type , $dir ) {
2008-05-15 21:40:00 +00:00
global $CFG , $interactive , $DB ;
2004-08-19 09:37:42 +00:00
2009-01-10 22:01:20 +00:00
/// special cases
if ( $type === 'mod' ) {
return upgrade_activity_modules ();
} else if ( $type === 'blocks' ) {
return upgrade_blocks_plugins ();
}
2007-09-10 17:13:12 +00:00
2007-07-27 11:31:34 +00:00
$plugs = get_list_of_plugins ( $dir );
2006-08-01 07:46:19 +00:00
$updated_plugins = false ;
$strpluginsetup = get_string ( 'pluginsetup' );
2006-03-22 10:44:54 +00:00
foreach ( $plugs as $plug ) {
2004-08-19 09:37:42 +00:00
2006-03-22 10:44:54 +00:00
$fullplug = $CFG -> dirroot . '/' . $dir . '/' . $plug ;
2004-08-19 09:37:42 +00:00
2006-03-22 10:44:54 +00:00
unset ( $plugin );
2004-08-19 09:37:42 +00:00
2006-08-08 05:13:06 +00:00
if ( is_readable ( $fullplug . '/version.php' )) {
2006-03-22 10:44:54 +00:00
include_once ( $fullplug . '/version.php' ); // defines $plugin with version etc
2004-08-19 09:37:42 +00:00
} else {
continue ; // Nothing to do.
}
2006-08-30 19:52:16 +00:00
$newupgrade = false ;
2006-09-20 22:36:21 +00:00
if ( is_readable ( $fullplug . '/db/upgrade.php' )) {
2006-08-30 20:13:46 +00:00
include_once ( $fullplug . '/db/upgrade.php' ); // defines new upgrading function
2006-08-30 19:52:16 +00:00
$newupgrade = true ;
}
2006-03-22 10:44:54 +00:00
if ( ! isset ( $plugin )) {
2004-08-19 09:37:42 +00:00
continue ;
}
2006-03-22 10:44:54 +00:00
if ( ! empty ( $plugin -> requires )) {
if ( $plugin -> requires > $CFG -> version ) {
2007-01-15 19:16:29 +00:00
$info = new object ();
2006-03-22 10:44:54 +00:00
$info -> pluginname = $plug ;
$info -> pluginversion = $plugin -> version ;
2004-08-19 09:37:42 +00:00
$info -> currentmoodle = $CFG -> version ;
2006-03-22 10:44:54 +00:00
$info -> requiremoodle = $plugin -> requires ;
2009-01-10 22:01:20 +00:00
print_upgrade_header ();
2006-08-01 07:46:19 +00:00
upgrade_log_start ();
2006-03-22 10:44:54 +00:00
notify ( get_string ( 'pluginrequirementsnotmet' , 'error' , $info ));
2006-08-01 07:46:19 +00:00
$updated_plugins = true ;
2004-08-19 09:37:42 +00:00
continue ;
}
}
2006-03-22 10:44:54 +00:00
$plugin -> name = $plug ; // The name MUST match the directory
2008-09-10 10:15:05 +00:00
$plugin -> fullname = $type . '_' . $plug ; // The name MUST match the directory
2004-08-19 09:37:42 +00:00
2008-09-10 10:15:05 +00:00
$installedversion = get_config ( $plugin -> fullname , 'version' );
2004-08-19 09:37:42 +00:00
2008-09-10 10:15:05 +00:00
if ( $installedversion === false ) {
set_config ( 'version' , 0 , $plugin -> fullname );
2004-08-19 09:37:42 +00:00
}
2006-09-20 21:00:45 +00:00
2008-09-10 10:15:05 +00:00
if ( $installedversion == $plugin -> version ) {
2004-08-19 09:37:42 +00:00
// do nothing
2008-09-10 10:15:05 +00:00
} else if ( $installedversion < $plugin -> version ) {
2009-01-10 22:01:20 +00:00
print_upgrade_header ();
2006-08-30 19:52:16 +00:00
$updated_plugins = true ;
2006-08-01 07:46:19 +00:00
upgrade_log_start ();
2007-07-25 07:08:07 +00:00
print_heading ( $dir . '/' . $plugin -> name . ' plugin needs upgrading' );
2008-01-07 01:54:28 +00:00
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
2008-05-15 21:40:00 +00:00
$DB -> set_debug ( true );
2008-01-07 01:54:28 +00:00
}
2006-08-30 19:52:16 +00:00
@ set_time_limit ( 0 ); // To allow slow databases to complete the long SQL
2008-09-10 10:15:05 +00:00
if ( $installedversion == 0 ) { // It's a new install of this plugin
2006-08-30 19:52:16 +00:00
/// Both old .sql files and new install.xml are supported
/// but we priorize install.xml (XMLDB) if present
2006-09-20 22:36:21 +00:00
if ( file_exists ( $fullplug . '/db/install.xml' )) {
2008-06-22 16:51:55 +00:00
$DB -> get_manager () -> install_from_xmldb_file ( $fullplug . '/db/install.xml' ); //New method
2006-04-16 16:50:55 +00:00
}
2008-06-22 16:51:55 +00:00
$status = true ;
2008-01-07 01:54:28 +00:00
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
2008-05-15 21:40:00 +00:00
$DB -> set_debug ( false );
2008-01-07 01:54:28 +00:00
}
2006-09-20 21:00:45 +00:00
/// Continue with the instalation, roles and other stuff
2006-08-30 19:52:16 +00:00
if ( $status ) {
2007-06-19 16:35:41 +00:00
/// OK so far, now update the plugins record
2008-09-10 10:15:05 +00:00
set_config ( 'version' , $plugin -> version , $plugin -> fullname );
2007-06-19 16:35:41 +00:00
/// Install capabilities
2006-12-11 15:47:23 +00:00
if ( ! update_capabilities ( $type . '/' . $plug )) {
2008-05-20 02:53:46 +00:00
print_error ( 'cannotsetupcapforplugin' , '' , '' , $plugin -> name );
2006-08-30 19:52:16 +00:00
}
2007-06-19 16:35:41 +00:00
/// Install events
2007-04-19 08:45:30 +00:00
events_update_definition ( $type . '/' . $plug );
2007-06-19 16:35:41 +00:00
2008-07-31 08:01:46 +00:00
/// Install message providers
message_update_providers ( $type . '/' . $plug );
2007-06-19 16:35:41 +00:00
/// Run local install function if there is one
2008-09-10 10:15:05 +00:00
if ( is_readable ( $fullplug . '/lib.php' )) {
include_once ( $fullplug . '/lib.php' );
2007-06-19 16:35:41 +00:00
$installfunction = $plugin -> name . '_install' ;
if ( function_exists ( $installfunction )) {
if ( ! $installfunction () ) {
notify ( 'Encountered a problem running install function for ' . $module -> name . '!' );
}
}
}
2007-07-27 13:38:06 +00:00
2006-08-30 19:52:16 +00:00
notify ( get_string ( 'modulesuccess' , '' , $plugin -> name ), 'notifysuccess' );
} else {
notify ( 'Installing ' . $plugin -> name . ' FAILED!' );
}
2006-04-16 16:50:55 +00:00
} else { // Upgrade existing install
2008-09-10 10:15:05 +00:00
/// Run the upgrade function for the plugin.
$newupgrade_function = 'xmldb_' . $plugin -> fullname . '_upgrade' ;
2006-08-30 19:52:16 +00:00
$newupgrade_status = true ;
2008-05-01 20:02:37 +00:00
if ( $newupgrade && function_exists ( $newupgrade_function )) {
2008-01-07 01:54:28 +00:00
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
2008-05-15 21:40:00 +00:00
$DB -> set_debug ( true );
2008-01-07 01:54:28 +00:00
}
2008-09-10 10:15:05 +00:00
$newupgrade_status = $newupgrade_function ( $installedversion );
2006-08-30 19:52:16 +00:00
} else if ( $newupgrade ) {
notify ( 'Upgrade function ' . $newupgrade_function . ' was not available in ' .
$fullplug . '/db/upgrade.php' );
}
2008-01-07 01:54:28 +00:00
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
2008-05-15 21:40:00 +00:00
$DB -> set_debug ( false );
2008-01-07 01:54:28 +00:00
}
2006-08-30 19:52:16 +00:00
/// Now analyze upgrade results
2008-05-01 20:02:37 +00:00
if ( $newupgrade_status ) { // No upgrading failed
2008-07-31 08:01:46 +00:00
/// OK so far, now update the plugins record
2008-09-10 10:15:05 +00:00
set_config ( 'version' , $plugin -> version , $plugin -> fullname );
2006-12-11 15:47:23 +00:00
if ( ! update_capabilities ( $type . '/' . $plug )) {
2008-05-20 02:53:46 +00:00
print_error ( 'cannotupdateplugincap' , '' , '' , $plugin -> name );
2006-04-16 16:50:55 +00:00
}
2008-07-31 08:01:46 +00:00
/// Update events
2007-04-19 08:45:30 +00:00
events_update_definition ( $type . '/' . $plug );
2008-07-31 08:01:46 +00:00
/// Update message providers
message_update_providers ( $type . '/' . $plug );
2006-08-30 19:52:16 +00:00
notify ( get_string ( 'modulesuccess' , '' , $plugin -> name ), 'notifysuccess' );
} else {
2008-09-10 10:15:05 +00:00
notify ( 'Upgrading ' . $plugin -> name . ' from ' . $installedversion . ' to ' . $plugin -> version . ' FAILED!' );
2004-08-19 09:37:42 +00:00
}
}
2008-01-07 01:54:28 +00:00
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
echo '<hr />' ;
}
2004-08-19 09:37:42 +00:00
} else {
2008-09-10 10:15:05 +00:00
print_error ( 'cannotdowngrade' , 'debug' , '' , ( object ) array ( 'oldversion' => $installedversion , 'newversion' => $plugin -> version ));
2004-08-19 09:37:42 +00:00
}
}
2009-01-10 22:01:20 +00:00
return $updated_plugins ;
2004-08-19 09:37:42 +00:00
}
2004-09-26 05:10:38 +00:00
/**
* Find and check all modules and load them up or upgrade them if necessary
*
* @ uses $CFG
* @ param string $return The url to prompt the user to continue to
* @ todo Finish documenting this function
2006-09-20 21:00:45 +00:00
*/
2009-01-10 22:01:20 +00:00
function upgrade_activity_modules () {
2004-08-19 09:37:42 +00:00
2008-09-17 14:31:30 +00:00
global $CFG , $interactive , $DB , $unittest ;
2004-08-19 09:37:42 +00:00
2004-09-26 05:10:38 +00:00
if ( ! $mods = get_list_of_plugins ( 'mod' ) ) {
2008-05-20 02:53:46 +00:00
print_error ( 'nomodules' , 'debug' );
2004-08-19 09:37:42 +00:00
}
2006-08-01 07:46:19 +00:00
$updated_modules = false ;
$strmodulesetup = get_string ( 'modulesetup' );
2004-08-19 09:37:42 +00:00
foreach ( $mods as $mod ) {
2004-09-26 05:10:38 +00:00
if ( $mod == 'NEWMODULE' ) { // Someone has unzipped the template, ignore it
2004-08-19 09:37:42 +00:00
continue ;
}
2004-09-26 05:10:38 +00:00
$fullmod = $CFG -> dirroot . '/mod/' . $mod ;
2004-08-19 09:37:42 +00:00
unset ( $module );
2004-09-26 05:10:38 +00:00
if ( is_readable ( $fullmod . '/version.php' )) {
include_once ( $fullmod . '/version.php' ); // defines $module with version etc
2004-08-19 09:37:42 +00:00
} else {
2004-09-26 05:10:38 +00:00
notify ( 'Module ' . $mod . ': ' . $fullmod . '/version.php was not readable' );
2004-08-19 09:37:42 +00:00
continue ;
}
2006-08-27 09:00:23 +00:00
$newupgrade = false ;
2006-09-20 22:36:21 +00:00
if ( is_readable ( $fullmod . '/db/upgrade.php' )) {
2006-08-30 20:13:46 +00:00
include_once ( $fullmod . '/db/upgrade.php' ); // defines new upgrading function
2006-08-27 09:00:23 +00:00
$newupgrade = true ;
2004-08-19 09:37:42 +00:00
}
if ( ! isset ( $module )) {
continue ;
}
if ( ! empty ( $module -> requires )) {
if ( $module -> requires > $CFG -> version ) {
2007-01-15 19:16:29 +00:00
$info = new object ();
2004-08-19 09:37:42 +00:00
$info -> modulename = $mod ;
$info -> moduleversion = $module -> version ;
$info -> currentmoodle = $CFG -> version ;
$info -> requiremoodle = $module -> requires ;
2009-01-10 22:01:20 +00:00
print_upgrade_header ();
2006-08-01 07:46:19 +00:00
upgrade_log_start ();
2004-08-19 09:37:42 +00:00
notify ( get_string ( 'modulerequirementsnotmet' , 'error' , $info ));
2006-08-01 07:46:19 +00:00
$updated_modules = true ;
2004-08-19 09:37:42 +00:00
continue ;
}
}
$module -> name = $mod ; // The name MUST match the directory
2006-09-20 21:00:45 +00:00
2007-06-18 03:59:47 +00:00
include_once ( $fullmod . '/lib.php' ); // defines upgrading and/or installing functions
2008-05-15 21:40:00 +00:00
if ( $currmodule = $DB -> get_record ( 'modules' , array ( 'name' => $module -> name ))) {
2004-08-19 09:37:42 +00:00
if ( $currmodule -> version == $module -> version ) {
// do nothing
} else if ( $currmodule -> version < $module -> version ) {
2006-08-27 09:00:23 +00:00
/// If versions say that we need to upgrade but no upgrade files are available, notify and continue
2008-05-01 20:02:37 +00:00
if ( ! $newupgrade ) {
notify ( 'Upgrade file ' . $mod . ': ' . $fullmod . '/db/upgrade.php is not readable' );
2006-08-27 09:00:23 +00:00
continue ;
}
2009-01-10 22:01:20 +00:00
print_upgrade_header ();
2006-08-01 07:46:19 +00:00
upgrade_log_start ();
2008-01-07 01:54:28 +00:00
2004-09-26 05:10:38 +00:00
print_heading ( $module -> name . ' module needs upgrading' );
2006-08-27 09:00:23 +00:00
/// Run de old and new upgrade functions for the module
$newupgrade_function = 'xmldb_' . $module -> name . '_upgrade' ;
/// Then, the new function if exists and the old one was ok
$newupgrade_status = true ;
2008-05-01 20:02:37 +00:00
if ( $newupgrade && function_exists ( $newupgrade_function )) {
2008-01-07 01:54:28 +00:00
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
2008-05-15 21:40:00 +00:00
$DB -> set_debug ( true );
2008-01-07 01:54:28 +00:00
}
2006-08-27 09:00:23 +00:00
$newupgrade_status = $newupgrade_function ( $currmodule -> version , $module );
2008-05-01 20:02:37 +00:00
} else if ( $newupgrade ) {
2006-08-27 09:00:23 +00:00
notify ( 'Upgrade function ' . $newupgrade_function . ' was not available in ' .
$mod . ': ' . $fullmod . '/db/upgrade.php' );
}
2008-01-07 01:54:28 +00:00
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
2008-05-15 21:40:00 +00:00
$DB -> set_debug ( false );
2008-01-07 01:54:28 +00:00
}
2006-08-27 09:00:23 +00:00
/// Now analyze upgrade results
2008-05-01 20:02:37 +00:00
if ( $newupgrade_status ) { // No upgrading failed
2006-08-27 09:00:23 +00:00
// OK so far, now update the modules record
$module -> id = $currmodule -> id ;
2008-05-15 21:40:00 +00:00
if ( ! $DB -> update_record ( 'modules' , $module )) {
2008-05-20 02:53:46 +00:00
print_error ( 'cannotupdatemod' , '' , '' , $module -> name );
2004-08-19 09:37:42 +00:00
}
2006-08-27 09:00:23 +00:00
remove_dir ( $CFG -> dataroot . '/cache' , true ); // flush cache
notify ( get_string ( 'modulesuccess' , '' , $module -> name ), 'notifysuccess' );
2008-01-07 01:54:28 +00:00
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
2008-08-16 12:16:01 +00:00
echo '<hr />' ;
2008-01-07 01:54:28 +00:00
}
2006-08-27 09:00:23 +00:00
} else {
notify ( 'Upgrading ' . $module -> name . ' from ' . $currmodule -> version . ' to ' . $module -> version . ' FAILED!' );
2004-08-19 09:37:42 +00:00
}
2006-08-08 05:13:06 +00:00
2006-08-27 09:00:23 +00:00
/// Update the capabilities table?
2006-08-08 05:13:06 +00:00
if ( ! update_capabilities ( 'mod/' . $module -> name )) {
2008-05-20 02:53:46 +00:00
print_error ( 'cannotupdatemodcap' , '' , '' , $module -> name );
2006-08-08 05:13:06 +00:00
}
2008-07-31 08:01:46 +00:00
/// Update events
2007-04-19 08:45:30 +00:00
events_update_definition ( 'mod/' . $module -> name );
2006-08-08 05:13:06 +00:00
2008-07-31 08:01:46 +00:00
/// Update message providers
message_update_providers ( 'mod/' . $module -> name );
2004-08-19 09:37:42 +00:00
$updated_modules = true ;
2006-09-20 21:00:45 +00:00
2004-08-19 09:37:42 +00:00
} else {
2008-08-16 12:16:01 +00:00
print_error ( 'cannotdowngrade' , 'debug' , '' , ( object ) array ( 'oldversion' => $currmodule -> version , 'newversion' => $module -> version ));
2004-08-19 09:37:42 +00:00
}
2006-09-20 21:00:45 +00:00
2004-08-19 09:37:42 +00:00
} else { // module not installed yet, so install it
2009-01-10 22:01:20 +00:00
print_upgrade_header ();
2006-08-01 07:46:19 +00:00
upgrade_log_start ();
2004-08-19 09:37:42 +00:00
print_heading ( $module -> name );
$updated_modules = true ;
2008-01-07 01:54:28 +00:00
// To avoid unnecessary output from the SQL queries in the CLI version
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
2008-05-15 21:40:00 +00:00
$DB -> set_debug ( true );
2008-01-07 01:54:28 +00:00
}
2004-08-19 09:37:42 +00:00
@ set_time_limit ( 0 ); // To allow slow databases to complete the long SQL
2006-08-27 09:00:23 +00:00
/// Both old .sql files and new install.xml are supported
/// but we priorize install.xml (XMLDB) if present
2006-09-20 22:36:21 +00:00
if ( file_exists ( $fullmod . '/db/install.xml' )) {
2008-06-22 16:51:55 +00:00
$DB -> get_manager () -> install_from_xmldb_file ( $fullmod . '/db/install.xml' ); //New method
$status = true ;
2006-08-27 09:00:23 +00:00
}
2008-01-07 01:54:28 +00:00
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
2008-05-15 21:40:00 +00:00
$DB -> set_debug ( false );
2008-01-07 01:54:28 +00:00
}
2007-06-18 03:59:47 +00:00
/// Continue with the installation, roles and other stuff
2006-08-27 09:00:23 +00:00
if ( $status ) {
2008-05-15 21:40:00 +00:00
if ( $module -> id = $DB -> insert_record ( 'modules' , $module )) {
2007-06-18 03:59:47 +00:00
2007-07-27 13:38:06 +00:00
/// Capabilities
2006-08-08 05:13:06 +00:00
if ( ! update_capabilities ( 'mod/' . $module -> name )) {
2008-05-20 02:53:46 +00:00
print_error ( 'cannotsetupcapformod' , '' , '' , $module -> name );
2006-08-08 05:13:06 +00:00
}
2007-07-27 13:38:06 +00:00
2007-06-18 03:59:47 +00:00
/// Events
2007-04-19 08:45:30 +00:00
events_update_definition ( 'mod/' . $module -> name );
2007-06-18 03:59:47 +00:00
2008-07-31 08:01:46 +00:00
/// Message providers
message_update_providers ( 'mod/' . $module -> name );
2007-06-18 03:59:47 +00:00
/// Run local install function if there is one
$installfunction = $module -> name . '_install' ;
if ( function_exists ( $installfunction )) {
if ( ! $installfunction () ) {
notify ( 'Encountered a problem running install function for ' . $module -> name . '!' );
}
}
2005-02-08 17:09:41 +00:00
notify ( get_string ( 'modulesuccess' , '' , $module -> name ), 'notifysuccess' );
2008-01-07 01:54:28 +00:00
if ( ! defined ( 'CLI_UPGRADE' ) || ! CLI_UPGRADE ) {
2008-08-16 12:16:01 +00:00
echo '<hr />' ;
2008-01-07 01:54:28 +00:00
}
2004-08-19 09:37:42 +00:00
} else {
2008-06-15 11:47:27 +00:00
print_error ( 'cannotaddmodule' , '' , '' , $module -> name );
2004-08-19 09:37:42 +00:00
}
2006-09-20 21:00:45 +00:00
} else {
2008-06-15 11:47:27 +00:00
print_error ( 'cannotsetuptable' , 'debug' , '' , $module -> name );
2004-08-19 09:37:42 +00:00
}
}
2005-07-15 17:28:45 +00:00
/// Check submodules of this module if necessary
$submoduleupgrade = $module -> name . '_upgrade_submodules' ;
if ( function_exists ( $submoduleupgrade )) {
$submoduleupgrade ();
}
/// Run any defaults or final code that is necessary for this module
2004-12-23 07:09:33 +00:00
if ( is_readable ( $fullmod . '/defaults.php' )) {
// Insert default values for any important configuration variables
2004-12-23 09:07:43 +00:00
unset ( $defaults );
2007-12-19 17:35:20 +00:00
include ( $fullmod . '/defaults.php' ); // include here means execute, not library include
2005-04-26 07:45:09 +00:00
if ( ! empty ( $defaults )) {
2008-08-22 06:38:54 +00:00
if ( ! empty ( $defaults [ '_use_config_plugins' ])) {
unset ( $defaults [ '_use_config_plugins' ]);
$localcfg = get_config ( $module -> name );
foreach ( $defaults as $name => $value ) {
if ( ! isset ( $localcfg -> $name )) {
set_config ( $name , $value , $module -> name );
}
}
} else {
foreach ( $defaults as $name => $value ) {
if ( ! isset ( $CFG -> $name )) {
set_config ( $name , $value );
}
2005-04-26 07:45:09 +00:00
}
2004-12-23 07:09:33 +00:00
}
}
}
2004-08-19 09:37:42 +00:00
}
2009-01-10 22:01:20 +00:00
return $updated_modules ;
2004-08-19 09:37:42 +00:00
}
2006-09-20 21:00:45 +00:00
/**
2008-02-16 18:33:50 +00:00
* Try to obtain or release the cron lock .
2005-12-13 03:44:08 +00:00
*
2008-02-16 18:33:50 +00:00
* @ param string $name name of lock
* @ param int $until timestamp when this lock considered stale , null means remove lock unconditionaly
* @ param bool $ignorecurrent ignore current lock state , usually entend previous lock
* @ 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 ) {
// 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 ()) {
//lock active
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
2006-06-18 10:09:58 +00:00
function print_progress ( $done , $total , $updatetime = 5 , $sleeptime = 1 , $donetext = '' ) {
2008-05-23 05:29:51 +00:00
static $thisbarid ;
2006-01-27 02:54:51 +00:00
static $starttime ;
static $lasttime ;
2006-09-30 13:52:15 +00:00
if ( $total < 2 ) { // No need to show anything
return ;
}
2008-05-23 05:29:51 +00:00
// Are we done?
if ( $done >= $total ) {
$done = $total ;
if ( ! empty ( $thisbarid )) {
$donetext .= ' (' . $done . '/' . $total . ') ' . get_string ( 'success' );
print_progress_redraw ( $thisbarid , $done , $total , 500 , $donetext );
$thisbarid = $starttime = $lasttime = NULL ;
}
return ;
}
2006-01-27 02:54:51 +00:00
if ( empty ( $starttime )) {
$starttime = $lasttime = time ();
$lasttime = $starttime - $updatetime ;
2008-05-23 05:29:51 +00:00
$thisbarid = uniqid ();
2006-01-27 02:54:51 +00:00
echo '<table width="500" cellpadding="0" cellspacing="0" align="center"><tr><td width="500">' ;
2008-05-23 05:29:51 +00:00
echo '<div id="bar' . $thisbarid . '" style="border-style:solid;border-width:1px;width:500px;height:50px;">' ;
echo '<div id="slider' . $thisbarid . '" style="border-style:solid;border-width:1px;height:48px;width:10px;background-color:green;"></div>' ;
2006-01-27 02:54:51 +00:00
echo '</div>' ;
2008-05-23 05:29:51 +00:00
echo '<div id="text' . $thisbarid . '" align="center" style="width:500px;"></div>' ;
2006-01-27 02:54:51 +00:00
echo '</td></tr></table>' ;
echo '</div>' ;
}
$now = time ();
if ( $done && (( $now - $lasttime ) >= $updatetime )) {
$elapsedtime = $now - $starttime ;
$projectedtime = ( int )((( float ) $total / ( float ) $done ) * $elapsedtime ) - $elapsedtime ;
2007-08-10 15:00:35 +00:00
$percentage = round (( float ) $done / ( float ) $total , 2 );
2006-01-27 02:54:51 +00:00
$width = ( int )( 500 * $percentage );
2006-06-18 10:09:58 +00:00
if ( $projectedtime > 10 ) {
$projectedtext = ' Ending: ' . format_time ( $projectedtime );
} else {
$projectedtext = '' ;
}
2008-05-23 05:29:51 +00:00
$donetext .= ' (' . $done . '/' . $total . ') ' . $projectedtext ;
print_progress_redraw ( $thisbarid , $done , $total , $width , $donetext );
2006-01-27 02:54:51 +00:00
$lasttime = $now ;
}
}
2006-08-01 07:46:19 +00:00
2008-05-23 05:29:51 +00:00
// Don't call this function directly, it's called from print_progress.
function print_progress_redraw ( $thisbarid , $done , $total , $width , $donetext = '' ) {
if ( empty ( $thisbarid )) {
return ;
}
echo '<script>' ;
2008-06-09 16:53:30 +00:00
echo 'document.getElementById("text' . $thisbarid . '").innerHTML = "' . addslashes_js ( $donetext ) . '";' . " \n " ;
2008-05-23 05:29:51 +00:00
echo 'document.getElementById("slider' . $thisbarid . '").style.width = \'' . $width . 'px\';' . " \n " ;
echo '</script>' ;
}
2007-01-22 20:15:12 +00:00
function upgrade_get_javascript () {
2009-01-10 22:13:12 +00:00
global $CFG ;
2007-01-22 20:15:12 +00:00
2009-01-10 22:13:12 +00:00
return '<script type="text/javascript" src="' . $CFG -> wwwroot . '/lib/scroll_to_errors.js"></script>' ;
2007-01-22 20:15:12 +00:00
}
2007-01-25 00:04:02 +00:00
2008-01-07 01:54:28 +00:00
function create_admin_user ( $user_input = NULL ) {
2009-01-11 11:19:52 +00:00
global $CFG , $DB ;
2007-01-25 00:04:02 +00:00
2009-01-11 11:19:52 +00:00
$user = new object ();
$user -> auth = 'manual' ;
$user -> firstname = get_string ( 'admin' );
$user -> lastname = get_string ( 'user' );
$user -> username = 'admin' ;
$user -> password = hash_internal_user_password ( 'admin' );
$user -> email = 'root@localhost' ;
$user -> confirmed = 1 ;
$user -> mnethostid = $CFG -> mnet_localhost_id ;
$user -> lang = $CFG -> lang ;
$user -> maildisplay = 1 ;
$user -> timemodified = time ();
2007-01-25 00:04:02 +00:00
2009-01-11 11:19:52 +00:00
if ( $user_input ) { // do we want to override any defaults?
foreach ( $user_input as $key => $value ) {
$user -> $key = $value ;
}
}
$user -> id = $DB -> insert_record ( 'user' , $user );
2008-08-16 12:16:01 +00:00
2009-01-11 11:19:52 +00:00
if ( ! $user = $DB -> get_record ( 'user' , array ( 'id' => $user -> id ))) { // Double check.
print_error ( 'invaliduserid' );
}
2007-01-25 00:04:02 +00:00
2009-01-11 11:19:52 +00:00
// Assign the default admin roles to the new user.
if ( ! $adminroles = get_roles_with_capability ( 'moodle/legacy:admin' , CAP_ALLOW )) {
print_error ( 'noadminrole' , 'message' );
}
2007-01-25 00:04:02 +00:00
2009-01-11 11:19:52 +00:00
$systemcontext = get_context_instance ( CONTEXT_SYSTEM );
foreach ( $adminroles as $adminrole ) {
role_assign ( $adminrole -> id , $user -> id , 0 , $systemcontext -> id );
}
2007-01-25 00:04:02 +00:00
2009-01-11 11:19:52 +00:00
//set default message preferences
if ( ! message_set_default_message_preferences ( $user )){
print_error ( 'cannotsavemessageprefs' , 'message' );
2007-01-25 00:04:02 +00:00
}
2009-01-11 11:19:52 +00:00
$user = get_complete_user_data ( 'username' , 'admin' );
// indicate that this site is fully configured
set_config ( 'rolesactive' , 1 );
return $user ;
2007-01-25 00:04:02 +00:00
}
2006-08-01 07:46:19 +00:00
////////////////////////////////////////////////
/// upgrade logging functions
////////////////////////////////////////////////
/**
2008-08-16 12:16:01 +00:00
* Marks start of upgrade , blocks any other access to site .
* The upgrade is finished at the end of script or after timeout .
2006-08-01 07:46:19 +00:00
*/
2009-01-11 10:18:53 +00:00
function upgrade_log_start () {
2008-09-17 14:31:30 +00:00
global $CFG , $DB ;
2008-06-20 09:11:08 +00:00
2008-08-16 12:16:01 +00:00
static $started = false ;
if ( $started ) {
upgrade_set_timeout ( 120 );
} else {
ignore_user_abort ( true );
register_shutdown_function ( 'upgrade_finished_handler' );
2009-01-11 10:18:53 +00:00
set_config ( 'upgraderunning' , time () + 300 );
2008-08-16 12:16:01 +00:00
$started = true ;
2006-08-01 07:46:19 +00:00
}
}
2008-08-16 12:16:01 +00:00
/**
2009-01-11 10:18:53 +00:00
* Internal function - executed if upgrade interruped .
2008-08-16 12:16:01 +00:00
*/
function upgrade_finished_handler () {
upgrade_log_finish ();
2006-08-01 07:46:19 +00:00
}
/**
2009-01-11 10:18:53 +00:00
* Indicates upgrade is finished .
2006-08-01 07:46:19 +00:00
*
* This function may be called repeatedly .
*/
function upgrade_log_finish () {
2009-01-11 10:18:53 +00:00
unset_config ( 'upgraderunning' );
ignore_user_abort ( false );
2006-08-01 07:46:19 +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 ;
if ( ini_get_bool ( 'register_globals' )) {
$SESSION -> admin_critical_warning = 1 ;
} else if ( is_dataroot_insecure ( true ) === INSECURE_DATAROOT_ERROR ) {
$SESSION -> admin_critical_warning = 1 ;
}
}
return $SESSION -> admin_critical_warning ;
}
2006-08-28 20:11:24 +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 .
*
* Protection from httpd . conf and . htaccess is not detected properly .
2008-08-21 15:29:42 +00:00
* @ param bool $fetchtest try to test public access by fetching file
* @ 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 )) {
// hmm, strange
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 " ) {
$incoming = true ;
}
}
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
/// =============================================================================================================
/// administration tree classes and functions
// n.b. documentation is still in progress for this code
/// INTRODUCTION
/// This file performs the following tasks:
/// -it defines the necessary objects and interfaces to build the Moodle
/// admin hierarchy
2006-09-20 21:00:45 +00:00
/// -it defines the admin_externalpage_setup(), admin_externalpage_print_header(),
2006-09-02 13:14:57 +00:00
/// and admin_externalpage_print_footer() functions used on admin pages
/// ADMIN_SETTING OBJECTS
2006-09-20 21:00:45 +00:00
/// Moodle settings are represented by objects that inherit from the admin_setting
2006-09-02 13:14:57 +00:00
/// 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:
2006-09-20 21:00:45 +00:00
/// $ADMIN->add('userinterface', new admin_externalpage('foo', get_string('foo'),
2006-09-02 13:14:57 +00:00
/// $CFG->wwwdir . '/' . '$CFG->admin . '/foo.php', 'some_role_permission'));
/// Next, in foo.php, your file structure would resemble the following:
/// require_once('.../config.php');
/// require_once($CFG->libdir.'/adminlib.php');
2007-04-30 17:08:34 +00:00
/// admin_externalpage_setup('foo');
2006-09-02 13:14:57 +00:00
/// // functionality like processing form submissions goes here
2007-04-30 17:08:34 +00:00
/// admin_externalpage_print_header();
2006-09-02 13:14:57 +00:00
/// // your HTML goes here
2007-04-30 17:08:34 +00:00
/// admin_externalpage_print_footer();
2006-09-02 13:14:57 +00:00
/// 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.
/// The admin_externalpage_print_header() function prints the header (it figures
/// out what category and subcategories the page is classified under) and ensures
/// that you're using the admin pagelib (which provides the admin tree block and
/// the admin bookmarks block).
/// The admin_externalpage_print_footer() function properly closes the tables
/// opened up by the admin_externalpage_print_header() function and prints the
/// standard Moodle footer.
/// 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
2007-12-19 17:35:20 +00:00
/// used to find a specific node in the admin tree and find parent path.
2006-09-02 13:14:57 +00:00
/// 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.
/// 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 .
*
* @ author Vincenzo K . Marcovecchio
* @ package admin
*/
class part_of_admin_tree {
/**
* 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 .
*/
2006-09-20 21:00:45 +00:00
function & locate ( $name ) {
trigger_error ( 'Admin class does not implement method <strong>locate()</strong>' , E_USER_WARNING );
return ;
2006-09-02 13:14:57 +00:00
}
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
*/
function prune ( $name ) {
2006-09-20 21:00:45 +00:00
trigger_error ( 'Admin class does not implement method <strong>prune()</strong>' , E_USER_WARNING );
2006-09-02 19:30:54 +00:00
return ;
2006-09-20 21:00:45 +00:00
}
2006-09-02 19:30:54 +00:00
2007-12-19 17:35:20 +00:00
/**
* Search using query
* @ param strin query
* @ return mixed array - object structure of found settings and pages
*/
function search ( $query ) {
trigger_error ( 'Admin class does not implement method <strong>search()</strong>' , E_USER_WARNING );
return ;
}
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 .
*/
2006-09-20 21:00:45 +00:00
function check_access () {
trigger_error ( 'Admin class does not implement method <strong>check_access()</strong>' , E_USER_WARNING );
return ;
2006-09-02 13:14:57 +00:00
}
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
*/
function is_hidden () {
trigger_error ( 'Admin class does not implement method <strong>is_hidden()</strong>' , E_USER_WARNING );
return ;
}
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 .
*
* @ author Vincenzo K . Marcovecchio
* @ package admin
*/
class parentable_part_of_admin_tree extends part_of_admin_tree {
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +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 .
*/
2007-12-19 17:35:20 +00:00
function add ( $destinationname , $something ) {
2006-09-20 21:00:45 +00:00
trigger_error ( 'Admin class does not implement method <strong>add()</strong>' , E_USER_WARNING );
return ;
2006-09-02 13:14:57 +00:00
}
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 .
*
* @ author Vincenzo K . Marcovecchio
* @ package admin
*/
class admin_category extends parentable_part_of_admin_tree {
/**
* @ var mixed An array of part_of_admin_tree objects that are this object ' s children
*/
var $children ;
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
/**
* @ var string An internal name for this category . Must be unique amongst ALL part_of_admin_tree objects
*/
var $name ;
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
/**
* @ var string The displayed name for this category . Usually obtained through get_string ()
*/
var $visiblename ;
2006-09-20 21:00:45 +00:00
2006-09-24 20:23:40 +00:00
/**
* @ var bool Should this category be hidden in admin tree block ?
*/
var $hidden ;
2007-12-19 17:35:20 +00:00
/**
* paths
*/
var $path ;
var $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 ()
2006-09-24 20:23:40 +00:00
* @ param bool $hidden hide category in admin tree block
2006-09-02 13:14:57 +00:00
*/
2007-12-19 17:35:20 +00:00
function admin_category ( $name , $visiblename , $hidden = false ) {
$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
* @ return mixed A reference to the object with internal name $name if found , otherwise a reference to NULL .
2006-09-02 13:14:57 +00:00
*/
2007-12-19 17:35:20 +00:00
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 ) {
if ( $return =& $this -> children [ $childid ] -> locate ( $name , $findpath )) {
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
* @ param strin query
* @ return mixed array - object structure of found settings and pages
2006-09-02 13:14:57 +00:00
*/
2007-12-19 17:35:20 +00:00
function search ( $query ) {
$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
*/
function prune ( $name ) {
if ( $this -> name == $name ) {
return false ; //can not remove itself
}
foreach ( $this -> children as $precedence => $child ) {
if ( $child -> name == $name ) {
// 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
*/
2007-12-19 17:35:20 +00:00
function add ( $parentname , $something ) {
$parent =& $this -> locate ( $parentname );
if ( is_null ( $parent )) {
debugging ( 'parent does not exist!' );
2006-09-02 13:14:57 +00:00
return false ;
}
2007-12-19 17:35:20 +00:00
if ( is_a ( $something , 'part_of_admin_tree' )) {
if ( ! is_a ( $parent , 'parentable_part_of_admin_tree' )) {
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 .
*/
function check_access () {
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
*/
function is_hidden () {
return $this -> hidden ;
}
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
class admin_root extends admin_category {
/**
* list of errors
*/
var $errors ;
/**
* search query
*/
var $search ;
/**
* full tree flag - true means all settings required , false onlypages required
*/
var $fulltree ;
function admin_root () {
parent :: admin_category ( 'root' , get_string ( 'administration' ), false );
$this -> errors = array ();
$this -> search = '' ;
$this -> fulltree = true ;
}
}
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 )
*
* @ author Vincenzo K . Marcovecchio
* @ package admin
*/
class admin_externalpage extends part_of_admin_tree {
2006-09-20 21:00:45 +00:00
/**
2006-09-02 13:14:57 +00:00
* @ var string An internal name for this external page . Must be unique amongst ALL part_of_admin_tree objects
*/
var $name ;
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
/**
* @ var string The displayed name for this external page . Usually obtained through get_string () .
*/
var $visiblename ;
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
/**
* @ var string The external URL that we should link to when someone requests this external page .
*/
var $url ;
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
/**
* @ var string The role capability / permission a user must have to access this external page .
*/
2006-09-21 08:18:14 +00:00
var $req_capability ;
2006-09-20 21:00:45 +00:00
2007-01-29 21:29:27 +00:00
/**
* @ var object The context in which capability / permission should be checked , default is site context .
*/
var $context ;
2006-09-24 20:23:40 +00:00
/**
* @ var bool hidden in admin tree block .
*/
var $hidden ;
2007-12-19 17:35:20 +00:00
/**
* visible path
*/
var $path ;
var $visiblepath ;
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
*/
2007-12-19 17:35:20 +00:00
function admin_externalpage ( $name , $visiblename , $url , $req_capability = 'moodle/site:config' , $hidden = false , $context = NULL ) {
$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 .
* @ return mixed A reference to the object with internal name $name if found , otherwise a reference to NULL .
*/
2007-12-19 17:35:20 +00:00
function & locate ( $name , $findpath = false ) {
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
function prune ( $name ) {
return false ;
}
2007-12-19 17:35:20 +00:00
/**
* Search using query
* @ param strin query
* @ return mixed array - object structure of found settings and pages
*/
function search ( $query ) {
$textlib = textlib_get_instance ();
$found = false ;
if ( strpos ( strtolower ( $this -> name ), $query ) !== false ) {
$found = true ;
} else if ( strpos ( $textlib -> strtolower ( $this -> visiblename ), $query ) !== false ) {
$found = true ;
}
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 .
2006-09-02 13:14:57 +00:00
* @ return bool True if user has access , false otherwise .
*/
function check_access () {
2009-01-11 09:41:48 +00:00
global $CFG ;
if ( empty ( $CFG -> rolesactive )) {
2006-09-02 13:14:57 +00:00
return true ; // no access check before site is fully set up
}
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 ) {
2008-12-12 10:50:25 +00:00
if ( is_valid_capability ( $cap ) and 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
*/
function is_hidden () {
return $this -> hidden ;
}
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 .
*
* @ author Vincenzo K . Marcovecchio
* @ package admin
*/
class admin_settingpage extends part_of_admin_tree {
2006-09-20 21:00:45 +00:00
/**
2006-09-02 13:14:57 +00:00
* @ var string An internal name for this external page . Must be unique amongst ALL part_of_admin_tree objects
*/
var $name ;
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
/**
* @ var string The displayed name for this external page . Usually obtained through get_string () .
*/
var $visiblename ;
/**
* @ var mixed An array of admin_setting objects that are part of this setting page .
*/
var $settings ;
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
/**
* @ var string The role capability / permission a user must have to access this external page .
*/
2006-09-21 08:18:14 +00:00
var $req_capability ;
2006-09-20 21:00:45 +00:00
2007-01-29 21:29:27 +00:00
/**
* @ var object The context in which capability / permission should be checked , default is site context .
*/
var $context ;
2006-09-24 20:23:40 +00:00
/**
* @ var bool hidden in admin tree block .
*/
var $hidden ;
2007-12-19 17:35:20 +00:00
/**
* paths
*/
var $path ;
var $visiblepath ;
// see admin_externalpage
function admin_settingpage ( $name , $visiblename , $req_capability = 'moodle/site:config' , $hidden = false , $context = NULL ) {
$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
2006-09-02 13:14:57 +00:00
// see admin_category
2007-12-19 17:35:20 +00:00
function & locate ( $name , $findpath = false ) {
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
2007-12-19 17:35:20 +00:00
function search ( $query ) {
$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 ) {
$found = true ;
}
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
2007-12-19 17:35:20 +00:00
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
/**
* 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
* @ param object $setting is the admin_setting object you want to add
* @ return true if successful , false if not
*/
function add ( $setting ) {
if ( ! is_a ( $setting , 'admin_setting' )) {
debugging ( 'error - not a setting instance' );
return false ;
}
$this -> settings -> { $setting -> name } = $setting ;
return true ;
}
2006-09-02 13:14:57 +00:00
// see admin_externalpage
function check_access () {
2009-01-11 09:41:48 +00:00
global $CFG ;
if ( empty ( $CFG -> rolesactive )) {
2006-09-02 13:14:57 +00:00
return true ; // no access check before site is fully set up
}
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 ) {
2008-12-12 10:50:25 +00:00
if ( is_valid_capability ( $cap ) and 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 )
* returns a string of the html
*/
2006-09-02 13:14:57 +00:00
function output_html () {
2007-12-19 17:35:20 +00:00
$adminroot =& admin_get_root ();
$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 ();
2008-08-16 12:16:01 +00:00
// do not use defaults if settings not available - upgrdesettings 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
*/
function is_hidden () {
return $this -> hidden ;
}
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 .
*/
2006-09-02 13:14:57 +00:00
class admin_setting {
var $name ;
var $visiblename ;
var $description ;
var $defaultsetting ;
2007-12-19 17:35:20 +00:00
var $updatedcallback ;
var $plugin ; // null means main config table
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 .
* @ 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
*/
2006-09-02 13:14:57 +00:00
function admin_setting ( $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 ;
$this -> description = $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
/**
* 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 );
if ( ! preg_match ( '/^[a-zA-Z0-9_]+$/' , $this -> plugin )) {
throw new moodle_exception ( 'invalidadminsettingname' , '' , '' , $name );
}
}
}
2007-12-19 17:35:20 +00:00
function get_full_name () {
return 's_' . $this -> plugin . '_' . $this -> name ;
}
function get_id () {
return 'id_s_' . $this -> plugin . '_' . $this -> name ;
}
function config_read ( $name ) {
global $CFG ;
if ( $this -> plugin === 'backup' ) {
require_once ( $CFG -> dirroot . '/backup/lib.php' );
$backupconfig = backup_get_config ();
if ( isset ( $backupconfig -> $name )) {
return $backupconfig -> $name ;
} else {
return NULL ;
}
} else if ( ! empty ( $this -> plugin )) {
$value = get_config ( $this -> plugin , $name );
return $value === false ? NULL : $value ;
} else {
if ( isset ( $CFG -> $name )) {
return $CFG -> $name ;
} else {
return NULL ;
}
}
}
function config_write ( $name , $value ) {
global $CFG ;
if ( $this -> plugin === 'backup' ) {
require_once ( $CFG -> dirroot . '/backup/lib.php' );
return ( boolean ) backup_set_config ( $name , $value );
} else {
return ( boolean ) set_config ( $name , $value , $this -> plugin );
}
}
/**
* Returns current value of this setting
* @ return mixed array or string depending on instance , NULL means not set yet
*/
2006-09-02 13:14:57 +00:00
function get_setting () {
2007-12-19 17:35:20 +00:00
// has to be overridden
return NULL ;
2006-09-02 13:14:57 +00:00
}
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
*/
2007-10-02 21:38:53 +00:00
function get_defaultsetting () {
return $this -> defaultsetting ;
}
2007-12-19 17:35:20 +00:00
/**
* Store new setting
* @ param mixed string or array , must not be NULL
* @ return '' if ok , string error message otherwise
*/
2006-09-02 13:14:57 +00:00
function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
// should be overridden
return '' ;
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 part of form with setting
* @ param mixed data array or string depending on setting
* @ return string
*/
2008-01-01 15:51:54 +00:00
function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
// should be overridden
return ;
}
/**
* function called if setting updated - cleanup , cache reset , etc .
*/
function set_updatedcallback ( $functionname ) {
$this -> updatedcallback = $functionname ;
}
/**
* Is setting related to query text - used when searching
* @ param string $query
* @ return bool
*/
function is_related ( $query ) {
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 .
*/
class admin_setting_heading extends admin_setting {
/**
* not a setting , just text
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 $heading heading
* @ param string $information text in box
*/
function admin_setting_heading ( $name , $heading , $information ) {
parent :: admin_setting ( $name , $heading , $information , '' );
}
function get_setting () {
return true ;
}
function get_defaultsetting () {
return true ;
}
function write_setting ( $data ) {
// do not write any setting
return '' ;
}
2008-01-01 15:51:54 +00:00
function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$return = '' ;
if ( $this -> visiblename != '' ) {
2008-01-01 15:51:54 +00:00
$return .= print_heading ( '<a name="' . $this -> name . '">' . highlightfast ( $query , $this -> visiblename ) . '</a>' , '' , 3 , 'main' , true );
2007-12-19 17:35:20 +00:00
}
if ( $this -> description != '' ) {
2008-01-01 15:51:54 +00:00
$return .= print_box ( highlight ( $query , $this -> description ), 'generalbox formsettingheading' , '' , true );
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
*/
2006-09-02 13:14:57 +00:00
class admin_setting_configtext extends admin_setting {
var $paramtype ;
2008-02-05 11:45:05 +00:00
var $size ;
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +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
*/
2008-02-05 11:45:05 +00:00
function admin_setting_configtext ( $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 ;
}
2006-09-02 13:14:57 +00:00
parent :: admin_setting ( $name , $visiblename , $description , $defaultsetting );
}
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
2006-09-02 13:14:57 +00:00
function write_setting ( $data ) {
2007-12-30 22:30:46 +00:00
if ( $this -> paramtype === PARAM_INT and $data === '' ) {
// do not complain if '' used instead of 0
$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
*/
2006-09-11 05:06:38 +00:00
function validate ( $data ) {
2006-09-26 08:16:17 +00:00
if ( is_string ( $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 ) {
return true ;
2007-12-30 17:59:17 +00:00
2006-09-26 08:16:17 +00:00
} else {
2008-06-09 16:53:30 +00:00
$cleaned = clean_param ( $data , $this -> paramtype );
2007-12-30 17:59:17 +00:00
if ( " $data " == " $cleaned " ) { // implicit conversion to string is needed to do exact comparison
return true ;
} else {
return get_string ( 'validateerror' , 'admin' );
}
2006-09-26 08:16:17 +00:00
}
2006-09-11 05:06:38 +00:00
}
2008-01-01 15:51:54 +00:00
function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
$default = $this -> get_defaultsetting ();
return format_admin_setting ( $this , $this -> visiblename ,
2008-02-05 11:45:05 +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>' ,
2008-01-01 15:51:54 +00:00
$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 .
*/
class admin_setting_configtextarea extends admin_setting_configtext {
var $rows ;
var $cols ;
2007-04-26 07:08:12 +00:00
2007-12-19 18:42:44 +00:00
function admin_setting_configtextarea ( $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 ;
2007-04-26 07:08:12 +00:00
parent :: admin_setting_configtext ( $name , $visiblename , $description , $defaultsetting , $paramtype );
}
2008-01-01 15:51:54 +00:00
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 ,
2008-06-11 08:37:26 +00:00
'<div class="form-textarea form-textarea-advanced" ><textarea rows="' . $this -> rows . '" cols="' . $this -> cols . '" id="' . $this -> get_id () . '" name="' . $this -> get_full_name () . '">' . s ( $data ) . '</textarea></div>' ,
2008-01-01 15:51:54 +00:00
$this -> description , true , '' , $defaultinfo , $query );
2007-12-19 17:35:20 +00:00
}
}
/**
* Password field , allows unmasking of password
*/
class admin_setting_configpasswordunmask extends admin_setting_configtext {
/**
* 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 default password
*/
function admin_setting_configpasswordunmask ( $name , $visiblename , $description , $defaultsetting ) {
2008-02-05 11:45:05 +00:00
parent :: admin_setting_configtext ( $name , $visiblename , $description , $defaultsetting , PARAM_RAW , 30 );
2007-12-19 17:35:20 +00:00
}
2008-01-01 15:51:54 +00:00
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 ,
2008-08-26 06:41:37 +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>' ,
2008-01-01 15:51:54 +00:00
$this -> description , true , '' , NULL , $query );
2007-12-19 17:35:20 +00:00
}
}
/**
2008-01-01 22:25:11 +00:00
* Path to directory
2007-12-19 17:35:20 +00:00
*/
2008-01-01 22:25:11 +00:00
class admin_setting_configfile extends admin_setting_configtext {
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
2008-01-01 22:25:11 +00:00
* @ param string $defaultdirectory default directory location
2007-12-19 17:35:20 +00:00
*/
2008-01-01 22:25:11 +00:00
function admin_setting_configfile ( $name , $visiblename , $description , $defaultdirectory ) {
2008-02-05 11:45:05 +00:00
parent :: admin_setting_configtext ( $name , $visiblename , $description , $defaultdirectory , PARAM_RAW , 50 );
2007-12-19 17:35:20 +00:00
}
2008-01-01 15:51:54 +00:00
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 ,
2008-02-05 11:45:05 +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>' ,
2008-01-01 15:51:54 +00:00
$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
2007-12-19 17:35:20 +00:00
*/
2008-01-01 22:25:11 +00:00
class admin_setting_configexecutable extends admin_setting_configfile {
function output_html ( $data , $query = '' ) {
$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 ,
2008-02-05 11:45:05 +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>' ,
2008-01-01 22:25:11 +00:00
$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
*/
class admin_setting_configdirectory extends admin_setting_configfile {
2008-01-01 15:51:54 +00:00
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 ,
2008-02-05 11:45:05 +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>' ,
2008-01-01 15:51:54 +00:00
$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
*/
2006-09-02 13:14:57 +00:00
class admin_setting_configcheckbox extends admin_setting {
2007-12-19 17:35:20 +00:00
var $yes ;
var $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
*/
function admin_setting_configcheckbox ( $name , $visiblename , $description , $defaultsetting , $yes = '1' , $no = '0' ) {
2006-09-02 13:14:57 +00:00
parent :: admin_setting ( $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
}
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
2006-09-02 13:14:57 +00:00
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
}
2008-01-01 15:51:54 +00:00
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 ,
2008-01-01 15:51:54 +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
*/
class admin_setting_configmulticheckbox extends admin_setting {
2006-09-02 13:14:57 +00:00
var $choices ;
2006-09-20 21:00:45 +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 array $defaultsetting array of selected
* @ param array $choices array of $value => $label for each checkbox
*/
function admin_setting_configmulticheckbox ( $name , $visiblename , $description , $defaultsetting , $choices ) {
2006-09-02 13:14:57 +00:00
$this -> choices = $choices ;
parent :: admin_setting ( $name , $visiblename , $description , $defaultsetting );
}
2007-10-28 17:15:00 +00:00
/**
* This function may be used in ancestors for lazy loading of choices
2007-12-19 17:35:20 +00:00
* @ return true if loaded , false if error
2007-10-28 17:15:00 +00:00
*/
function load_choices () {
/*
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
* @ param string $query
* @ return bool
*/
function is_related ( $query ) {
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
}
2006-09-02 13:14:57 +00:00
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
2006-09-02 13:14:57 +00:00
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
}
2006-09-20 21:00:45 +00:00
2008-01-01 15:51:54 +00:00
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 . ' />'
2008-01-01 15:51:54 +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 )) {
$defaultinfo = implode ( ', ' , $defaults );
2006-09-17 12:11:23 +00:00
} else {
2008-01-01 15:51:54 +00:00
$defaultinfo = get_string ( 'none' );
2006-09-17 12:11:23 +00:00
}
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
*/
class admin_setting_configmulticheckbox2 extends admin_setting_configmulticheckbox {
function get_setting () {
$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
2007-12-19 17:35:20 +00:00
function write_setting ( $data ) {
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
*/
class admin_setting_configselect extends admin_setting {
2006-09-02 13:14:57 +00:00
var $choices ;
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
*/
function admin_setting_configselect ( $name , $visiblename , $description , $defaultsetting , $choices ) {
$this -> choices = $choices ;
parent :: admin_setting ( $name , $visiblename , $description , $defaultsetting );
}
/**
* This function may be used in ancestors for lazy loading of choices
* @ return true if loaded , false if error
*/
function load_choices () {
/*
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
}
2007-12-31 15:55:36 +00:00
function is_related ( $query ) {
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 ;
}
2006-09-02 13:14:57 +00:00
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
2006-09-02 13:14:57 +00:00
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
/**
* Ensure the options are loaded , and generate the HTML for the select
* 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 .
*/
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 )) {
2008-08-26 01:05:01 +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
} else if ( ! array_key_exists ( $current , $this -> choices )) {
$warning = get_string ( 'warningcurrentsetting' , 'admin' , s ( $current ));
2008-08-26 01:05:01 +00:00
if ( ! is_null ( $default ) and $data == $current ) {
2007-12-19 22:32:43 +00:00
$data = $default ; // use default instead of first value when showing the form
}
}
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 ) {
2007-12-19 17:35:20 +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 );
}
function output_html ( $data , $query = '' ) {
$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
*/
2006-09-02 13:14:57 +00:00
class admin_setting_configmultiselect extends admin_setting_configselect {
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 array $defaultsetting array of selected items
* @ param array $choices array of $value => $label for each list item
*/
2006-09-02 13:14:57 +00:00
function admin_setting_configmultiselect ( $name , $visiblename , $description , $defaultsetting , $choices ) {
parent :: admin_setting_configselect ( $name , $visiblename , $description , $defaultsetting , $choices );
}
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
2006-09-02 13:14:57 +00:00
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
* @ param string $query
* @ return bool
*/
function is_related ( $query ) {
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 ;
}
2008-01-01 15:51:54 +00:00
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
* this is a liiitle bit messy . we 're using two selects, but we' re returning
* them as an array named after $name ( so we only use $name2 internally for the setting )
*/
class admin_setting_configtime extends admin_setting {
var $name2 ;
/**
* 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
*/
function admin_setting_configtime ( $hoursname , $minutesname , $visiblename , $description , $defaultsetting ) {
$this -> name2 = $minutesname ;
parent :: admin_setting ( $hoursname , $visiblename , $description , $defaultsetting );
}
function get_setting () {
$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 );
}
function write_setting ( $data ) {
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' ));
}
2008-01-01 15:51:54 +00:00
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">' .
2007-12-19 17:35:20 +00:00
'<select id="' . $this -> get_id () . 'h" name="' . $this -> get_full_name () . '[h]">' ;
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
}
}
2008-07-16 02:16:42 +00:00
class admin_setting_configiplist extends admin_setting_configtextarea {
function validate ( $data ) {
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 ) ||
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 )) {
$result = true ;
} else {
$result = false ;
break ;
}
}
if ( $result ){
return true ;
} else {
return get_string ( 'validateerror' , 'admin' );
}
}
}
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 .
*/
class admin_setting_users_with_capability extends admin_setting_configmultiselect {
protected $capability ;
/**
* 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 .
*/
function __construct ( $name , $visiblename , $description , $defaultsetting , $capability ) {
$users = get_users_by_capability ( get_context_instance ( CONTEXT_SYSTEM ),
$capability , 'username,firstname,lastname' , 'lastname,firstname' );
$choices = array (
'$@NONE@$' => get_string ( 'nobody' ),
'$@ALL@$' => get_string ( 'everyonewhocan' , 'admin' , get_capability_string ( $capability )),
);
foreach ( $users as $user ) {
$choices [ $user -> username ] = fullname ( $user );
}
parent :: admin_setting_configmultiselect ( $name , $visiblename , $description , $defaultsetting , $choices );
}
function get_defaultsetting () {
$this -> load_choices ();
if ( empty ( $this -> defaultsetting )) {
return array ( '$@NONE@$' );
} else if ( array_key_exists ( $this -> defaultsetting , $this -> choices )) {
return $this -> defaultsetting ;
} else {
return '' ;
}
}
function get_setting () {
$result = parent :: get_setting ();
if ( empty ( $result )) {
$result = array ( '$@NONE@$' );
}
return $result ;
}
function write_setting ( $data ) {
// If all is selected, remove any explicit options.
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 .
*/
2006-09-02 13:14:57 +00:00
class admin_setting_special_adminseesall extends admin_setting_configcheckbox {
function admin_setting_special_adminseesall () {
2007-12-19 17:35:20 +00:00
parent :: admin_setting_configcheckbox ( 'calendar_adminseesall' , get_string ( 'adminseesall' , 'admin' ),
get_string ( 'helpadminseesall' , 'admin' ), '0' );
2006-09-02 13:14:57 +00:00
}
function write_setting ( $data ) {
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
*/
class admin_setting_special_selectsetup extends admin_setting_configselect {
function get_setting () {
// read directly from db!
return get_config ( NULL , $this -> name );
}
function write_setting ( $data ) {
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
*/
2006-09-02 13:14:57 +00:00
class admin_setting_sitesetselect extends admin_setting_configselect {
function get_setting () {
$site = get_site ();
2007-12-19 17:35:20 +00:00
return $site -> { $this -> name };
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
function write_setting ( $data ) {
2008-05-15 21:40:00 +00:00
global $DB ;
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 ();
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 select - lists on the frontpage - hacky
*/
class admin_setting_courselist_frontpage extends admin_setting {
var $choices ;
2006-09-02 13:14:57 +00:00
2006-09-02 15:29:52 +00:00
function admin_setting_courselist_frontpage ( $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 );
parent :: admin_setting ( $name , $visiblename , $description , $defaults );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
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' ),
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 ;
}
2006-09-02 13:14:57 +00:00
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
2006-09-02 13:14:57 +00:00
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
2008-01-01 15:51:54 +00:00
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
*/
2006-09-02 13:14:57 +00:00
class admin_setting_sitesetcheckbox extends admin_setting_configcheckbox {
function get_setting () {
$site = get_site ();
2007-10-02 21:38:53 +00:00
return $site -> { $this -> name };
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
function write_setting ( $data ) {
2008-05-15 21:40:00 +00:00
global $DB ;
2007-12-19 17:35:20 +00:00
$record = new object ();
$record -> id = SITEID ;
$record -> { $this -> name } = ( $data == '1' ? 1 : 0 );
$record -> timemodified = time ();
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 .
*/
2006-09-02 13:14:57 +00:00
class admin_setting_sitesettext extends admin_setting_configtext {
function get_setting () {
$site = get_site ();
2007-10-02 21:38:53 +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
2006-10-16 07:37:41 +00:00
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
}
}
2006-09-02 13:14:57 +00:00
function write_setting ( $data ) {
2008-05-15 21:40:00 +00:00
global $DB ;
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 ();
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 .
*/
2006-09-02 13:14:57 +00:00
class admin_setting_special_frontpagedesc extends admin_setting {
function admin_setting_special_frontpagedesc () {
2007-12-19 17:35:20 +00:00
parent :: admin_setting ( 'summary' , get_string ( 'frontpagedescription' ), get_string ( 'frontpagedescriptionhelp' ), NULL );
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
function get_setting () {
$site = get_site ();
2007-10-03 10:35:34 +00:00
return $site -> { $this -> name };
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
function write_setting ( $data ) {
2008-05-15 21:40:00 +00:00
global $DB ;
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 ();
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
}
2008-01-01 15:51:54 +00:00
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
class admin_setting_special_editorfontlist extends admin_setting {
var $items ;
function admin_setting_special_editorfontlist () {
global $CFG ;
$name = 'editorfontlist' ;
$visiblename = get_string ( 'editorfontlist' , 'admin' );
$description = get_string ( 'configeditorfontlist' , 'admin' );
$defaults = array ( 'k0' => 'Trebuchet' ,
'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' );
parent :: admin_setting ( $name , $visiblename , $description , $defaults );
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
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 ) {
$item = explode ( ':' , $item );
$currentsetting [ 'k' . $i ] = $item [ 0 ];
$currentsetting [ 'v' . $i ] = $item [ 1 ];
$i ++ ;
}
return $currentsetting ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
function write_setting ( $data ) {
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +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
2008-01-01 15:51:54 +00:00
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
}
2007-12-03 06:27:21 +00:00
class admin_setting_emoticons extends admin_setting {
var $items ;
function admin_setting_emoticons () {
global $CFG ;
$name = 'emoticons' ;
$visiblename = get_string ( 'emoticons' , 'admin' );
$description = get_string ( 'configemoticons' , 'admin' );
$defaults = array ( 'k0' => ':-)' ,
'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' );
parent :: admin_setting ( $name , $visiblename , $description , $defaults );
}
function get_setting () {
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 ) {
$item = explode ( '{:}' , $item );
$currentsetting [ 'k' . $i ] = $item [ 0 ];
$currentsetting [ 'v' . $i ] = $item [ 1 ];
$i ++ ;
}
return $currentsetting ;
2007-12-03 06:27:21 +00:00
}
function write_setting ( $data ) {
// 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
$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
}
2008-01-01 15:51:54 +00:00
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
}
}
2006-09-02 13:14:57 +00:00
class admin_setting_special_editorhidebuttons extends admin_setting {
var $items ;
function admin_setting_special_editorhidebuttons () {
2007-12-19 17:35:20 +00:00
parent :: admin_setting ( 'editorhidebuttons' , get_string ( 'editorhidebuttons' , 'admin' ),
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' => '' ,
'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' );
}
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
}
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
}
2008-01-01 15:51:54 +00:00
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 .
*/
2007-04-24 16:33:06 +00:00
class admin_setting_langlist extends admin_setting_configtext {
function admin_setting_langlist () {
parent :: admin_setting_configtext ( 'langlist' , get_string ( 'langlist' , 'admin' ), get_string ( 'configlanglist' , 'admin' ), '' , PARAM_NOTAGS );
}
function write_setting ( $data ) {
$return = parent :: write_setting ( $data );
get_list_of_languages ( true ); //refresh the list
return $return ;
}
}
2007-12-19 17:35:20 +00:00
/**
* Course category selection
*/
class admin_settings_coursecat_select extends admin_setting_configselect {
function admin_settings_coursecat_select ( $name , $visiblename , $description , $defaultsetting ) {
parent :: admin_setting_configselect ( $name , $visiblename , $description , $defaultsetting , NULL );
}
2006-09-25 07:35:43 +00:00
2007-12-19 17:35:20 +00:00
function load_choices () {
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
2007-12-19 17:35:20 +00:00
class admin_setting_special_backupdays extends admin_setting_configmulticheckbox2 {
function admin_setting_special_backupdays () {
parent :: admin_setting_configmulticheckbox2 ( 'backup_sche_weekdays' , get_string ( 'schedule' ), get_string ( 'backupschedulehelp' ), array (), NULL );
$this -> plugin = 'backup' ;
2006-09-02 13:14:57 +00:00
}
2006-09-20 21:00:45 +00:00
2007-12-19 17:35:20 +00:00
function load_choices () {
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
*/
2006-09-13 09:22:16 +00:00
class admin_setting_special_debug extends admin_setting_configselect {
2006-09-02 13:14:57 +00:00
function admin_setting_special_debug () {
2007-12-19 17:35:20 +00:00
parent :: admin_setting_configselect ( 'debug' , get_string ( 'debug' , 'admin' ), get_string ( 'configdebug' , 'admin' ), DEBUG_NONE , NULL );
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
function load_choices () {
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' ),
DEBUG_MINIMAL => get_string ( 'debugminimal' , 'admin' ),
DEBUG_NORMAL => get_string ( 'debugnormal' , 'admin' ),
DEBUG_ALL => get_string ( 'debugall' , 'admin' ),
DEBUG_DEVELOPER => get_string ( 'debugdeveloper' , 'admin' ));
return true ;
2006-09-02 13:14:57 +00:00
}
}
class admin_setting_special_calendar_weekend extends admin_setting {
function admin_setting_special_calendar_weekend () {
$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
2006-12-18 18:07:03 +00:00
parent :: admin_setting ( $name , $visiblename , $description , $default );
2006-09-02 13:14:57 +00:00
}
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
2006-09-02 13:14:57 +00:00
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
2008-01-01 15:51:54 +00:00
function output_html ( $data , $query = '' ) {
2007-02-27 12:42:08 +00:00
// The order matters very much because of the implied numeric keys
$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 .
2006-10-25 08:51:26 +00:00
*/
2008-07-28 12:31:29 +00:00
class admin_setting_pickroles extends admin_setting_configmulticheckbox {
private $types ;
/**
* @ param string $name Name of config variable
* @ param string $visiblename Display name
* @ param string $description Description
* @ param array $types Array of capabilities ( usually moodle / legacy : something )
* which identify roles that will be enabled by default . Default is the
* student role
*/
2008-08-16 12:16:01 +00:00
function admin_setting_pickroles ( $name , $visiblename , $description , $types ) {
2008-07-28 12:31:29 +00:00
parent :: admin_setting_configmulticheckbox ( $name , $visiblename , $description , NULL , NULL );
2008-08-16 12:16:01 +00:00
$this -> types = $types ;
2006-10-25 08:51:26 +00:00
}
2007-12-19 17:35:20 +00:00
function load_choices () {
2008-05-15 21:40:00 +00:00
global $CFG , $DB ;
2007-12-19 17:35:20 +00:00
if ( empty ( $CFG -> rolesactive )) {
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
}
}
2007-12-19 17:35:20 +00:00
function get_defaultsetting () {
global $CFG ;
2008-08-28 07:08:08 +00:00
2007-12-19 17:35:20 +00:00
if ( empty ( $CFG -> rolesactive )) {
2008-08-16 12:16:01 +00:00
return null ;
2007-12-19 17:35:20 +00:00
}
$result = array ();
2008-07-28 12:31:29 +00:00
foreach ( $this -> types as $capability ) {
if ( $caproles = get_roles_with_capability ( $capability , CAP_ALLOW )) {
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
/**
2008-09-18 09:55:04 +00:00
* Text field with an advanced checkbox , that controls a additional " fix_ $name " setting .
2008-08-26 01:05:01 +00:00
*/
2008-09-18 09:55:04 +00:00
class admin_setting_text_with_advanced extends admin_setting_configtext {
2008-08-26 01:05:01 +00:00
function __construct ( $name , $visiblename , $description , $defaultsetting , $paramtype ) {
parent :: admin_setting_configtext ( $name , $visiblename , $description ,
$defaultsetting , $paramtype );
}
function get_setting () {
$value = parent :: get_setting ();
$fix = $this -> config_read ( 'fix_' . $this -> name );
if ( is_null ( $value ) or is_null ( $fix )) {
return NULL ;
}
return array ( 'value' => $value , 'fix' => $fix );
}
function write_setting ( $data ) {
$error = parent :: write_setting ( $data [ 'value' ]);
if ( ! $error ) {
if ( empty ( $data [ 'fix' ])) {
$ok = $this -> config_write ( 'fix_' . $this -> name , 0 );
} else {
$ok = $this -> config_write ( 'fix_' . $this -> name , 1 );
}
if ( ! $ok ) {
$error = get_string ( 'errorsetting' , 'admin' );
}
}
return $error ;
}
function output_html ( $data , $query = '' ) {
$default = $this -> get_defaultsetting ();
$defaultinfo = array ();
if ( isset ( $this -> choices [ $default [ 'value' ]])) {
$defaultinfo [] = $default [ 'value' ];
}
if ( ! empty ( $default [ 'fix' ])) {
$defaultinfo [] = get_string ( 'advanced' );
}
$defaultinfo = implode ( ', ' , $defaultinfo );
$fix = ! empty ( $data [ 'fix' ]);
2008-09-02 08:58:53 +00:00
$return = '<div class="form-text defaultsnext">' .
2008-08-26 01:05:01 +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 () . '_fix" name="' . $this -> get_full_name () .
'[fix]" value="1" ' . ( $fix ? 'checked="checked"' : '' ) . ' />' .
' <label for="' . $this -> get_id () . '_fix">' .
get_string ( 'advanced' ) . '</label></div>' ;
return format_admin_setting ( $this , $this -> visiblename , $return ,
$this -> description , true , '' , $defaultinfo , $query );
}
}
/**
2008-09-18 09:55:04 +00:00
* Dropdown menu with an advanced checkbox , that controls a additional " fix_ $name " setting .
2008-08-26 01:05:01 +00:00
*/
2008-09-18 09:55:04 +00:00
class admin_setting_combo_with_advanced extends admin_setting_configselect {
2008-08-26 01:05:01 +00:00
function __construct ( $name , $visiblename , $description , $defaultsetting , $choices ) {
parent :: admin_setting_configselect ( $name , $visiblename , $description ,
$defaultsetting , $choices );
}
function get_setting () {
$value = parent :: get_setting ();
$fix = $this -> config_read ( 'fix_' . $this -> name );
if ( is_null ( $value ) or is_null ( $fix )) {
return NULL ;
}
return array ( 'value' => $value , 'fix' => $fix );
}
function write_setting ( $data ) {
$error = parent :: write_setting ( $data [ 'value' ]);
if ( ! $error ) {
if ( empty ( $data [ 'fix' ])) {
$ok = $this -> config_write ( 'fix_' . $this -> name , 0 );
} else {
$ok = $this -> config_write ( 'fix_' . $this -> name , 1 );
}
if ( ! $ok ) {
$error = get_string ( 'errorsetting' , 'admin' );
}
}
return $error ;
}
function output_html ( $data , $query = '' ) {
$default = $this -> get_defaultsetting ();
$current = $this -> get_setting ();
list ( $selecthtml , $warning ) = $this -> output_select_html ( $data [ 'value' ],
$current [ 'value' ], $default [ 'value' ], '[value]' );
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' ]];
}
if ( ! empty ( $default [ 'fix' ])) {
$defaultinfo [] = get_string ( 'advanced' );
}
$defaultinfo = implode ( ', ' , $defaultinfo );
} else {
$defaultinfo = '' ;
}
$fix = ! empty ( $data [ 'fix' ]);
2008-09-02 08:58:53 +00:00
$return = '<div class="form-select defaultsnext">' . $selecthtml .
2008-08-26 01:05:01 +00:00
' <input type="checkbox" class="form-checkbox" id="' .
$this -> get_id () . '_fix" name="' . $this -> get_full_name () .
'[fix]" value="1" ' . ( $fix ? 'checked="checked"' : '' ) . ' />' .
' <label for="' . $this -> get_id () . '_fix">' .
get_string ( 'advanced' ) . '</label></div>' ;
return format_admin_setting ( $this , $this -> visiblename , $return , $this -> description , true , $warning , $defaultinfo , $query );
}
}
/**
2008-09-18 09:55:04 +00:00
* Specialisation of admin_setting_combo_with_advanced for easy yes / no choices .
2008-08-26 01:05:01 +00:00
*/
2008-09-18 09:55:04 +00:00
class admin_setting_yesno_with_advanced extends admin_setting_combo_with_advanced {
2008-08-26 01:05:01 +00:00
function __construct ( $name , $visiblename , $description , $defaultsetting ) {
parent :: __construct ( $name , $visiblename , $description ,
$defaultsetting , array ( get_string ( 'no' ), get_string ( 'yes' )));
}
}
2008-07-28 12:31:29 +00:00
/**
* Graded roles in gradebook
*/
class admin_setting_special_gradebookroles extends admin_setting_pickroles {
function admin_setting_special_gradebookroles () {
parent :: admin_setting_pickroles ( 'gradebookroles' , get_string ( 'gradebookroles' , 'admin' ),
2008-08-16 12:16:01 +00:00
get_string ( 'configgradebookroles' , 'admin' ),
array ( 'moodle/legacy:student' ));
2008-07-28 12:31:29 +00:00
}
}
2008-03-03 11:03:54 +00:00
class admin_setting_regradingcheckbox extends admin_setting_configcheckbox {
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 ) {
// 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
*/
2008-07-28 12:31:29 +00:00
class admin_setting_special_coursemanager extends admin_setting_pickroles {
2007-12-19 17:35:20 +00:00
function admin_setting_special_coursemanager () {
2008-07-28 12:31:29 +00:00
parent :: admin_setting_pickroles ( 'coursemanager' , get_string ( 'coursemanager' , 'admin' ),
get_string ( 'configcoursemanager' , 'admin' ),
2008-08-16 12:16:01 +00:00
array ( 'moodle/legacy:editingteacher' ));
2007-12-19 17:35:20 +00:00
}
}
2006-10-25 08:51:26 +00:00
2007-12-19 17:35:20 +00:00
/**
* Primary grade export plugin - has state tracking .
*/
class admin_setting_special_gradeexport extends admin_setting_configmulticheckbox {
function admin_setting_special_gradeexport () {
parent :: admin_setting_configmulticheckbox ( 'gradeexport' , get_string ( 'gradeexport' , 'admin' ),
get_string ( 'configgradeexport' , 'admin' ), array (), NULL );
2006-10-25 08:51:26 +00:00
}
2007-12-19 17:35:20 +00:00
function load_choices () {
if ( is_array ( $this -> choices )) {
return true ;
}
$this -> choices = array ();
if ( $plugins = get_list_of_plugins ( 'grade/export' )) {
foreach ( $plugins as $plugin ) {
$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
2006-11-17 08:57:50 +00:00
*/
2007-12-19 17:35:20 +00:00
class admin_setting_gradecat_combo extends admin_setting {
2006-11-17 08:57:50 +00:00
2007-12-19 17:35:20 +00:00
var $choices ;
function admin_setting_gradecat_combo ( $name , $visiblename , $description , $defaultsetting , $choices ) {
$this -> choices = $choices ;
parent :: admin_setting ( $name , $visiblename , $description , $defaultsetting );
2006-11-17 08:57:50 +00:00
}
function get_setting () {
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
}
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 )) {
require_once ( $CFG -> libdir . '/gradelib.php' );
grade_category :: updated_forced_settings ();
}
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
}
}
2008-01-01 15:51:54 +00:00
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 ) {
// the string cast is needed because key may be integer - 0 is equal to most strings!
$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"' : '' ) . ' />'
. '<label for="' . $this -> get_id () . 'force">' . get_string ( 'force' ) . '</label>' ;
$return .= '<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>' ;
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
*/
class admin_setting_grade_profilereport extends admin_setting_configselect {
function admin_setting_grade_profilereport () {
parent :: admin_setting_configselect ( 'grade_profilereport' , get_string ( 'profilereport' , 'grades' ), get_string ( 'configprofilereport' , 'grades' ), 'user' , null );
}
function load_choices () {
if ( is_array ( $this -> choices )) {
return true ;
}
$this -> choices = array ();
global $CFG ;
require_once ( $CFG -> libdir . '/gradelib.php' );
foreach ( get_list_of_plugins ( 'grade/report' ) as $plugin ) {
if ( file_exists ( $CFG -> dirroot . '/grade/report/' . $plugin . '/lib.php' )) {
require_once ( $CFG -> dirroot . '/grade/report/' . $plugin . '/lib.php' );
$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
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 {
function admin_setting_special_registerauth () {
2008-07-04 23:53:13 +00:00
parent :: admin_setting_configselect ( 'registerauth' , get_string ( 'selfregistration' , 'auth' ), get_string ( 'selfregistration_help' , 'auth' ), '' , null );
2007-05-10 08:23:44 +00:00
}
2007-12-19 17:35:20 +00:00
function get_defaultsettings () {
$this -> load_choices ();
if ( array_key_exists ( $this -> defaultsetting , $this -> choices )) {
return $this -> defaultsetting ;
} else {
return '' ;
}
}
2007-05-10 08:23:44 +00:00
2007-12-19 17:35:20 +00:00
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
*/
class admin_page_managemods extends admin_externalpage {
function admin_page_managemods () {
global $CFG ;
parent :: admin_externalpage ( 'managemodules' , get_string ( 'modsettings' , 'admin' ), " $CFG->wwwroot / $CFG->admin /modules.php " );
}
2007-05-10 08:23:44 +00:00
2007-12-19 17:35:20 +00:00
function search ( $query ) {
2008-05-15 21:40:00 +00:00
global $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 ) {
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
*/
class admin_enrolment_page extends admin_externalpage {
2008-07-31 06:01:12 +00:00
public function admin_enrolment_page () {
2008-07-26 16:50:33 +00:00
global $CFG ;
parent :: admin_externalpage ( 'enrolment' , get_string ( 'enrolments' ), $CFG -> wwwroot . '/' . $CFG -> admin . '/enrol.php' );
}
function search ( $query ) {
if ( $result = parent :: search ( $query )) {
return $result ;
}
$found = false ;
if ( $modules = get_list_of_plugins ( 'enrol' )) {
$textlib = textlib_get_instance ();
foreach ( $modules as $plugin ) {
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 ) {
$found = true ;
} else if ( strpos ( $textlib -> strtolower ( get_string ( 'sendcoursewelcomemessage' , 'admin' )), $query ) !== false ) {
$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 ;
}
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
*/
class admin_page_manageblocks extends admin_externalpage {
function admin_page_manageblocks () {
global $CFG ;
parent :: admin_externalpage ( 'manageblocks' , get_string ( 'blocksettings' , 'admin' ), " $CFG->wwwroot / $CFG->admin /blocks.php " );
}
2007-05-10 08:23:44 +00:00
2007-12-19 17:35:20 +00:00
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 ) {
if ( strpos ( $block -> name , $query ) !== false ) {
$found = true ;
break ;
2007-05-10 08:23:44 +00:00
}
2007-12-19 17:35:20 +00:00
$strblockname = get_string ( 'blockname' , 'block_' . $block -> name );
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
*/
class admin_page_manageqtypes extends admin_externalpage {
function __construct () {
global $CFG ;
parent :: __construct ( 'manageqtypes' , get_string ( 'manageqtypes' , 'admin' ), " $CFG->wwwroot / $CFG->admin /qtypes.php " );
}
function search ( $query ) {
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 .
*/
class admin_setting_manageauths extends admin_setting {
function admin_setting_manageauths () {
parent :: admin_setting ( 'authsui' , get_string ( 'authsettings' , 'admin' ), '' , '' );
}
2007-05-10 08:23:44 +00:00
2007-12-19 17:35:20 +00:00
function get_setting () {
return true ;
}
2007-05-10 08:23:44 +00:00
2007-12-19 17:35:20 +00:00
function get_defaultsetting () {
return true ;
2006-09-02 13:14:57 +00:00
}
function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
// do not write any setting
return '' ;
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
function is_related ( $query ) {
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 ();
$authsavailable = get_list_of_plugins ( 'auth' );
foreach ( $authsavailable as $auth ) {
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
}
2008-01-01 15:51:54 +00:00
function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
global $CFG ;
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' ,
'settings' , 'edit' , 'name' , 'enable' , 'disable' ,
'up' , 'down' , 'none' ));
$txt -> updown = " $txt->up / $txt->down " ;
2006-12-21 04:30:03 +00:00
2007-12-19 17:35:20 +00:00
$authsavailable = get_list_of_plugins ( 'auth' );
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 );
/// 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
/// Apply titles
$displayauths [ $auth ] = $authtitle ;
if ( $authplugin -> can_signup ()) {
$registrationauths [ $auth ] = $authtitle ;
}
2006-12-21 04:30:03 +00:00
}
2007-12-19 17:35:20 +00:00
foreach ( $authsavailable as $auth ) {
if ( array_key_exists ( $auth , $displayauths )) {
continue ; //already in the list
}
$authplugin = get_auth_plugin ( $auth );
/// 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
/// Apply titles
$displayauths [ $auth ] = $authtitle ;
if ( $authplugin -> can_signup ()) {
$registrationauths [ $auth ] = $authtitle ;
}
2006-12-21 04:30:03 +00:00
}
2007-12-19 17:35:20 +00:00
$return = print_heading ( get_string ( 'actauthhdr' , 'auth' ), '' , 3 , 'main' , true );
$return .= print_box_start ( 'generalbox authsui' , '' , true );
2006-12-21 04:30:03 +00:00
2007-12-19 17:35:20 +00:00
$table = new object ();
$table -> head = array ( $txt -> name , $txt -> enable , $txt -> updown , $txt -> settings );
$table -> align = array ( 'left' , 'center' , 'center' , 'center' );
$table -> width = '90%' ;
$table -> data = array ();
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\ " > " ;
$hideshow .= " <img src= \" { $CFG -> pixpath } /i/hide.gif \" class= \" icon \" alt= \" disable \" /></a> " ;
// $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\ " > " ;
$hideshow .= " <img src= \" { $CFG -> pixpath } /i/show.gif \" class= \" icon \" alt= \" enable \" /></a> " ;
// $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\ " > " ;
$updown .= " <img src= \" { $CFG -> pixpath } /t/up.gif \" alt= \" up \" /></a> " ;
}
else {
$updown .= " <img src= \" { $CFG -> pixpath } /spacer.gif \" class= \" icon \" alt= \" \" /> " ;
}
if ( $updowncount < $authcount ) {
$updown .= " <a href= \" $url &action=down&auth= $auth\ " > " ;
$updown .= " <img src= \" { $CFG -> pixpath } /t/down.gif \" alt= \" down \" /></a> " ;
}
else {
$updown .= " <img src= \" { $CFG -> pixpath } /spacer.gif \" class= \" icon \" alt= \" \" /> " ;
}
++ $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
}
2007-12-19 17:35:20 +00:00
$return .= print_table ( $table , true );
$return .= get_string ( 'configauthenticationplugins' , 'admin' ) . '<br />' . get_string ( 'tablenosave' , 'filters' );
$return .= print_box_end ( true );
2008-01-01 15:51:54 +00:00
return highlight ( $query , $return );
2007-12-19 17:35:20 +00:00
}
}
/**
* Special class for filter administration .
*/
class admin_setting_managefilters extends admin_setting {
function admin_setting_managefilters () {
parent :: admin_setting ( 'filtersui' , get_string ( 'filtersettings' , 'admin' ), '' , '' );
}
2007-11-14 11:52:21 +00:00
2007-12-19 17:35:20 +00:00
function get_setting () {
return true ;
}
function get_defaultsetting () {
return true ;
2007-10-20 15:00:31 +00:00
}
function write_setting ( $data ) {
2007-12-19 17:35:20 +00:00
// do not write any setting
return '' ;
}
2007-10-20 15:00:31 +00:00
2007-12-19 17:35:20 +00:00
function is_related ( $query ) {
if ( parent :: is_related ( $query )) {
return true ;
2007-11-14 11:52:21 +00:00
}
2007-10-20 15:00:31 +00:00
2007-12-19 17:35:20 +00:00
$textlib = textlib_get_instance ();
$filterlocations = array ( 'mod' , 'filter' );
foreach ( $filterlocations as $filterlocation ) {
$plugins = get_list_of_plugins ( $filterlocation );
foreach ( $plugins as $plugin ) {
if ( strpos ( $plugin , $query ) !== false ) {
return true ;
}
$name = get_string ( 'filtername' , $plugin );
if ( strpos ( $textlib -> strtolower ( $name ), $query ) !== false ) {
return true ;
}
2007-11-14 11:52:21 +00:00
}
}
2007-12-19 17:35:20 +00:00
return false ;
2007-11-14 11:52:21 +00:00
}
2008-01-01 15:51:54 +00:00
function output_html ( $data , $query = '' ) {
2007-12-19 17:35:20 +00:00
global $CFG ;
2007-11-14 11:52:21 +00:00
2007-12-19 17:35:20 +00:00
$strname = get_string ( 'name' );
$strhide = get_string ( 'disable' );
$strshow = get_string ( 'enable' );
$strhideshow = " $strhide / $strshow " ;
$strsettings = get_string ( 'settings' );
$strup = get_string ( 'up' );
$strdown = get_string ( 'down' );
$strupdown = " $strup / $strdown " ;
// get a list of possible filters (and translate name if possible)
// note filters can be in the dedicated filters area OR in their
// associated modules
$installedfilters = array ();
$filtersettings_new = array ();
$filterlocations = array ( 'mod' , 'filter' );
foreach ( $filterlocations as $filterlocation ) {
$plugins = get_list_of_plugins ( $filterlocation );
foreach ( $plugins as $plugin ) {
$pluginpath = " $CFG->dirroot / $filterlocation / $plugin /filter.php " ;
$settingspath_new = " $CFG->dirroot / $filterlocation / $plugin /filtersettings.php " ;
if ( is_readable ( $pluginpath )) {
$name = trim ( get_string ( " filtername " , $plugin ));
if ( empty ( $name ) or ( $name == '[[filtername]]' )) {
$textlib = textlib_get_instance ();
$name = $textlib -> strtotitle ( $plugin );
}
$installedfilters [ " $filterlocation / $plugin " ] = $name ;
if ( is_readable ( $settingspath_new )) {
$filtersettings_new [] = " $filterlocation / $plugin " ;
}
}
}
2007-11-14 11:52:21 +00:00
}
2007-12-19 17:35:20 +00:00
// get all the currently selected filters
if ( ! empty ( $CFG -> textfilters )) {
$oldactivefilters = explode ( ',' , $CFG -> textfilters );
$oldactivefilters = array_unique ( $oldactivefilters );
} else {
$oldactivefilters = array ();
2007-11-14 11:52:21 +00:00
}
2007-10-20 15:00:31 +00:00
2007-12-19 17:35:20 +00:00
// take this opportunity to clean up filters
$activefilters = array ();
foreach ( $oldactivefilters as $oldactivefilter ) {
if ( ! empty ( $oldactivefilter ) and array_key_exists ( $oldactivefilter , $installedfilters )) {
$activefilters [] = $oldactivefilter ;
}
}
2007-11-15 17:32:31 +00:00
2007-12-19 17:35:20 +00:00
// construct the display array with installed filters
// at the top in the right order
$displayfilters = array ();
foreach ( $activefilters as $activefilter ) {
$name = $installedfilters [ $activefilter ];
$displayfilters [ $activefilter ] = $name ;
}
foreach ( $installedfilters as $key => $filter ) {
if ( ! array_key_exists ( $key , $displayfilters )) {
$displayfilters [ $key ] = $filter ;
}
2007-10-28 17:15:00 +00:00
}
2007-12-19 17:35:20 +00:00
$return = print_heading ( get_string ( 'actfilterhdr' , 'filters' ), '' , 3 , 'main' , true );
$return .= print_box_start ( 'generalbox filtersui' , '' , true );
$table = new object ();
$table -> head = array ( $strname , $strhideshow , $strupdown , $strsettings );
$table -> align = array ( 'left' , 'center' , 'center' , 'center' );
$table -> width = '90%' ;
$table -> data = array ();
$filtersurl = " $CFG->wwwroot / $CFG->admin /filters.php?sesskey= " . sesskey ();
$imgurl = " $CFG->pixpath /t " ;
// iterate through filters adding to display table
$updowncount = 1 ;
$activefilterscount = count ( $activefilters );
foreach ( $displayfilters as $path => $name ) {
$upath = urlencode ( $path );
// get hide/show link
if ( in_array ( $path , $activefilters )) {
$hideshow = " <a href= \" $filtersurl &action=hide&filterpath= $upath\ " > " ;
$hideshow .= " <img src= \" { $CFG -> pixpath } /i/hide.gif \" class= \" icon \" alt= \" $strhide\ " /></ a > " ;
$hidden = false ;
$displayname = " <span> $name </span> " ;
}
else {
$hideshow = " <a href= \" $filtersurl &action=show&filterpath= $upath\ " > " ;
$hideshow .= " <img src= \" { $CFG -> pixpath } /i/show.gif \" class= \" icon \" alt= \" $strshow\ " /></ a > " ;
$hidden = true ;
$displayname = " <span class= \" dimmed_text \" > $name </span> " ;
}
2007-10-28 17:15:00 +00:00
2007-12-19 17:35:20 +00:00
// get up/down link (only if not hidden)
$updown = '' ;
if ( ! $hidden ) {
if ( $updowncount > 1 ) {
$updown .= " <a href= \" $filtersurl &action=up&filterpath= $upath\ " > " ;
$updown .= " <img src= \" $imgurl /up.gif \" alt= \" $strup\ " /></ a >& nbsp ; " ;
}
else {
$updown .= " <img src= \" $CFG->pixpath /spacer.gif \" class= \" icon \" alt= \" \" /> " ;
}
if ( $updowncount < $activefilterscount ) {
$updown .= " <a href= \" $filtersurl &action=down&filterpath= $upath\ " > " ;
$updown .= " <img src= \" $imgurl /down.gif \" alt= \" $strdown\ " /></ a > " ;
}
else {
$updown .= " <img src= \" $CFG->pixpath /spacer.gif \" class= \" icon \" alt= \" \" /> " ;
2007-10-28 17:15:00 +00:00
}
2007-12-19 17:35:20 +00:00
++ $updowncount ;
2007-10-28 17:15:00 +00:00
}
2007-12-19 17:35:20 +00:00
// settings link (if defined)
$settings = '' ;
if ( in_array ( $path , $filtersettings_new )) {
$settings = " <a href= \" settings.php?section=filtersetting " . str_replace ( '/' , '' , $path ) . " \" > $strsettings </a> " ;
}
// write data into the table object
$table -> data [] = array ( $displayname , $hideshow , $updown , $settings );
2007-10-28 17:15:00 +00:00
}
2007-12-19 17:35:20 +00:00
$return .= print_table ( $table , true );
$return .= get_string ( 'tablenosave' , 'filters' );
$return .= print_box_end ( true );
2008-01-01 15:51:54 +00:00
return highlight ( $query , $return );
2007-12-19 17:35:20 +00:00
}
2007-10-28 17:15:00 +00:00
}
2008-07-29 10:51:18 +00:00
class admin_setting_manageportfolio extends admin_setting {
private $baseurl ;
function admin_setting_manageportfolio () {
global $CFG ;
parent :: admin_setting ( 'manageportfolio' , get_string ( 'manageportfolio' , 'portfolio' ), '' , '' );
$this -> baseurl = $CFG -> wwwroot . '/' . $CFG -> admin . '/portfolio.php?sesskey=' . sesskey ();
}
function get_setting () {
return true ;
}
function get_defaultsetting () {
return true ;
}
function is_related ( $query ) {
if ( parent :: is_related ( $query )) {
return true ;
}
$textlib = textlib_get_instance ();
2008-08-22 16:17:30 +00:00
$portfolios = get_list_of_plugins ( 'portfolio/type' );
2008-07-29 10:51:18 +00:00
foreach ( $portfolios as $p ) {
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 ;
}
function output_html ( $data , $query = '' ) {
global $CFG ;
$output = print_simple_box_start ( true );
$namestr = get_string ( 'name' );
$pluginstr = get_string ( 'plugin' , 'portfolio' );
$plugins = get_list_of_plugins ( 'portfolio/type' );
$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 );
$table = new StdClass ;
$table -> head = array ( $namestr , $pluginstr , '' );
$table -> data = array ();
foreach ( $instances as $i ) {
$row = '' ;
$row .= '<a href="' . $this -> baseurl . '&edit=' . $i -> get ( 'id' ) . '"><img src="' . $CFG -> pixpath . '/t/edit.gif" alt="' . get_string ( 'edit' ) . '" /></a>' . " \n " ;
$row .= '<a href="' . $this -> baseurl . '&delete=' . $i -> get ( 'id' ) . '"><img src="' . $CFG -> pixpath . '/t/delete.gif" alt="' . get_string ( 'delete' ) . '" /></a>' . " \n " ;
if ( array_key_exists ( $i -> get ( 'plugin' ), $insane ) || array_key_exists ( $i -> get ( 'id' ), $insaneinstances )) {
$row .= '<img src="' . $CFG -> pixpath . '/t/show.gif" alt="' . get_string ( 'hidden' , 'portfolio' ) . '" />' . " \n " ;
} else {
$row .= ' <a href="' . $this -> baseurl . '&hide=' . $i -> get ( 'id' ) . '"><img src="' . $CFG -> pixpath . '/t/'
. ( $i -> get ( 'visible' ) ? 'hide' : 'show' ) . '.gif" alt="' . get_string ( $i -> get ( 'visible' ) ? 'hide' : 'show' ) . '" /></a>' . " \n " ;
}
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' );
}
}
$output .= print_table ( $table , true );
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 ) {
if ( ! portfolio_static_function ( $p , 'allows_multiple' ) && in_array ( $p , $alreadyplugins )) {
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 ;
}
$output .= print_simple_box_end ( true );
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 .
* This function must be called on each admin page before other code .
* @ 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 .
* @ param string $extraurlparams an array paramname => paramvalue , or parameters that need to be
* 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
*/
2008-12-11 09:21:41 +00:00
function admin_externalpage_setup ( $section , $extrabutton = '' , $extraurlparams = array (), $actualurl = '' ) {
2006-09-02 13:14:57 +00:00
global $CFG , $PAGE , $USER ;
2007-12-19 17:35:20 +00:00
require_once ( $CFG -> libdir . '/blocklib.php' );
require_once ( $CFG -> dirroot . '/' . $CFG -> admin . '/pagelib.php' );
2006-09-02 13:14:57 +00:00
if ( $site = get_site ()) {
require_login ();
} else {
2007-12-19 17:35:20 +00:00
redirect ( $CFG -> wwwroot . '/' . $CFG -> admin . '/index.php' );
2006-09-02 13:14:57 +00:00
die ;
}
2007-12-19 17:35:20 +00:00
$adminroot =& admin_get_root ( false , false ); // settings not required for external pages
$extpage =& $adminroot -> locate ( $section );
if ( empty ( $extpage ) or ! is_a ( $extpage , '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
2007-12-19 17:35:20 +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
2007-12-19 17:35:20 +00:00
page_map_class ( PAGE_ADMIN , 'page_admin' );
$PAGE = page_create_object ( PAGE_ADMIN , 0 ); // there must be any constant id number
$PAGE -> init_extra ( $section ); // hack alert!
2008-12-11 09:21:41 +00:00
$PAGE -> set_extra_button ( $extrabutton );
$PAGE -> set_extra_url_params ( $extraurlparams , $actualurl );
2007-12-19 17:35:20 +00:00
2006-09-02 13:14:57 +00:00
$adminediting = optional_param ( 'adminedit' , - 1 , PARAM_BOOL );
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
if ( ! isset ( $USER -> adminediting )) {
$USER -> adminediting = false ;
}
2006-09-20 21:00:45 +00:00
2006-09-02 13:14:57 +00:00
if ( $PAGE -> user_allowed_editing ()) {
if ( $adminediting == 1 ) {
$USER -> adminediting = true ;
} elseif ( $adminediting == 0 ) {
$USER -> adminediting = false ;
}
}
}
2007-08-17 07:25:47 +00:00
/**
2007-12-19 17:35:20 +00:00
* Print header for admin page
* @ param string $focus focus element
2007-08-17 07:25:47 +00:00
*/
2007-12-19 17:35:20 +00:00
function admin_externalpage_print_header ( $focus = '' ) {
if ( ! is_string ( $focus )) {
$focus = '' ; // BC compatibility, there used to be adminroot parameter
}
2006-09-02 13:14:57 +00:00
2007-02-07 08:11:31 +00:00
global $CFG , $PAGE , $SITE , $THEME ;
2007-07-27 13:38:06 +00:00
2007-04-30 17:08:34 +00:00
define ( 'ADMIN_EXT_HEADER_PRINTED' , 'true' );
2006-09-12 09:22:27 +00:00
if ( ! empty ( $SITE -> fullname )) {
$pageblocks = blocks_setup ( $PAGE );
2006-09-02 13:14:57 +00:00
2007-01-15 07:29:25 +00:00
$preferred_width_left = bounded_number ( BLOCK_L_MIN_WIDTH ,
blocks_preferred_width ( $pageblocks [ BLOCK_POS_LEFT ]),
2006-09-12 09:22:27 +00:00
BLOCK_L_MAX_WIDTH );
2007-11-23 16:49:51 +00:00
$preferred_width_right = bounded_number ( BLOCK_R_MIN_WIDTH ,
blocks_preferred_width ( $pageblocks [ BLOCK_POS_RIGHT ]),
BLOCK_R_MAX_WIDTH );
2007-12-19 17:35:20 +00:00
$PAGE -> print_header ( '' , $focus );
2007-01-15 21:28:25 +00:00
echo '<table id="layout-table" summary=""><tr>' ;
2007-08-17 07:25:47 +00:00
2007-08-07 07:34:21 +00:00
$lt = ( empty ( $THEME -> layouttable )) ? array ( 'left' , 'middle' , 'right' ) : $THEME -> layouttable ;
foreach ( $lt as $column ) {
$lt1 [] = $column ;
if ( $column == 'middle' ) break ;
}
foreach ( $lt1 as $column ) {
switch ( $column ) {
case 'left' :
2007-12-14 21:22:38 +00:00
echo '<td style="width: ' . $preferred_width_left . 'px;" id="left-column">' ;
print_container_start ();
blocks_print_group ( $PAGE , $pageblocks , BLOCK_POS_LEFT );
print_container_end ();
echo '</td>' ;
2007-08-07 07:34:21 +00:00
break ;
2007-08-17 07:25:47 +00:00
2007-08-07 07:34:21 +00:00
case 'middle' :
2007-12-14 21:22:38 +00:00
echo '<td id="middle-column">' ;
print_container_start ( true );
2008-04-04 02:54:20 +00:00
$THEME -> open_header_containers ++ ; // this is hacky workaround for the print_error()/notice() autoclosing problems on admin pages
2007-08-07 07:34:21 +00:00
break ;
2007-08-17 07:25:47 +00:00
2007-08-07 07:34:21 +00:00
case 'right' :
2007-12-14 21:22:38 +00:00
if ( blocks_have_content ( $pageblocks , BLOCK_POS_RIGHT )) {
echo '<td style="width: ' . $preferred_width_right . 'px;" id="right-column">' ;
print_container_start ();
blocks_print_group ( $PAGE , $pageblocks , BLOCK_POS_RIGHT );
print_container_end ();
echo '</td>' ;
}
2007-08-07 07:34:21 +00:00
break ;
}
}
2006-09-12 09:22:27 +00:00
} else {
print_header ();
}
2006-09-02 13:14:57 +00:00
}
2007-12-19 17:35:20 +00:00
/**
* Print footer on admin page - please use normal print_footer () instead
*/
2007-04-30 17:08:34 +00:00
function admin_externalpage_print_footer () {
2006-09-02 13:14:57 +00:00
2007-02-07 08:11:31 +00:00
global $CFG , $PAGE , $SITE , $THEME ;
2007-07-27 13:38:06 +00:00
2007-04-30 17:08:34 +00:00
define ( 'ADMIN_EXT_FOOTER_PRINTED' , 'true' );
2006-09-12 09:22:27 +00:00
if ( ! empty ( $SITE -> fullname )) {
$pageblocks = blocks_setup ( $PAGE );
2007-11-23 16:49:51 +00:00
$preferred_width_left = bounded_number ( BLOCK_L_MIN_WIDTH ,
blocks_preferred_width ( $pageblocks [ BLOCK_POS_LEFT ]),
BLOCK_L_MAX_WIDTH );
2007-01-15 07:29:25 +00:00
$preferred_width_right = bounded_number ( BLOCK_R_MIN_WIDTH ,
blocks_preferred_width ( $pageblocks [ BLOCK_POS_RIGHT ]),
2006-09-12 09:22:27 +00:00
BLOCK_R_MAX_WIDTH );
2007-08-07 07:34:21 +00:00
$lt = ( empty ( $THEME -> layouttable )) ? array ( 'left' , 'middle' , 'right' ) : $THEME -> layouttable ;
foreach ( $lt as $column ) {
if ( $column != 'middle' ) {
array_shift ( $lt );
} else if ( $column == 'middle' ) {
break ;
}
}
foreach ( $lt as $column ) {
switch ( $column ) {
case 'left' :
2007-12-14 21:22:38 +00:00
echo '<td style="width: ' . $preferred_width_left . 'px;" id="left-column">' ;
print_container_start ();
blocks_print_group ( $PAGE , $pageblocks , BLOCK_POS_LEFT );
print_container_end ();
echo '</td>' ;
2007-08-07 07:34:21 +00:00
break ;
2007-08-17 07:25:47 +00:00
2007-08-07 07:34:21 +00:00
case 'middle' :
2007-12-14 21:22:38 +00:00
print_container_end ();
2008-04-04 02:54:20 +00:00
$THEME -> open_header_containers -- ; // this is hacky workaround for the print_error()/notice() autoclosing problems on admin pages
2007-12-14 21:22:38 +00:00
echo '</td>' ;
2007-08-07 07:34:21 +00:00
break ;
2007-08-17 07:25:47 +00:00
2007-08-07 07:34:21 +00:00
case 'right' :
2007-12-14 21:22:38 +00:00
if ( blocks_have_content ( $pageblocks , BLOCK_POS_RIGHT )) {
echo '<td style="width: ' . $preferred_width_right . 'px;" id="right-column">' ;
print_container_start ();
blocks_print_group ( $PAGE , $pageblocks , BLOCK_POS_RIGHT );
print_container_end ();
echo '</td>' ;
}
2007-08-07 07:34:21 +00:00
break ;
}
2007-02-07 08:11:31 +00:00
}
2007-02-07 08:22:20 +00:00
echo '</tr></table>' ;
2006-09-12 09:22:27 +00:00
}
2006-09-02 13:14:57 +00:00
print_footer ();
}
2007-12-19 17:35:20 +00:00
/**
* Returns the reference to admin tree root
* @ return reference
*/
2009-01-11 09:41:48 +00:00
function admin_get_root ( $reload = false , $requirefulltree = true ) {
2008-05-31 09:54:12 +00:00
global $CFG , $DB ;
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
static $ADMIN = NULL ;
if ( ! is_null ( $ADMIN )) {
$olderrors = $ADMIN -> errors ;
$oldsearch = $ADMIN -> search ;
$oldfulltree = $ADMIN -> fulltree ;
} else {
$olderrors = array ();
$oldsearch = '' ;
$oldfulltree = false ;
}
if ( $reload or ( $requirefulltree and ! $oldfulltree )) {
$ADMIN = NULL ;
}
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
if ( is_null ( $ADMIN )) {
2006-09-02 13:14:57 +00:00
// start the admin tree!
2007-12-19 17:35:20 +00:00
$ADMIN = new admin_root ();
// array of error messages and search query
$ADMIN -> errors = $olderrors ;
$ADMIN -> search = $oldsearch ;
if ( $requirefulltree ) {
$ADMIN -> fulltree = true ;
} else {
$ADMIN -> fulltree = $oldfulltree ;
}
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
// we process this file first to create categories first and in correct order
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' ) {
// plugins are loaded last - they may insert pages anywhere
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
2008-01-15 01:10:34 +00:00
if ( file_exists ( $CFG -> dirroot . '/local/settings.php' )) {
2009-01-11 09:41:48 +00:00
require ( $CFG -> dirroot . '/local/settings.php' );
2008-01-14 23:32:43 +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
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 .
2007-12-19 17:35:20 +00:00
* @ param object $node , NULL means complete tree
2007-10-02 21:38:53 +00:00
* @ param bool $uncoditional if true overrides all values with defaults
* @ return void
*/
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
}
2006-09-02 13:14:57 +00:00
if ( is_a ( $node , 'admin_category' )) {
$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
}
2007-12-19 17:35:20 +00:00
} else if ( is_a ( $node , 'admin_settingpage' )) {
2006-09-02 13:14:57 +00:00
foreach ( $node -> settings as $setting ) {
2007-12-19 17:35:20 +00:00
if ( ! $unconditional and ! is_null ( $setting -> get_setting ())) {
2007-10-02 21:38:53 +00:00
//do not override existing defaults
continue ;
}
$defaultsetting = $setting -> get_defaultsetting ();
if ( is_null ( $defaultsetting )) {
// no value yet - default maybe applied after admin user creation or in upgradesettings
continue ;
}
$setting -> write_setting ( $defaultsetting );
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
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 ) {
2008-05-15 21:40:00 +00:00
global $CFG , $SITE , $COURSE , $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 ;
}
$adminroot =& admin_get_root ();
$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 ;
}
if ( $original !== serialize ( $setting -> get_setting ())) {
$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
}
2007-12-19 17:35:20 +00:00
// now update $SITE - it might have been changed
2008-05-15 21:40:00 +00:00
$SITE = $DB -> get_record ( 'course' , array ( 'id' => $SITE -> id ));
2007-12-19 17:35:20 +00:00
$COURSE = clone ( $SITE );
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
*/
function admin_find_write_settings ( $node , $data ) {
$return = array ();
if ( empty ( $data )) {
return $return ;
}
if ( is_a ( $node , 'admin_category' )) {
$entries = array_keys ( $node -> children );
foreach ( $entries as $entry ) {
$return = array_merge ( $return , admin_find_write_settings ( $node -> children [ $entry ], $data ));
}
} else if ( is_a ( $node , 'admin_settingpage' )) {
foreach ( $node -> settings as $setting ) {
$fullname = $setting -> get_full_name ();
if ( array_key_exists ( $fullname , $data )) {
$return [ $fullname ] = $setting ;
}
}
}
return $return ;
}
2006-09-02 13:14:57 +00:00
2007-12-19 17:35:20 +00:00
/**
* Internal function - prints the search results
*/
function admin_search_settings_html ( $query ) {
2006-09-02 13:14:57 +00:00
global $CFG ;
2007-12-19 17:35:20 +00:00
$textlib = textlib_get_instance ();
if ( $textlib -> strlen ( $query ) < 2 ) {
return '' ;
}
$query = $textlib -> strtolower ( $query );
$adminroot =& admin_get_root ();
$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 ()) {
// hidden pages are not displayed in search results
2007-12-19 17:35:20 +00:00
continue ;
}
if ( is_a ( $page , 'admin_externalpage' )) {
$return .= print_heading ( get_string ( 'searchresults' , 'admin' ) . ' - <a href="' . $page -> url . '">' . highlight ( $query , $page -> visiblename ) . '</a>' , '' , 2 , 'main' , true );
} else if ( is_a ( $page , 'admin_settingpage' )) {
$return .= print_heading ( get_string ( 'searchresults' , 'admin' ) . ' - <a href="' . $CFG -> wwwroot . '/' . $CFG -> admin . '/settings.php?section=' . $page -> name . '">' . highlight ( $query , $page -> visiblename ) . '</a>' , '' , 2 , 'main' , true );
} else {
continue ;
}
if ( ! empty ( $settings )) {
2007-12-29 16:49:26 +00:00
$savebutton = true ;
2007-12-19 17:35:20 +00:00
$return .= '<fieldset class="adminsettings">' . " \n " ;
foreach ( $settings as $setting ) {
$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 ();
2008-08-16 12:16:01 +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 ) {
$return .= '<div class="form-buttons"><input class="form-submit" type="submit" value="' . get_string ( 'savechanges' , 'admin' ) . '" /></div>' ;
}
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
2007-12-19 17:35:20 +00:00
*/
function admin_output_new_settings_by_page ( $node ) {
2008-07-04 23:53:13 +00:00
$return = array ();
2007-12-19 17:35:20 +00:00
if ( is_a ( $node , 'admin_category' )) {
$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
}
} else if ( is_a ( $node , 'admin_settingpage' )) {
$newsettings = array ();
foreach ( $node -> settings as $setting ) {
if ( is_null ( $setting -> get_setting ())) {
$newsettings [] = $setting ;
}
}
if ( count ( $newsettings ) > 0 ) {
$adminroot =& admin_get_root ();
2008-07-04 23:53:13 +00:00
$page = print_heading ( get_string ( 'upgradesettings' , 'admin' ) . ' - ' . $node -> visiblename , '' , 2 , 'main' , true );
$page .= '<fieldset class="adminsettings">' . " \n " ;
2007-12-19 17:35:20 +00:00
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 ();
}
}
2008-07-04 23:53:13 +00:00
$page .= '<div class="clearer"><!-- --></div>' . " \n " ;
$page .= $setting -> output_html ( $data );
2007-12-19 17:35:20 +00:00
}
2008-07-04 23:53:13 +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
* @ param string $object setting
* @ 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
* @ param bool $label link label to id
2008-01-01 15:51:54 +00:00
* @ param string $warning warning text
* @ param sting $defaultinfo defaults info , null means nothing , '' is converted to " Empty " string
* @ param string $query search query to be highlighted
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 ;
$name = $setting -> name ;
$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
2007-12-19 17:35:20 +00:00
if ( empty ( $setting -> plugin ) and array_key_exists ( $name , $CFG -> config_php_settings )) {
2007-12-19 22:32:43 +00:00
$override = '<div class="form-overridden">' . get_string ( 'configoverride' , 'admin' ) . '</div>' ;
2007-12-19 17:35:20 +00:00
} else {
$override = '' ;
}
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 > ' ;
$adminroot =& admin_get_root ();
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-12-19 17:35:20 +00:00
/**
2006-11-06 12:51:27 +00:00
* Try to upgrade the given language pack ( or current language )
* If it doesn ' t work , fail silently and return false
*/
function upgrade_language_pack ( $lang = '' ) {
global $CFG ;
if ( empty ( $lang )) {
$lang = current_language ();
}
if ( $lang == 'en_utf8' ) {
return true ; // Nothing to do
}
notify ( get_string ( 'langimport' , 'admin' ) . ': ' . $lang . ' ... ' , 'notifysuccess' );
@ mkdir ( $CFG -> dataroot . '/temp/' ); //make it in case it's a fresh install, it might not be there
@ mkdir ( $CFG -> dataroot . '/lang/' );
require_once ( $CFG -> libdir . '/componentlib.class.php' );
if ( $cd = new component_installer ( 'http://download.moodle.org' , 'lang16' , $lang . '.zip' , 'languages.md5' , 'lang' )) {
2007-12-31 01:07:49 +00:00
$status = $cd -> install (); //returns COMPONENT_(ERROR | UPTODATE | INSTALLED)
2006-11-06 12:51:27 +00:00
2007-12-31 01:07:49 +00:00
if ( $status == COMPONENT_INSTALLED ) {
2006-11-06 12:51:27 +00:00
debugging ( 'Downloading successful: ' . $lang );
@ unlink ( $CFG -> dataroot . '/cache/languages' );
return true ;
}
}
return false ;
}
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 .
*
2007-12-19 17:35:20 +00:00
* @ param string $node The node at which to start searching .
* @ 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
if ( is_a ( $node , 'admin_category' )) {
$entries = array_keys ( $node -> children );
foreach ( $entries as $entry ) {
2007-12-19 17:35:20 +00:00
if ( any_new_admin_settings ( $node -> children [ $entry ])){
return true ;
2007-04-18 09:39:49 +00:00
}
}
2007-12-19 17:35:20 +00:00
} else if ( is_a ( $node , 'admin_settingpage' )) {
2007-04-18 09:39:49 +00:00
foreach ( $node -> settings as $setting ) {
if ( $setting -> get_setting () === NULL ) {
2007-12-19 17:35:20 +00:00
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
2008-05-15 21:40:00 +00:00
* @ param string $search - string to look for
* @ param string $replace - string to replace
2007-12-03 04:46:37 +00:00
* @ return bool - success or fail
*/
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' ,
'chat' ,
'choice' ,
'data' ,
2008-05-01 20:27:42 +00:00
'feedback' ,
2008-01-25 12:56:22 +00:00
'forum' ,
'glossary' ,
'hotpot' ,
'label' ,
'lesson' ,
'quiz' ,
'resource' ,
'scorm' ,
'survey' ,
2008-05-01 20:27:42 +00:00
'wiki' );
2008-07-31 06:01:12 +00:00
2008-01-25 12:56:22 +00:00
$plugins_standard [ 'blocks' ] = array ( 'activity_modules' ,
'admin' ,
'admin_bookmarks' ,
'admin_tree' ,
'blog_menu' ,
'blog_tags' ,
'calendar_month' ,
'calendar_upcoming' ,
'course_list' ,
'course_summary' ,
'glossary_random' ,
'html' ,
'loancalc' ,
'login' ,
'mentees' ,
'messages' ,
'mnet_hosts' ,
'news_items' ,
'online_users' ,
'participants' ,
'quiz_results' ,
'recent_activity' ,
'rss_client' ,
'search' ,
'search_forums' ,
'section_links' ,
'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' ,
'algebra' ,
'censor' ,
'emailprotect' ,
'filter' ,
'mediaplugin' ,
'multilang' ,
'tex' ,
'tidy' );
$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
}
2008-01-25 12:56:22 +00:00
$plugins_ondisk = array ();
$plugins_ondisk [ 'mod' ] = get_list_of_plugins ( 'mod' , 'db' );
$plugins_ondisk [ 'blocks' ] = get_list_of_plugins ( 'blocks' , 'db' );
$plugins_ondisk [ 'filter' ] = get_list_of_plugins ( 'filter' , 'db' );
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
$strcaption = get_string ( $cat );
if ( $cat == 'mod' ) {
$strcaption = get_string ( 'activitymodule' );
} elseif ( $cat == 'filter' ) {
$strcaption = get_string ( 'managefilters' );
}
2008-02-04 11:03:29 +00:00
$html .= '<td><table class="plugincompattable generaltable boxaligncenter" cellspacing="1" cellpadding="5" '
2008-01-24 08:40:36 +00:00
. 'id="' . $cat . 'compattable" summary="compatibility table"><caption>' . $strcaption . '</caption>' . " \n " ;
$html .= '<tr class="r0"><th class="header c0">' . get_string ( 'directory' ) . " </th> \n "
. '<th class="header c1">' . get_string ( 'name' ) . " </th> \n "
2008-01-30 00:34:50 +00:00
. '<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 "
. " <td class= \" cell c0 \" > $plugin_path </td> \n "
. " <td class= \" cell c1 \" > $plugin_name </td> \n "
2008-01-25 16:31:50 +00:00
. " <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 ) {
2008-01-25 12:56:22 +00:00
// Make sure the plugin really is missing from disk
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 "
. " <td class= \" cell c0 \" >?</td> \n "
. " <td class= \" cell c1 \" > $plugin_name </td> \n "
2008-01-25 16:31:50 +00:00
. " <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 ;
}
2008-05-23 05:35:38 +00:00
2008-08-13 04:09:13 +00:00
class admin_setting_managerepository extends admin_setting {
private $baseurl ;
function admin_setting_managerepository () {
global $CFG ;
parent :: admin_setting ( 'managerepository' , get_string ( 'managerepository' , 'repository' ), '' , '' );
$this -> baseurl = $CFG -> wwwroot . '/' . $CFG -> admin . '/repository.php?sesskey=' . sesskey ();
}
2008-08-16 12:16:01 +00:00
2008-08-13 04:09:13 +00:00
function get_setting () {
return true ;
}
function get_defaultsetting () {
return true ;
}
function get_full_name () {
return 's_managerepository' ;
}
function write_setting ( $data ) {
$url = $this -> baseurl . '&new=' . $data ;
// TODO
// Should not use redirect and exit here
// Find a better way to do this.
// redirect($url);
// exit;
}
function is_related ( $query ) {
if ( parent :: is_related ( $query )) {
return true ;
}
$textlib = textlib_get_instance ();
$repositories = get_list_of_plugins ( 'repository' );
foreach ( $repositories as $p ) {
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 ;
}
function output_html ( $data , $query = '' ) {
global $CFG , $USER ;
2008-09-03 09:45:27 +00:00
$output = print_box_start ( 'generalbox' , '' , true );
2008-08-13 04:09:13 +00:00
$namestr = get_string ( 'name' );
2008-09-04 07:03:01 +00:00
$settingsstr = get_string ( 'settings' );
$updownstr = get_string ( 'updown' , 'repository' );
$hiddenstr = get_string ( 'hiddenshow' , 'repository' );
$deletestr = get_string ( 'delete' );
2008-08-13 04:09:13 +00:00
$plugins = get_list_of_plugins ( 'repository' );
2008-11-26 07:03:10 +00:00
$instances = repository :: get_types ();
2008-09-02 08:58:53 +00:00
$instancesnumber = count ( $instances );
$alreadyplugins = array ();
2008-08-13 04:09:13 +00:00
$table = new StdClass ;
2008-09-04 07:03:01 +00:00
$table -> head = array ( $namestr , $updownstr , $hiddenstr , $deletestr , $settingsstr );
$table -> align = array ( 'left' , 'center' , 'center' , 'center' , 'center' );
2008-08-13 04:09:13 +00:00
$table -> data = array ();
2008-09-02 08:58:53 +00:00
$updowncount = 1 ;
2008-08-13 04:09:13 +00:00
foreach ( $instances as $i ) {
2008-09-04 07:03:01 +00:00
$settings = '' ;
2008-09-18 05:21:51 +00:00
//display edit link only if you can config the type or if it has multiple instances (e.g. has instance config)
2008-11-26 07:03:10 +00:00
$typeoptionnames = repository :: static_function ( $i -> get_typename (), 'get_type_option_names' );
$instanceoptionnames = repository :: static_function ( $i -> get_typename (), 'get_instance_option_names' );
2008-09-18 05:21:51 +00:00
if ( ! empty ( $typeoptionnames ) || ! empty ( $instanceoptionnames )) {
2008-09-05 06:30:18 +00:00
$settings .= '<a href="' . $this -> baseurl . '&edit=' . $i -> get_typename () . '">'
. $settingsstr . '</a>' . " \n " ;
2008-09-02 08:58:53 +00:00
}
2008-09-05 06:30:18 +00:00
$delete = '<a href="' . $this -> baseurl . '&delete=' . $i -> get_typename () . '">'
. $deletestr . '</a>' . " \n " ;
2008-09-10 04:12:42 +00:00
$hidetitle = $i -> get_visible () ? get_string ( 'clicktohide' , 'repository' ) : get_string ( 'clicktoshow' , 'repository' );
2008-09-05 06:30:18 +00:00
$hiddenshow = ' <a href="' . $this -> baseurl . '&hide=' . $i -> get_typename () . '">'
. '<img src="' . $CFG -> pixpath . '/i/' . ( $i -> get_visible () ? 'hide' : 'show' ) . '.gif"'
2008-09-10 04:12:42 +00:00
. ' alt="' . $hidetitle . '" '
. ' title="' . $hidetitle . '" />'
2008-09-05 06:30:18 +00:00
. '</a>' . " \n " ;
2008-09-03 09:45:27 +00:00
2008-09-02 08:58:53 +00:00
// display up/down link
$updown = '' ;
2008-09-03 09:45:27 +00:00
2008-09-02 08:58:53 +00:00
if ( $updowncount > 1 ) {
$updown .= " <a href= \" $this->baseurl &move=up&type= " . $i -> get_typename () . " \" > " ;
$updown .= " <img src= \" { $CFG -> pixpath } /t/up.gif \" alt= \" up \" /></a> " ;
}
else {
$updown .= " <img src= \" { $CFG -> pixpath } /spacer.gif \" class= \" icon \" alt= \" \" /> " ;
}
if ( $updowncount < count ( $instances )) {
$updown .= " <a href= \" $this->baseurl &move=down&type= " . $i -> get_typename () . " \" > " ;
$updown .= " <img src= \" { $CFG -> pixpath } /t/down.gif \" alt= \" down \" /></a> " ;
}
else {
$updown .= " <img src= \" { $CFG -> pixpath } /spacer.gif \" class= \" icon \" alt= \" \" /> " ;
}
2008-09-03 09:45:27 +00:00
2008-09-02 08:58:53 +00:00
$updowncount ++ ;
2008-09-03 09:45:27 +00:00
2008-09-04 07:03:01 +00:00
$table -> data [] = array ( $i -> get_readablename (), $updown , $hiddenshow , $delete , $settings );
2008-09-04 03:41:23 +00:00
//display a grey row if the type is defined as not visible
if ( ! $i -> get_visible ()){
$table -> rowclass [] = 'dimmed_text' ;
} else {
$table -> rowclass [] = '' ;
}
2008-09-02 08:58:53 +00:00
if ( ! in_array ( $i -> get_typename (), $alreadyplugins )) {
$alreadyplugins [] = $i -> get_typename ();
}
2008-08-13 04:09:13 +00:00
}
$output .= print_table ( $table , true );
2008-08-19 03:56:52 +00:00
$instancehtml = '<div><h3>' ;
2008-09-02 08:58:53 +00:00
$instancehtml .= get_string ( 'addplugin' , 'repository' );
2008-08-19 03:56:52 +00:00
$instancehtml .= '</h3><ul>' ;
2008-08-13 04:09:13 +00:00
$addable = 0 ;
foreach ( $plugins as $p ) {
2008-09-02 08:58:53 +00:00
if ( ! in_array ( $p , $alreadyplugins )) {
2009-01-01 14:25:29 +00:00
$instancehtml .= '<li><a href="' . $CFG -> wwwroot . '/' . $CFG -> admin . '/repository.php?sesskey='
2009-01-02 10:36:25 +00:00
. sesskey () . '&new=' . $p . '">' . get_string ( 'add' , 'repository' )
2008-09-02 08:58:53 +00:00
. ' "' . get_string ( 'repositoryname' , 'repository_' . $p ) . '" '
. '</a></li>' ;
$addable ++ ;
}
2008-08-13 04:09:13 +00:00
}
2008-08-19 03:56:52 +00:00
$instancehtml .= '</ul>' ;
2008-09-03 08:45:14 +00:00
$instancehtml .= '</div>' ;
2008-09-03 09:45:27 +00:00
if ( $addable ) {
2008-08-13 04:09:13 +00:00
$output .= $instancehtml ;
}
2008-09-03 08:45:14 +00:00
$output .= print_box_end ( true );
2008-08-13 04:09:13 +00:00
return highlight ( $query , $output );
}
}