array('status', 'installed', 'Plugins'))); if (!empty($plugin_array)) { foreach ($plugin_array as $row) { $installed_plugins[$row['subkey']] = true; } $installed_plugins = array_keys($installed_plugins); } return $installed_plugins; } function install($plugin_name, $access_url_id = null) { if (empty($access_url_id)) { $access_url_id = api_get_current_access_url_id(); } else { $access_url_id = intval($access_url_id); } api_add_setting('installed', 'status', $plugin_name, 'setting', 'Plugins', $plugin_name, null, null, null, $access_url_id, 1); //api_add_setting($plugin, $area, $plugin, null, 'Plugins', $plugin, null, null, null, $_configuration['access_url'], 1); $pluginpath = api_get_path(SYS_PLUGIN_PATH).$plugin_name.'/install.php'; if (is_file($pluginpath) && is_readable($pluginpath)) { // Executes the install procedure require $pluginpath; } } function uninstall($plugin_name, $access_url_id = null) { if (empty($access_url_id)) { $access_url_id = api_get_current_access_url_id(); } else { $access_url_id = intval($access_url_id); } api_delete_settings_params(array('category = ? AND access_url = ? AND subkey = ? ' => array('Plugins', $access_url_id, $plugin_name))); $pluginpath = api_get_path(SYS_PLUGIN_PATH).$plugin_name.'/uninstall.php'; if (is_file($pluginpath) && is_readable($pluginpath)) { //execute the uninstall procedure require $pluginpath; } } function get_areas_by_plugin($plugin_name) { $result = api_get_settings('Plugins'); $areas = array(); foreach ($result as $row) { if ($plugin_name == $row['selected_value']) { $areas[] = $row['variable']; } } return $areas; } function is_valid_plugin_location($location) { return in_array($location, $this->plugin_list); } function is_valid_plugin($plugin_name) { if (is_dir(api_get_path(SYS_PLUGIN_PATH).$plugin_name)) { if (is_file(api_get_path(SYS_PLUGIN_PATH).$plugin_name.'/index.php')) { return true; } } return false; } function get_plugin_regions() { sort($this->plugin_regions); return $this->plugin_regions; } function load_region($plugins, $region, $main_template, $forced = false) { if ($region == 'course_tool_plugin') { return null; } ob_start(); $this->get_all_plugin_contents_by_region($plugins, $region, $main_template, $forced); $content = ob_get_contents(); ob_end_clean(); return $content; } /** * Loads the translation files inside a plugin if exists. It loads by default english see the hello world plugin * * @todo add caching * @param string $plugin_name */ function load_plugin_lang_variables($plugin_name) { global $language_interface; $root = api_get_path(SYS_PLUGIN_PATH); //1. Loading english if exists $english_path = $root.$plugin_name."/lang/english.php"; if (is_readable($english_path)) { include $english_path; foreach ($strings as $key => $string) { $GLOBALS[$key] = $string; } } //2. Loading the system language if ($language_interface != 'english') { $path = $root.$plugin_name."/lang/$language_interface.php"; if (is_readable($path)) { include $path; if (!empty($strings)) { foreach ($strings as $key => $string) { $GLOBALS[$key] = $string; } } } } } /** * * @param string $block * @param obj template obj * @todo improve this function */ function get_all_plugin_contents_by_region($_plugins, $region, $template, $forced = false) { if (isset($_plugins[$region]) && is_array($_plugins[$region])) { //if (1) { //Load the plugin information foreach ($_plugins[$region] as $plugin_name) { //The plugin_info variable is available inside the plugin index $plugin_info = $this->get_plugin_info($plugin_name, $forced); //We also know where the plugin is $plugin_info['current_region'] = $region; // Loading the plugin/XXX/index.php file $plugin_file = api_get_path(SYS_PLUGIN_PATH)."$plugin_name/index.php"; if (file_exists($plugin_file)) { //Loading the lang variables of the plugin if exists self::load_plugin_lang_variables($plugin_name); //Printing the plugin index.php file require $plugin_file; //If the variable $_template is set we assign those values to be accesible in Twig if (isset($_template)) { $_template['plugin_info'] = $plugin_info; } else { $_template = array(); $_template['plugin_info'] = $plugin_info; } //Setting the plugin info available in the template if exists $template->assign($plugin_name, $_template); //Loading the Twig template plugin files if exists $template_list = array(); if (isset($plugin_info) && isset($plugin_info['templates'])) { $template_list = $plugin_info['templates']; } if (!empty($template_list)) { foreach ($template_list as $plugin_tpl) { if (!empty($plugin_tpl)) { //$template_plugin_file = api_get_path(SYS_PLUGIN_PATH)."$plugin_name/$plugin_tpl"; //for smarty $template_plugin_file = "$plugin_name/$plugin_tpl"; // for twig $template->display($template_plugin_file); } } } } } } return true; } /** * Loads plugin info * @staticvar array $plugin_data * @param string plugin name * @param bool load from DB or from the static array * @todo filter setting_form * @return array */ function get_plugin_info($plugin_name, $forced = false) { static $plugin_data = array(); if (isset($plugin_data[$plugin_name]) && $forced == false) { return $plugin_data[$plugin_name]; } else { $plugin_file = api_get_path(SYS_PLUGIN_PATH)."$plugin_name/plugin.php"; $plugin_info = array(); if (file_exists($plugin_file)) { require $plugin_file; } //extra options $plugin_settings = api_get_settings_params(array("subkey = ? AND category = ? AND type = ? " => array($plugin_name, 'Plugins','setting'))); $settings_filtered = array(); foreach ($plugin_settings as $item) { $settings_filtered[$item['variable']] = $item['selected_value']; } $plugin_info['settings'] = $settings_filtered; $plugin_data[$plugin_name] = $plugin_info; return $plugin_info; } } /* * Get the template list */ function get_templates_list($plugin_name) { $plugin_info = $this->get_plugin_info($plugin_name); if (isset($plugin_info) && isset($plugin_info['templates'])) { return $plugin_info['templates']; } else { return false; } } /* * * Remove all regions of an specific plugin */ function remove_all_regions($plugin) { $access_url_id = api_get_current_access_url_id(); if (!empty($plugin)) { api_delete_settings_params(array('category = ? AND type = ? AND access_url = ? AND subkey = ? ' => array('Plugins', 'region', $access_url_id, $plugin))); } } /* * Add a plugin to a region */ function add_to_region($plugin, $region) { $access_url_id = api_get_current_access_url_id(); api_add_setting($plugin, $region, $plugin, 'region', 'Plugins', $plugin, null, null, null, $access_url_id, 1); } function install_course_plugins($course_id) { $plugin_list = $this->get_installed_plugins(); if (!empty($plugin_list)) { foreach ($plugin_list as $plugin_name) { $plugin_path = api_get_path(SYS_PLUGIN_PATH).$plugin_name.'/plugin.php'; if (file_exists($plugin_path)) { require_once $plugin_path; if (isset($plugin_info) && isset($plugin_info['plugin_class'])) { $plugin_info['plugin_class']::create()->course_install($course_id); } } } } } function add_course_settings_form($form) { $plugin_list = $this->get_installed_plugins(); foreach ($plugin_list as $plugin_name) { $plugin_info = $this->get_plugin_info($plugin_name); if (isset($plugin_info['plugin_class'])) { $obj = $plugin_info['plugin_class']::create(); if (!empty($obj->course_settings)) { $icon = Display::return_icon($plugin_name.'.png', Security::remove_XSS($plugin_info['title']),'', ICON_SIZE_SMALL); //$icon = null; $form->addElement('html', '

'.$icon.' '.Security::remove_XSS($plugin_info['title']).'

'); $groups = array(); foreach ($obj->course_settings as $setting) { if ($setting['type'] != 'checkbox') { $form->addElement($setting['type'], $setting['name'], $obj->get_lang($setting['name'])); } else { //if (isset($groups[$setting['group']])) { $element = & $form->createElement($setting['type'], $setting['name'], '', $obj->get_lang($setting['name'])); if ($setting['init_value'] == 1) { $element->setChecked(true); } $groups[$setting['group']][] = $element; //} } } foreach ($groups as $k => $v) { $form->addGroup($groups[$k], $k, array($obj->get_lang($k))); } $form->addElement('style_submit_button', null, get_lang('SaveSettings'), 'class="save"'); $form->addElement('html', '
'); } } } } function set_course_settings_defaults(& $values) { $plugin_list = $this->get_installed_plugins(); foreach ($plugin_list as $plugin_name) { $plugin_info = $this->get_plugin_info($plugin_name); if (isset($plugin_info['plugin_class'])) { $obj = $plugin_info['plugin_class']::create(); if (!empty($obj->course_settings)) { foreach ($obj->course_settings as $setting) { if (isset($setting['name'])) { $result = api_get_course_setting($setting['name']); if ($result != '-1') { $values[$setting['name']] = $result; } } } } } } } /** * When saving the plugin values in the course settings, check whether * a callback method should be called and send it the updated settings * @param array The new settings the user just saved * @return void */ function save_course_settings($values) { $plugin_list = $this->get_installed_plugins(); foreach ($plugin_list as $plugin_name) { $settings = $this->get_plugin_course_settings($plugin_name); $subvalues = array(); $i = 0; foreach ($settings as $v) { if (isset($values[$v])) { $subvalues[$v] = $values[$v]; $i++; } } if ($i>0) { $plugin_info = $this->get_plugin_info($plugin_name); if (isset($plugin_info['plugin_class'])) { $obj = $plugin_info['plugin_class']::create(); $obj->course_settings_updated($subvalues); } } } } /** * Gets a nice array of keys for just the plugin's course settings * @param string The plugin ID * @return array Nice array of keys for course settings */ public function get_plugin_course_settings($plugin_name) { $settings = array(); if (empty($plugin_name)) { return $settings; } $plugin_info = $this->get_plugin_info($plugin_name); if (isset($plugin_info['plugin_class'])) { $obj = $plugin_info['plugin_class']::create(); if (is_array($obj->course_settings)) { foreach ($obj->course_settings as $item) { if (isset($item['group'])) { if (!in_array($item['group'],$settings)) { $settings[] = $item['group']; } } else { $settings[] = $item['name']; } } } unset($obj); unset($plugin_info); } return $settings; } }