123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- <?php
- /* See license terms in /license.txt */
- class AppPlugin
- {
- public $plugin_regions = array(
- 'login_top',
- 'login_bottom',
- 'menu_top',
- 'menu_bottom',
- 'content_top',
- 'content_bottom',
- 'header_main',
- 'header_center',
- 'header_left',
- 'header_right',
- 'footer_left',
- 'footer_center',
- 'footer_right',
- 'course_tool_plugin'
- );
- public function __construct()
- {
- }
- function read_plugins_from_path() {
- /* We scan the plugin directory. Each folder is a potential plugin. */
- $pluginpath = api_get_path(SYS_PLUGIN_PATH);
- $possible_plugins = array();
- $handle = @opendir($pluginpath);
- while (false !== ($file = readdir($handle))) {
- if ($file != '.' && $file != '..' && is_dir(api_get_path(SYS_PLUGIN_PATH).$file)) {
- $possible_plugins[] = $file;
- }
- }
- @closedir($handle);
- sort($possible_plugins);
- return $possible_plugins;
- }
- function get_installed_plugins_by_region(){
- $used_plugins = array();
- /* We retrieve all the active plugins. */
- $result = api_get_settings('Plugins');
- foreach ($result as $row) {
- $used_plugins[$row['variable']][] = $row['selected_value'];
- }
- return $used_plugins;
- }
- function get_installed_plugins() {
- $installed_plugins = array();
- $plugin_array = api_get_settings_params(array("variable = ? AND selected_value = ? AND category = ? " =>
- 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', '<div><h3>'.$icon.' '.Security::remove_XSS($plugin_info['title']).'</h3><div>');
- $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', '</div></div>');
- }
- }
- }
- }
- 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;
- }
- }
|