From b34d500b8232581e9ad142c06b08437e3c2b4234 Mon Sep 17 00:00:00 2001 From: Julio Montoya <gugli100@gmail.com> Date: Fri, 2 Mar 2012 14:48:44 +0100 Subject: [PATCH] Improving plugin usability --- index.php | 12 -- main/admin/settings.lib.php | 187 ++++++++---------- main/admin/settings.php | 1 + main/css/base.css | 17 +- main/css/base_chamilo.css | 7 +- main/inc/lib/course.lib.php | 55 ++---- main/inc/lib/display.lib.php | 19 +- main/inc/lib/main_api.lib.php | 3 +- main/inc/lib/plugin.lib.php | 91 +++++++++ main/inc/lib/template.lib.php | 52 ++--- main/inc/lib/userportal.lib.php | 71 ++----- main/template/default/layout/footer.tpl | 82 +++++--- main/template/default/layout/layout_1_col.tpl | 17 +- main/template/default/layout/layout_2_col.tpl | 34 ++-- main/template/default/layout/login_form.tpl | 9 +- main/template/default/layout/main_header.tpl | 58 ++++-- main/template/default/layout/page_body.tpl | 8 +- plugin/date/plugin.php | 5 +- user_portal.php | 2 - 19 files changed, 401 insertions(+), 329 deletions(-) create mode 100644 main/inc/lib/plugin.lib.php mode change 100755 => 100644 plugin/date/plugin.php diff --git a/index.php b/index.php index d00311b425..51d23ea69f 100644 --- a/index.php +++ b/index.php @@ -122,17 +122,6 @@ if (!empty($_POST['submitAuth'])) { event_open(); } - - -//@todo add this in the template -// Plugins for loginpage_main AND campushomepage_main. -if (!api_get_user_id()) { - api_plugin('loginpage_main'); -} else { - api_plugin('campushomepage_main'); -} - - //@todo add this in the template if (api_get_setting('display_categories_on_homepage') == 'true') { echo '<div class="home_cats">'; @@ -157,7 +146,6 @@ $controller->tpl->assign('hot_courses', $controller->return_hot_cour $controller->tpl->assign('announcements_block', $controller->return_announcements()); $controller->tpl->assign('home_page_block', $controller->return_home_page()); $controller->tpl->assign('notice_block', $controller->return_notice()); -$controller->tpl->assign('plugin_campushomepage', $controller->return_plugin_campushomepage()); if (api_is_platform_admin() || api_is_drh()) { $controller->tpl->assign('skills_block', $controller->return_skills_links()); diff --git a/main/admin/settings.lib.php b/main/admin/settings.lib.php index 469eed6bf9..05b5da4652 100644 --- a/main/admin/settings.lib.php +++ b/main/admin/settings.lib.php @@ -31,101 +31,80 @@ function handle_plugins() { event_system(LOG_CONFIGURATION_SETTINGS_CHANGE, LOG_CONFIGURATION_SETTINGS_CATEGORY, $category, api_get_utc_datetime(), $user_id); Display :: display_confirmation_message(get_lang('SettingsStored')); } + + $plugin_obj = new AppPlugin(); + $possible_plugins = $plugin_obj->read_plugins_from_path(); - //echo get_lang('AvailablePlugins').'<br />'; - echo '<br />'; - - /* We scan the plugin directory. Each folder is a potential plugin. */ - $pluginpath = api_get_path(SYS_PLUGIN_PATH); - - $handle = @opendir($pluginpath); - while (false !== ($file = readdir($handle))) { - if ($file != '.' && $file != '..' && is_dir(api_get_path(SYS_PLUGIN_PATH).$file)) { - $possibleplugins[] = $file; - } - } - @closedir($handle); - - /* For each of the possible plugin directories we check whether a file named "plugin.php" exists - (it contains all the needed information about this plugin). - This "plugin.php" file looks like: - $plugin_info['title'] = 'The title of the plugin'; - $plugin_info['comment'] = 'Some comment about the plugin'; - $plugin_info['location'] = array('loginpage_menu', 'campushomepage_menu', 'banner'); // The possible locations where the plugins can be used. - $plugin_info['version'] = '0.1 alpha'; // The version number of the plugin. - $plugin_info['author'] = 'Patrick Cool'; // The author of the plugin. - */ - echo '<form name="plugins" method="post" action="'.api_get_self().'?category='.$_GET['category'].'">'; + echo '<form name="plugins" method="post" action="'.api_get_self().'?category='.Security::remove_XSS($_GET['category']).'">'; echo '<table class="data_table">'; echo '<tr>'; - echo '<th>'; + echo '<th width="300px">'; echo get_lang('Plugin'); echo '</th><th>'; - echo get_lang('LoginPageMainArea'); - echo '</th><th>'; - echo get_lang('LoginPageMenu'); + echo get_lang('PluginArea').''; + echo '</th>'; + /* + echo get_lang('LoginPageMenu').'<br />(loginpage_menu)'; echo '</th><th>'; - echo get_lang('CampusHomepageMainArea'); + echo get_lang('CampusHomepageMainArea').'<br />(campushomepage_main)'; echo '</th><th>'; - echo get_lang('CampusHomepageMenu'); + echo get_lang('CampusHomepageMenu').'<br />(campushomepage_menu)'; echo '</th><th>'; - echo get_lang('MyCoursesMainArea'); + echo get_lang('MyCoursesMainArea').'<br />(mycourses_main)'; echo '</th><th>'; - echo get_lang('MyCoursesMenu'); + echo get_lang('MyCoursesMenu').'<br />(mycourses_menu)'; echo '</th><th>'; - echo get_lang('Header'); + echo get_lang('Header').'<br />(header)'; echo '</th><th>'; - echo get_lang('Footer'); + echo get_lang('Footer').'<br />(footer)'; echo '</th><th>'; - echo get_lang('CourseTool'); + echo get_lang('CourseTool').'';*/ echo '</th>'; echo '</tr>'; + + //$usedplugins = $plugin_obj->get_installed_plugins(); + $usedplugins = $plugin_obj->get_installed_plugins(); - /* We retrieve all the active plugins. */ - //$sql = "SELECT * FROM $table_settings_current WHERE category='Plugins'"; - //$result = Database::query($sql); - $result = api_get_settings('Plugins'); - //while ($row = Database::fetch_array($result)) - foreach ($result as $row) { - $usedplugins[$row['variable']][] = $row['selected_value']; + /* We display all the possible plugins and the checkboxes */ + + $plugin_list = array(); + $my_plugin_list = $plugin_obj->get_plugin_list(); + foreach($my_plugin_list as $plugin_item) { + $plugin_list[$plugin_item] = $plugin_item; } - /* We display all the possible plugins and the checkboxes */ - foreach ($possibleplugins as $testplugin) { - $plugin_info_file = api_get_path(SYS_PLUGIN_PATH).$testplugin.'/plugin.php'; + foreach ($possible_plugins as $plugin) { + $plugin_info_file = api_get_path(SYS_PLUGIN_PATH).$plugin.'/plugin.php'; + if (file_exists($plugin_info_file)) { $plugin_info = array(); - include ($plugin_info_file); - + require $plugin_info_file; echo '<tr>'; - echo '<td>'; - foreach ($plugin_info as $key => $value) { - if ($key != 'location') { - if ($key == 'title') { - $value = '<strong>'.$value.'</strong>'; - } - echo get_lang(ucwords($key)).': '.$value.'<br />'; - } - } - if (file_exists(api_get_path(SYS_PLUGIN_PATH).$testplugin.'/readme.txt')) { - echo "<a href='".api_get_path(WEB_PLUGIN_PATH).$testplugin."/readme.txt'>readme.txt</a>"; - } - echo '</td>'; - - // column: LoginPageMainArea - if (empty($usedplugins)) { - $usedplugins = array(); + echo '<td>'; + echo '<h3>'.$plugin_info['title'].' <small>v '.$plugin_info['version'].'</small></h3>'; + echo '<p>'.$plugin_info['comment'].'</p>'; + echo '<p>'.get_lang('Author').': '.$plugin_info['author'].'</p>'; + + if (file_exists(api_get_path(SYS_PLUGIN_PATH).$plugin.'/readme.txt')) { + echo "<a href='".api_get_path(WEB_PLUGIN_PATH).$plugin."/readme.txt'>readme.txt</a>"; } - display_plugin_cell('loginpage_main', $plugin_info, $testplugin, $usedplugins); - display_plugin_cell('loginpage_menu', $plugin_info, $testplugin, $usedplugins); - display_plugin_cell('campushomepage_main', $plugin_info, $testplugin, $usedplugins); - display_plugin_cell('campushomepage_menu', $plugin_info, $testplugin, $usedplugins); - display_plugin_cell('mycourses_main', $plugin_info, $testplugin, $usedplugins); - display_plugin_cell('mycourses_menu', $plugin_info, $testplugin, $usedplugins); - display_plugin_cell('header', $plugin_info, $testplugin, $usedplugins); - display_plugin_cell('footer', $plugin_info, $testplugin, $usedplugins); - display_plugin_cell('course_tool_plugin', $plugin_info, $testplugin, $usedplugins); - echo '</tr>'; + echo '</td><td>'; + + $selected_plugins = $plugin_obj->get_areas_by_plugin($plugin); + + + echo Display::select('plugin_'.$plugin.'[]', $plugin_list, $selected_plugins, array('multiple' => 'multiple', 'style' => 'width:500px')); + + /* display_plugin_cell('loginpage_main', $plugin_info, $plugin, $usedplugins); + display_plugin_cell('loginpage_menu', $plugin_info, $plugin, $usedplugins); + display_plugin_cell('campushomepage_main', $plugin_info, $plugin, $usedplugins); + display_plugin_cell('campushomepage_menu', $plugin_info, $plugin, $usedplugins); + display_plugin_cell('mycourses_main', $plugin_info, $plugin, $usedplugins); + display_plugin_cell('mycourses_menu', $plugin_info, $plugin, $usedplugins); + display_plugin_cell('header', $plugin_info, $plugin, $usedplugins); + display_plugin_cell('footer', $plugin_info, $plugin, $usedplugins); + display_plugin_cell('course_tool_plugin', $plugin_info, $plugin, $usedplugins);*/ + echo '</td></tr>'; } } echo '</table>'; @@ -388,38 +367,37 @@ function upload_stylesheet($values, $picture) { * @todo: A similar function needs to be written to activate or inactivate additional tools. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University */ -function store_plugins() { - $table_settings_current = Database :: get_main_table(TABLE_MAIN_SETTINGS_CURRENT); +function store_plugins() { global $_configuration; + + $plugin_obj = new AppPlugin(); // Get a list of all current 'Plugins' settings - $installed_plugins = api_get_settings('Plugins','list',$_configuration['access_url']); + $installed_plugins = api_get_settings('Plugins','list', $_configuration['access_url']); $shortlist_installed = array(); foreach ($installed_plugins as $plugin) { $shortlist_installed[] = $plugin['subkey']; } $shortlist_installed = array_flip(array_flip($shortlist_installed)); - // Step 1 : We remove all the plugins. - //$sql = "DELETE FROM $table_settings_current WHERE category='Plugins'"; - //Database::query($sql); + $r = api_delete_category_settings('Plugins', $_configuration['access_url']); - $shortlist_required = array(); - // Step 2: Looping through all the post values we only store these which are really a valid plugin location. - foreach ($_POST as $form_name => $formvalue) { - $form_name_elements = explode('-', $form_name); - if (is_valid_plugin_location($form_name_elements[1])) { - $shortlist_required[] = $form_name_elements[0]; - //$sql = "INSERT into $table_settings_current (variable,category,selected_value) VALUES ('".$form_name_elements['1']."','Plugins','".$form_name_elements['0']."')"; - //Database::query($sql); - api_add_setting($form_name_elements['0'], $form_name_elements['1'], $form_name_elements['0'], null, 'Plugins', $form_name_elements['0'], null, null, null, $_configuration['access_url'], 1); - // check if there is an install procedure - $pluginpath = api_get_path(SYS_PLUGIN_PATH).$form_name_elements[0].'/install.php'; - if (is_file($pluginpath) && is_readable($pluginpath)) { - //execute the install procedure - include $pluginpath; + + $plugin_list = $plugin_obj->read_plugins_from_path(); + + foreach ($plugin_list as $plugin) { + if (isset($_POST['plugin_'.$plugin])) { + $areas_to_installed = $_POST['plugin_'.$plugin]; + foreach ($areas_to_installed as $area) { + api_add_setting($plugin, $area, $plugin, null, 'Plugins', $plugin, null, null, null, $_configuration['access_url'], 1); + $pluginpath = api_get_path(SYS_PLUGIN_PATH).$plugin.'/install.php'; + if (is_file($pluginpath) && is_readable($pluginpath)) { + //execute the install procedure + require $pluginpath; + } } - } - } + } + } + foreach ($shortlist_installed as $plugin) { // if one plugin was really deleted, execute the uninstall script if (!in_array($plugin,$shortlist_required)) { @@ -427,21 +405,12 @@ function store_plugins() { $pluginpath = api_get_path(SYS_PLUGIN_PATH).$plugin.'/uninstall.php'; if (is_file($pluginpath) && is_readable($pluginpath)) { //execute the install procedure - include $pluginpath; - } + require $pluginpath; + } } } } -/** - * Check if the post information is really a valid plugin location. - * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University -*/ -function is_valid_plugin_location($location) { - static $valid_locations = array('loginpage_main', 'loginpage_menu', 'campushomepage_main', 'campushomepage_menu', 'mycourses_main', 'mycourses_menu', 'header', 'footer', 'course_tool_plugin'); - return in_array($location, $valid_locations); -} - /** * This function allows the platform admin to choose which should be the default stylesheet @@ -496,9 +465,7 @@ function handle_search() { //$renderer->setHeaderTemplate('<div class="sectiontitle">{header}</div>'."\n"); //$renderer->setElementTemplate('<div class="sectioncomment">{label}</div>'."\n".'<div class="sectionvalue">{element}</div>'."\n"); $renderer->setElementTemplate('<div class="row"><div class="label">{label}</div><div class="formw">{element}<!-- BEGIN label_2 --><span class="help-block">{label_2}</span><!-- END label_2 --></div></div>'); - - - + $values = api_get_settings_options('search_enabled'); $form->addElement('header', null, get_lang('SearchEnabledTitle')); diff --git a/main/admin/settings.php b/main/admin/settings.php index b3def264a3..25cc27476a 100644 --- a/main/admin/settings.php +++ b/main/admin/settings.php @@ -30,6 +30,7 @@ require_once api_get_path(LIBRARY_PATH).'fileManage.lib.php'; require_once api_get_path(LIBRARY_PATH).'fileUpload.lib.php'; require_once api_get_path(LIBRARY_PATH).'dashboard.lib.php'; require_once api_get_path(LIBRARY_PATH).'pdf.lib.php'; +require_once api_get_path(LIBRARY_PATH).'plugin.lib.php'; require_once 'settings.lib.php'; // Setting the section (for the tabs). diff --git a/main/css/base.css b/main/css/base.css index 99de3fdb94..a3f839f6ec 100644 --- a/main/css/base.css +++ b/main/css/base.css @@ -37,16 +37,16 @@ legend { margin-bottom: 10px; } -#header1 { - height: 50px; -} +#header_right { + text-align: right; +} + #header2 .nav{ margin-bottom:0px; } #header2 { - width:100%; - height: 35px; + } #header2 .nav { @@ -142,6 +142,13 @@ footer { padding-top: 17px; border-top: 1px solid #eee; } + #footer .container .row{ + padding-top: 60px; + } + #footer_right #admin_name, #footer_right #software_name{ + text-align:right; + } + .page-header { margin-bottom: 17px; border-bottom: 1px solid #ddd; diff --git a/main/css/base_chamilo.css b/main/css/base_chamilo.css index bdfd1a663e..0a9ab6e540 100755 --- a/main/css/base_chamilo.css +++ b/main/css/base_chamilo.css @@ -279,12 +279,7 @@ input.link_alike:hover { /******************************************************** * HEADER 1: Title, portal, organisation, course title * ********************************************************/ -#header1 { - padding:0px; - font-size:12px; - color:#666666; - background-repeat:repeat-x; -} + #header1 a { font-size:12px; font-weight:normal; diff --git a/main/inc/lib/course.lib.php b/main/inc/lib/course.lib.php index 573b5d6e42..38fb87d92e 100644 --- a/main/inc/lib/course.lib.php +++ b/main/inc/lib/course.lib.php @@ -2706,11 +2706,11 @@ class CourseManager { public function course_item_html($params, $is_sub_content = false) { $html = ''; - $class = "well"; + $class = "well2"; if ($is_sub_content) { $class = ""; - } - $html .= '<div class="row-fluid">'; + } + $html .= '<div class="row-fluid '.$class.'">'; $html .= '<div class="span10">'; $html .= '<div class="well3">'; $html .= '<div class="span1">'.$params['icon'].'</div>'; @@ -2824,7 +2824,7 @@ class CourseManager { $params['image'] = $course_title; $params['notifications'] = $show_notification; - $html .= self::course_item_html($params); + $html .= self::course_item_html($params, false); $key++; } } @@ -2858,7 +2858,7 @@ class CourseManager { // We simply display the title of the category. $params['icon'] = Display::return_icon('folder_yellow.png', null, array(), ICON_SIZE_LARGE); $params['title'] = $row['title']; - $html .= self::course_item_parent(self::course_item_html($params), self :: display_courses_in_category($row['id'], $load_dirs)); + $html .= self::course_item_parent(self::course_item_html($params, true), self :: display_courses_in_category($row['id'], $load_dirs)); } return $html; } @@ -2938,36 +2938,6 @@ class CourseManager { $params['right_actions'] .= Display::div('', array('id' => 'document_result_'.$course_info['real_id'].'_0', 'class'=>'document_preview_container')); } } - - // Function logic - act on the data (check if the course is virtual, if yes change the link). - /* - * no virtual courses - $is_virtual_course = CourseManager :: is_virtual_course_from_system_code($course['code']); - - if ($is_virtual_course) { - // If the current user is also subscribed in the real course to which this - // virtual course is linked, we don't need to display the virtual course entry in - // the course list - it is combined with the real course entry. - $target_course_code = CourseManager :: get_target_of_linked_course($course['code']); - $is_subscribed_in_target_course = CourseManager :: is_user_subscribed_in_course(api_get_user_id(), $target_course_code); - if ($is_subscribed_in_target_course) { - return; // Do not display this course entry. - } - }*/ - - // Check if the course has virtual courses attached. If yes change the course title and display code. - /* - $has_virtual_courses = CourseManager :: has_virtual_courses_from_code($course['code'], api_get_user_id()); - if ($has_virtual_courses) { - $course_info = api_get_course_info($course['code']); - $return_result = CourseManager :: determine_course_title_from_course_info(api_get_user_id(), $course_info); - $course_title = $return_result['title']; - $course_display_code = $return_result['code']; - } else { - $course_title = $course['title']; - $course_display_code = $course['visual_code']; - }*/ - $course_title = $course_info['title']; $course_title_url = ''; @@ -2993,7 +2963,12 @@ class CourseManager { $params['title'] = $course_title; $params['teachers'] = $teachers; $params['notifications'] = $show_notification; - $html .= self::course_item_html($params); + $is_subcontent = true; + if (empty($user_category_id)) { + $is_subcontent = false; + } + $html .= self::course_item_html($params, $is_subcontent); + $key++; } return $html; @@ -3142,11 +3117,9 @@ class CourseManager { $params['title'] = $session_title; $params['right_actions'] = ''; - if ($load_dirs) { - $params['right_actions'] .= '<div style="float:right;">'; + if ($load_dirs) { $params['right_actions'] .= '<a id="document_preview_'.$course_info['real_id'].'_'.$course_info['id_session'].'" class="document_preview" href="javascript:void(0);">'.Display::return_icon('folder.png', get_lang('Documents'), array('align' => 'absmiddle'),ICON_SIZE_SMALL).'</a>'; - $params['right_actions'] .= Display::div('', array('id' => 'document_result_'.$course_info['real_id'].'_'.$course_info['id_session'], 'class'=>'document_preview_container')); - $params['right_actions'] .= '</div>'; + $params['right_actions'] .= Display::div('', array('id' => 'document_result_'.$course_info['real_id'].'_'.$course_info['id_session'], 'class'=>'document_preview_container')); } if (api_get_setting('display_coursecode_in_courselist') == 'true') { @@ -3187,7 +3160,7 @@ class CourseManager { $params['title'] = $session_title; $params['extra'] = ''; - $html = self::course_item_html($params); + $html = self::course_item_html($params, true); $session_category_id = null; if (api_get_setting('use_session_mode') == 'true' && !$nosession) { diff --git a/main/inc/lib/display.lib.php b/main/inc/lib/display.lib.php index 47d0b4e24d..45fda7dcb1 100644 --- a/main/inc/lib/display.lib.php +++ b/main/inc/lib/display.lib.php @@ -714,15 +714,26 @@ class Display { if ($show_blank_item) { $html .= self::tag('option', '-- '.get_lang('Select').' --', array('value'=>'-1')); } - if($values) { - foreach($values as $key => $value) { + if ($values) { + foreach ($values as $key => $value) { if(is_array($value) && isset($value['name'])) { $value = $value['name']; } $html .= '<option value="'.$key.'"'; - if($default == $key) { - $html .= 'selected="selected"'; + + if (is_array($default)) { + foreach($default as $item) { + if ($item == $key) { + $html .= 'selected="selected"'; + break; + } + } + } else { + if ($default == $key) { + $html .= 'selected="selected"'; + } } + $html .= '>'.$value.'</option>'; } } diff --git a/main/inc/lib/main_api.lib.php b/main/inc/lib/main_api.lib.php index 3fe4cf9ef0..a68bf6bc16 100644 --- a/main/inc/lib/main_api.lib.php +++ b/main/inc/lib/main_api.lib.php @@ -3386,6 +3386,7 @@ function api_plugin($location) { include api_get_path(SYS_PLUGIN_PATH)."$this_plugin/index.php"; } } + return false; } /** @@ -3393,7 +3394,7 @@ function api_plugin($location) { * @return boolean true if the plugin is installed, false otherwise. */ function api_is_plugin_installed($plugin_list, $plugin_name) { - if(is_array($plugin_list)) { + if (is_array($plugin_list)) { foreach ($plugin_list as $plugin_location) { if (array_search($plugin_name, $plugin_location) !== false) { return true; } } diff --git a/main/inc/lib/plugin.lib.php b/main/inc/lib/plugin.lib.php new file mode 100644 index 0000000000..c4d3a827f6 --- /dev/null +++ b/main/inc/lib/plugin.lib.php @@ -0,0 +1,91 @@ +<?php +/* See license terms in /license.txt */ +class AppPlugin { + var $plugin_list = array ( + // 'loginpage_main', + 'login', + 'menu', +/* 'campushomepage_main', + 'campushomepage_menu', + 'mycourses_main', + 'mycourses_menu',*/ + 'content_top', + 'content_bottom', + 'header_main', + 'header_center', + 'header_left', + 'header_right', + //'footer', + 'footer_left', + 'footer_center', + 'footer_right', + 'course_tool_plugin' + ); + + function __construct() { + + } + + /* For each of the possible plugin directories we check whether a file named "plugin.php" exists + (it contains all the needed information about this plugin). + This "plugin.php" file looks like: + $plugin_info['title'] = 'The title of the plugin'; + $plugin_info['comment'] = 'Some comment about the plugin'; + $plugin_info['location'] = array('loginpage_menu', 'campushomepage_menu', 'banner'); // The possible locations where the plugins can be used. + $plugin_info['version'] = '0.1 alpha'; // The version number of the plugin. + $plugin_info['author'] = 'Patrick Cool'; // The author of the plugin. + */ + 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() { + $usedplugins = array(); + /* We retrieve all the active plugins. */ + $result = api_get_settings('Plugins'); + foreach ($result as $row) { + $usedplugins[$row['variable']][] = $row['selected_value']; + } + return $usedplugins; + } + + 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_list() { + sort($this->plugin_list); + return $this->plugin_list; + } +} \ No newline at end of file diff --git a/main/inc/lib/template.lib.php b/main/inc/lib/template.lib.php index 87e10de2d6..be9ea2890c 100644 --- a/main/inc/lib/template.lib.php +++ b/main/inc/lib/template.lib.php @@ -10,6 +10,7 @@ // Load Smarty library require_once api_get_path(LIBRARY_PATH).'smarty/Smarty.class.php'; require_once api_get_path(LIBRARY_PATH).'banner.lib.php'; +require_once api_get_path(LIBRARY_PATH).'plugin.lib.php'; class Template extends Smarty { @@ -28,6 +29,7 @@ class Template extends Smarty { $this->title = $title; //$this->assign('header', $title); $this->show_learnpath = $show_learnpath; + //Smarty 3 configuration $this->setTemplateDir(api_get_path(SYS_CODE_PATH).'template/'); $this->setCompileDir(api_get_path(SYS_ARCHIVE_PATH)); @@ -68,6 +70,12 @@ class Template extends Smarty { $this->set_footer_parameters(); $this->assign('style', $this->style); + + //Chamilo plugins + $plugin = new AppPlugin(); + foreach($plugin->plugin_list as $plugin) { + $this->set_plugin($plugin); + } } function set_help($help_input = null) { @@ -259,22 +267,13 @@ class Template extends Smarty { $header1 = show_header_1($language_file, $nameTools, $this->theme); $this->assign('header1', $header1); - - ob_start(); - echo '<div id="plugin-header">'; - api_plugin('header'); - echo '</div>'; - ob_clean(); - - $plugin_header = ob_get_contents(); - $this->assign('plugin_header', $plugin_header); } private function set_header_parameters() { $help = $this->help; $nameTools = $this->title; - global $_plugins, $lp_theme_css, $mycoursetheme, $user_theme; - global $httpHeadXtra, $htmlHeadXtra, $_course, $_user, $text_dir, $plugins, $_user, + global $lp_theme_css, $mycoursetheme, $user_theme; + global $httpHeadXtra, $htmlHeadXtra, $_course, $_user, $text_dir, $_user, $_cid, $interbreadcrumb, $charset, $language_file, $noPHP_SELF; $navigation = return_navigation_array(); @@ -465,16 +464,7 @@ class Template extends Smarty { } private function set_footer_parameters() { - //Footer plugin - global $_plugins, $_configuration; - - ob_start(); - api_plugin('footer'); - $plugin_footer = ob_get_contents(); - ob_clean(); - - //Plugin footer - $this->assign('plugin_footer', $plugin_footer); + global $_configuration; //Show admin data //$this->assign('show_administrator_data', api_get_setting('show_administrator_data')); @@ -544,8 +534,7 @@ class Template extends Smarty { } } } - } - $teacher_data .= '</div>'; + } $this->assign('teachers', $teacher_data); } } @@ -563,4 +552,19 @@ class Template extends Smarty { $tpl = $this->get_template('layout/show_footer.tpl'); $this->display($tpl); } -} + + /* Sets the plugin content in a Smarty variable */ + function set_plugin($plugin_name) { + if (!empty($plugin_name)) { + if (api_number_of_plugins($plugin_name) > 0) { + ob_start(); + api_plugin($plugin_name); + $plugin_content = ob_get_contents(); + ob_end_clean(); + } + $this->assign('plugin_'.$plugin_name, $plugin_content); + //return $plugin_content; + } + return null; + } +} \ No newline at end of file diff --git a/main/inc/lib/userportal.lib.php b/main/inc/lib/userportal.lib.php index c4932fbb77..fa88023515 100644 --- a/main/inc/lib/userportal.lib.php +++ b/main/inc/lib/userportal.lib.php @@ -5,7 +5,6 @@ require_once api_get_path(LIBRARY_PATH).'system_announcements.lib.php'; require_once api_get_path(LIBRARY_PATH).'groupmanager.lib.php'; require_once api_get_path(SYS_CODE_PATH).'survey/survey.lib.php'; - class IndexManager { var $tpl = false; //An instance of the template engine var $name = ''; @@ -25,8 +24,7 @@ class IndexManager { if (api_get_setting('show_documents_preview') == 'true') { $this->load_directories_preview = true; } - } - + } function set_login_form() { global $loginFailed; @@ -54,16 +52,6 @@ class IndexManager { $login_form .= '</ul>'; } $this->tpl->assign('login_options', $login_form); - - if (api_number_of_plugins('loginpage_menu') > 0) { - $login_form = '<div class="note" style="background: none">'; - ob_start(); - api_plugin('loginpage_menu'); - $plugin_login = ob_get_contents(); - $login_form .= $plugin_login; - $login_form .= '</div>'; - $this->tpl->assign('login_plugin_menu', $login_form); - } } } @@ -215,23 +203,16 @@ class IndexManager { * @todo does $_plugins need to be global? */ function display_anonymous_right_menu() { - global $loginFailed, $_plugins, $_user; + global $loginFailed, $_user; $platformLanguage = api_get_setting('platformLanguage'); $display_add_course_link = api_is_allowed_to_create_course() && ($_SESSION['studentview'] != 'studentenview'); $current_user_id = api_get_user_id(); - echo self::set_login_form(false); - - echo self::return_teacher_link(); - - echo self::return_notice(); - - //Plugin - echo self::return_plugin_campushomepage(); - } - - + echo self::set_login_form(false); + echo self::return_teacher_link(); + echo self::return_notice(); + } function return_teacher_link() { $html = ''; @@ -380,7 +361,7 @@ class IndexManager { return $html; } - function return_plugin_campushomepage() { + /*function return_plugin_campushomepage() { $html = ''; if (api_get_user_id() && api_number_of_plugins('campushomepage_menu') > 0) { ob_start(); @@ -390,7 +371,7 @@ class IndexManager { $html = self::show_right_block('', $plugin_content); } return $html; - } + }*/ function return_skills_links() { $content = '<ul class="menulist">'; @@ -753,15 +734,13 @@ class IndexManager { } function return_search_block() { - $html = ''; - + $html = ''; if (api_get_setting('search_enabled') == 'true') { $html .= '<div class="searchbox">'; - $search_btn = get_lang('Search'); - $search_text_default = get_lang('YourTextHere'); + $search_btn = get_lang('Search'); $search_content = '<br /> <form action="main/search/" method="post"> - <input type="text" id="query" size="15" name="query" value="" /> + <input type="text" id="query" class="span2" name="query" value="" /> <button class="save" type="submit" name="submit" value="'.$search_btn.'" />'.$search_btn.' </button> </form></div>'; $html .= self::show_right_block(get_lang('Search'), $search_content); @@ -805,18 +784,6 @@ class IndexManager { return $html; } - function return_plugin_courses_block() { - global $_plugins; - // Plugins for the my courses menu. - if (isset($_plugins['mycourses_menu']) && is_array($_plugins['mycourses_menu'])) { - ob_start(); - api_plugin('mycourses_menu'); - $plugin_content = ob_get_contents(); - ob_end_clean(); - echo self::show_right_block('', $plugin_content); - } - } - function return_profile_block() { $html = ''; $user_id = api_get_user_id(); @@ -977,16 +944,6 @@ class IndexManager { return $html; } - function return_courses_main_plugin() { - ob_start(); - echo '<div id="plugin-mycourses_main">'; - api_plugin('mycourses_main'); - echo '</div>'; - $plugin_content = ob_get_contents(); - ob_end_clean(); - return $plugin_content; - } - /** * The most important function here, prints the session and course list * @@ -1097,7 +1054,7 @@ class IndexManager { if (api_get_setting('hide_courses_in_sessions') == 'false') { // $params['extra'] .= $html_courses_session; } - $html .= CourseManager::course_item_parent(CourseManager::course_item_html($params), $html_courses_session); + $html .= CourseManager::course_item_parent(CourseManager::course_item_html($params, true), $html_courses_session); } } } else { @@ -1145,7 +1102,7 @@ class IndexManager { if (api_is_platform_admin()) { $params['right_actions'] .= '<a href="'.api_get_path(WEB_CODE_PATH).'admin/resume_session.php?id_session='.$session['details']['id'].'">'.Display::return_icon('edit.png', get_lang('Edit'), array('align' => 'absmiddle'),22).'</a>'; } - $html_sessions .= CourseManager::course_item_html($params).$html_courses_session; + $html_sessions .= CourseManager::course_item_html($params, true).$html_courses_session; } } @@ -1162,7 +1119,7 @@ class IndexManager { if ($category['details']['date_end'] != '0000-00-00') { $params['title'] .= sprintf(get_lang('FromDateXToDateY'),$category['details']['date_start'], $category['details']['date_end']); } - $html .= CourseManager::course_item_parent(CourseManager::course_item_html($params), $html_sessions); + $html .= CourseManager::course_item_parent(CourseManager::course_item_html($params, true), $html_sessions); } } } diff --git a/main/template/default/layout/footer.tpl b/main/template/default/layout/footer.tpl index 37722f89d0..b514a4f8e3 100644 --- a/main/template/default/layout/footer.tpl +++ b/main/template/default/layout/footer.tpl @@ -1,39 +1,63 @@ <div id="footer"> <!-- start of #footer section --> - <div class="container"> - <div class="copyright"> - {if $administrator_name } - <div class="admin_name"> - {$administrator_name} - </div> - {/if} - <div class="software_name"> - {"Platform"|get_lang} <a href="{$_p.web}" target="_blank">{$_s.software_name} {$_s.system_version}</a> - © {$smarty.now|date_format:"%Y"} - </div> - </div> + <div class="container"> + <div class="row"> + <div id="footer_left" class="span4"> + {if $session_teachers} + <div id="session_teachers"> + {$session_teachers} + </div> + {/if} + + {if $teachers } + <div id="teachers"> + {$teachers} + </div> + {/if} + {* Plugins for footer section *} + {if !empty($plugin_footer_left)} + <div id="plugin_footer_left"> + {$plugin_footer_left} + </div> + {/if} + + </div> - <div class="footer_emails"> - {if $session_teachers} - <div class="session_teachers"> - {$session_teachers} - </div> - {/if} + <div id="footer_center" class="span4"> + {* Plugins for footer section *} + {if !empty($plugin_footer_center)} + <div id="plugin_footer_center"> + {$plugin_footer_center} + </div> + {else} + + {/if} + </div> - {if $teachers } - <div class="teachers"> - {$teachers} + <div id="footer_right" class="span4"> + {if $administrator_name } + <div id="admin_name"> + {$administrator_name} + </div> + {/if} + + <div id="software_name"> + {"Platform"|get_lang} <a href="{$_p.web}" target="_blank">{$_s.software_name} {$_s.system_version}</a> + © {$smarty.now|date_format:"%Y"} </div> - {/if} - - {* Plugins for footer section *} - <div id="plugin-footer"> - {$plugin_footer} - </div> - <div style="clear:both"></div> - </div> + {* Plugins for footer section *} + {if !empty($plugin_footer_right)} + <div id="plugin_footer_right"> + {$plugin_footer_right} + </div> + {/if} + + </div><!-- end of #footer_right --> + </div><!-- end of #row --> </div><!-- end of #container --> </div><!-- end of #footer --> + {$footer_extra_content} + {literal} <script type="text/javascript"> $(document).ready( function() { diff --git a/main/template/default/layout/layout_1_col.tpl b/main/template/default/layout/layout_1_col.tpl index 7176178953..72a597039a 100644 --- a/main/template/default/layout/layout_1_col.tpl +++ b/main/template/default/layout/layout_1_col.tpl @@ -5,16 +5,25 @@ {include file="default/layout/main_header.tpl"} {/if} {/block} - {* 1 column *} {block name=body} <div class="span12"> - {include file="default/layout/page_body.tpl"} - + {if !empty($plugin_content_top)} + <div id="plugin_content_top"> + {$plugin_content_top} + </div> + {/if} + {include file="default/layout/page_body.tpl"} <section id="main_content"> {* Main content *} - {$content} + {$content} </section> + {if !empty($plugin_content_bottom)} + <div class="clear"></div> + <div id="plugin_content_bottom"> + {$plugin_content_bottom} + </div> + {/if} </div> {/block} diff --git a/main/template/default/layout/layout_2_col.tpl b/main/template/default/layout/layout_2_col.tpl index a61b7bb565..a05a2fe9ae 100644 --- a/main/template/default/layout/layout_2_col.tpl +++ b/main/template/default/layout/layout_2_col.tpl @@ -15,10 +15,13 @@ {/if} <div class="span9"> - {* Course plugin block*} - <section id="courses_plugin"> - {$plugin_courses_block} - </section> + {* Content top*} + + {if !empty($plugin_content_top)} + <div id="plugin_content_top"> + {$plugin_content_top} + </div> + {/if} {* ?? *} <section id="home_page"> @@ -28,10 +31,7 @@ {* ?? *} {$sniff_notification} - {* Show messages*} - <section id="messages"> - {$message} - </section> + {include file="default/layout/page_body.tpl"} {* Main content*} <section id="main_content"> @@ -50,6 +50,11 @@ </section> + {if !empty($plugin_content_bottom)} + <div id="plugin_content_bottom"> + {$plugin_content_bottom} + </div> + {/if} </div> {* Right column *} @@ -71,9 +76,6 @@ {* Links that are not added in the tabs*} {$navigation_course_links} - {* Plugin courses sidebar *} - {$plugin_courses_right_block} - {* Reservation block *} {$reservation_block} @@ -84,7 +86,15 @@ {$classes_block} {* Skills*} - {$skills_block} + {$skills_block} + + {* Plugin courses sidebar *} + {* Plugins for footer section *} + {if !empty($plugin_menu)} + <div id="plugin_menu"> + {$plugin_menu} + </div> + {/if} </div> {/block} diff --git a/main/template/default/layout/login_form.tpl b/main/template/default/layout/login_form.tpl index 8977ef54b3..aad0079561 100644 --- a/main/template/default/layout/login_form.tpl +++ b/main/template/default/layout/login_form.tpl @@ -7,6 +7,11 @@ {$login_language_form} {$login_form} {$login_failed} - {$login_options} - {$login_plugin_menu} + {$login_options} + + {if !empty($plugin_login)} + <div id="plugin_login"> + {$plugin_login} + </div> + {/if} </div> \ No newline at end of file diff --git a/main/template/default/layout/main_header.tpl b/main/template/default/layout/main_header.tpl index 8ccf1389e9..7eb4b32976 100644 --- a/main/template/default/layout/main_header.tpl +++ b/main/template/default/layout/main_header.tpl @@ -9,7 +9,6 @@ </head> <body dir="{$text_direction}" class="{$section_name}"> <noscript>{"NoJavascript"|get_lang}</noscript> - {if $show_header} <div class="skip"> <ul> @@ -29,18 +28,51 @@ {include file="default/layout/topbar.tpl"} <div id="main" class="container"> - <header> - {* header1 - logo *} - <div id="header1"> - {$header1} - </div> - {$plugin_header} - - {* header 2 - right menu (notifications) *} - <div id="header2"> - <ul class="nav nav-pills"> - {$header2} - </ul> + <header> + <div class="row"> + {* header1 - logo *} + <div id="header_left" class="span4"> + {$header1} + {* plugin_header *} + {if !empty($plugin_header_left)} + <div id="plugin_header_left"> + {$plugin_header_left} + </div> + {/if} + </div> + + <div id="header_center" class="span4"> + {* plugin_header *} + {if !empty($plugin_header_center)} + <div id="plugin_header_center"> + {$plugin_header_center} + </div> + {/if} + + </div> + + {* header right (notifications) *} + <div id="header_right" class="span4"> + <ul class="nav nav-pills pull-right"> + {$header2} + </ul> + {* plugin_header *} + {if !empty($plugin_header_right)} + <div id="plugin_header_right"> + {$plugin_header_right} + </div> + {/if} + + </div> + + + {if !empty($plugin_header_main)} + <div id="plugin_header_main"> + {$plugin_header_main} + </div> + {/if} + + </div> </header> diff --git a/main/template/default/layout/page_body.tpl b/main/template/default/layout/page_body.tpl index 515ce9f959..571216acb1 100644 --- a/main/template/default/layout/page_body.tpl +++ b/main/template/default/layout/page_body.tpl @@ -9,8 +9,10 @@ {if !empty($header) } <div class="page-header"> <h1>{$header}</h1> - </div> + </div> {/if} -{* Notifications*} -{$message} \ No newline at end of file +{* Show messages*} +<section id="messages"> +{$message} +</section> \ No newline at end of file diff --git a/plugin/date/plugin.php b/plugin/date/plugin.php old mode 100755 new mode 100644 index 844ab0ad92..2f0db43ca4 --- a/plugin/date/plugin.php +++ b/plugin/date/plugin.php @@ -12,10 +12,7 @@ $plugin_info['title']='Date'; //the comments that go with the plugin $plugin_info['comment']="Multinational date display"; -//the locations where this plugin can be shown -$plugin_info['location']=array('loginpage_main', 'loginpage_menu', 'campushomepage_main', 'campushomepage_menu', 'mycourses_main', 'mycourses_menu', 'header', 'footer'); //the plugin version $plugin_info['version']='1.0'; //the plugin author -$plugin_info['author']='Yannick Warnier'; -?> +$plugin_info['author']='Yannick Warnier'; \ No newline at end of file diff --git a/user_portal.php b/user_portal.php index 3c051c05d3..81f3b2bb92 100644 --- a/user_portal.php +++ b/user_portal.php @@ -178,11 +178,9 @@ if(!empty($some_activex) || !empty($some_plugins)){ } } -$controller->tpl->assign('plugin_courses_block', $controller->return_courses_main_plugin()); $controller->tpl->assign('profile_block', $controller->return_profile_block()); $controller->tpl->assign('account_block', $controller->return_account_block()); $controller->tpl->assign('navigation_course_links', $controller->return_navigation_course_links()); -$controller->tpl->assign('plugin_courses_right_block', $controller->return_plugin_courses_block()); $controller->tpl->assign('reservation_block', $controller->return_reservation_block()); $controller->tpl->assign('search_block', $controller->return_search_block()); $controller->tpl->assign('classes_block', $controller->return_classes_block());