skala
Laurent Opprecht 14 years ago
commit 0252b595ea
  1. 2
      main/admin/inactive_user_list.php
  2. 2
      main/admin/languages.php
  3. 2
      main/admin/ldap_users_list.php
  4. 4
      main/admin/session_list.php
  5. 145
      main/admin/settings.lib.php
  6. 1
      main/admin/settings.php
  7. 2
      main/admin/specific_fields.php
  8. 2
      main/admin/sub_language.php
  9. 132
      main/course_info/infocours.php
  10. 22
      main/coursecopy/classes/Course.class.php
  11. 6
      main/coursecopy/classes/CourseSelectForm.class.php
  12. 2
      main/exercice/fill_blanks.class.php
  13. 2
      main/exercice/freeanswer.class.php
  14. 2
      main/exercice/matching.class.php
  15. 2
      main/exercice/multiple_answer.class.php
  16. 2
      main/exercice/multiple_answer_combination.class.php
  17. 2
      main/exercice/multiple_answer_true_false.class.php
  18. 2
      main/exercice/oral_expression.class.php
  19. 2
      main/exercice/unique_answer.class.php
  20. 2
      main/exercice/unique_answer_no_option.class.php
  21. 2
      main/gradebook/gradebook_showlog_eval.php
  22. 2
      main/gradebook/gradebook_showlog_link.php
  23. 8
      main/gradebook/lib/gradebook_functions.inc.php
  24. BIN
      main/img/icons/22/visio.png
  25. 2
      main/inc/ajax/model.ajax.php
  26. 1
      main/inc/conf/add_course.conf.dist.php
  27. 2
      main/inc/global.inc.php
  28. 27
      main/inc/lib/add_course.lib.inc.php
  29. 3
      main/inc/lib/career.lib.php
  30. 4
      main/inc/lib/database.lib.php
  31. 25
      main/inc/lib/link.lib.php
  32. 3
      main/inc/lib/main_api.lib.php
  33. 4
      main/inc/lib/sessionmanager.lib.php
  34. 4
      main/inc/lib/skill.lib.php
  35. 4
      main/inc/lib/usermanager.lib.php
  36. 1
      main/install/db_main.sql
  37. 85
      main/install/install.lib.php
  38. 4
      main/install/install_db.inc.php
  39. 3
      main/install/migrate-db-1.8.8-1.9.0-pre.sql
  40. 20
      main/install/update-db-1.8.8-1.9.0.inc.php
  41. 6
      main/link/link.php
  42. 2
      main/reservation/rsys.php
  43. 2
      main/session/index.php
  44. 540
      plugin/bbb/bbb.lib.php
  45. 760
      plugin/bbb/bbb_api.php
  46. 9
      plugin/bbb/config.php
  47. 54
      plugin/bbb/course_install.php
  48. 60
      plugin/bbb/install.php
  49. 60
      plugin/bbb/listing.php
  50. 52
      plugin/bbb/listing.tpl
  51. 4
      plugin/bbb/plugin.php
  52. 119
      plugin/bbb/start.php
  53. 23
      plugin/bbb/uninstall.php
  54. 10
      plugin/share_buttons/plugin.php
  55. 2
      tests/main/announcements/announcements.inc.test.php
  56. 4
      tests/main/inc/lib/sortable_table.class.test.php

@ -13,7 +13,7 @@
$language_file = array ('registration','admin'); $language_file = array ('registration','admin');
$cidReset = true; $cidReset = true;
require_once '../inc/global.inc.php'; require_once '../inc/global.inc.php';
require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php'; require_once api_get_path(LIBRARY_PATH).'sortable_table.class.php';
require_once api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php'; require_once api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php';
require_once api_get_path(LIBRARY_PATH).'security.lib.php'; require_once api_get_path(LIBRARY_PATH).'security.lib.php';
require_once api_get_path(LIBRARY_PATH).'usermanager.lib.php'; require_once api_get_path(LIBRARY_PATH).'usermanager.lib.php';

@ -23,7 +23,7 @@ $cidReset = true;
// include global script // include global script
require_once '../inc/global.inc.php'; require_once '../inc/global.inc.php';
require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php'; require_once api_get_path(LIBRARY_PATH).'sortable_table.class.php';
require_once 'sub_language.class.php'; require_once 'sub_language.class.php';
$this_section = SECTION_PLATFORM_ADMIN; $this_section = SECTION_PLATFORM_ADMIN;

@ -12,7 +12,7 @@ $language_file[] = 'registration';
$language_file[] = 'admin'; $language_file[] = 'admin';
$cidReset = true; $cidReset = true;
require('../inc/global.inc.php'); require('../inc/global.inc.php');
require_once(api_get_path(LIBRARY_PATH).'sortabletable.class.php'); require_once(api_get_path(LIBRARY_PATH).'sortable_table.class.php');
require_once(api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php'); require_once(api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php');
require_once(api_get_path(LIBRARY_PATH).'security.lib.php'); require_once(api_get_path(LIBRARY_PATH).'security.lib.php');
require('../auth/ldap/authldap.php'); require('../auth/ldap/authldap.php');

@ -37,9 +37,8 @@ if (isset($_REQUEST['keyword'])) {
$url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_sessions&_search=true&rows=20&page=1&sidx=&sord=asc&filters=&searchField=name&searchString='.Security::remove_XSS($_REQUEST['keyword']).'&searchOper=bw'; $url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_sessions&_search=true&rows=20&page=1&sidx=&sord=asc&filters=&searchField=name&searchString='.Security::remove_XSS($_REQUEST['keyword']).'&searchOper=bw';
} }
//The order is important you need to check the the $column variable in the model.ajax.php file //The order is important you need to check the the $column variable in the model.ajax.php file
$columns = array(get_lang('Name'), get_lang('NumberOfCourses'), get_lang('SessionCategoryName'), $columns = array(get_lang('Name'), get_lang('NumberOfCourses'), get_lang('NumberOfUsers'), get_lang('SessionCategoryName'),
get_lang('StartDate'), get_lang('EndDate'), get_lang('Coach'), get_lang('Status'), get_lang('Visibility'), get_lang('Actions')); get_lang('StartDate'), get_lang('EndDate'), get_lang('Coach'), get_lang('Status'), get_lang('Visibility'), get_lang('Actions'));
//$activeurl = '?sidx=session_active'; //$activeurl = '?sidx=session_active';
@ -47,6 +46,7 @@ $columns = array(get_lang('Name'), get_lang('NumberOfCourses'), get_lang(
$column_model = array( $column_model = array(
array('name'=>'name', 'index'=>'name', 'width'=>'120', 'align'=>'left', 'search' => 'true'), array('name'=>'name', 'index'=>'name', 'width'=>'120', 'align'=>'left', 'search' => 'true'),
array('name'=>'nbr_courses', 'index'=>'nbr_courses', 'width'=>'30', 'align'=>'left', 'search' => 'true'), array('name'=>'nbr_courses', 'index'=>'nbr_courses', 'width'=>'30', 'align'=>'left', 'search' => 'true'),
array('name'=>'nbr_users', 'index'=>'nbr_users', 'width'=>'30', 'align'=>'left', 'search' => 'true'),
array('name'=>'category_name', 'index'=>'category_name', 'width'=>'70', 'align'=>'left', 'search' => 'true'), array('name'=>'category_name', 'index'=>'category_name', 'width'=>'70', 'align'=>'left', 'search' => 'true'),
array('name'=>'date_start', 'index'=>'date_start', 'width'=>'40', 'align'=>'left', 'search' => 'true'), array('name'=>'date_start', 'index'=>'date_start', 'width'=>'40', 'align'=>'left', 'search' => 'true'),
array('name'=>'date_end', 'index'=>'date_end', 'width'=>'40', 'align'=>'left', 'search' => 'true'), array('name'=>'date_end', 'index'=>'date_end', 'width'=>'40', 'align'=>'left', 'search' => 'true'),

@ -591,7 +591,7 @@ function handle_search() {
echo '</div>'; echo '</div>';
if ($search_enabled == 'true') { if ($search_enabled == 'true') {
require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php'; require_once api_get_path(LIBRARY_PATH).'sortable_table.class.php';
$xapian_path = api_get_path(SYS_PATH).'searchdb'; $xapian_path = api_get_path(SYS_PATH).'searchdb';
/* /*
@ -1060,11 +1060,16 @@ function generate_settings_form($settings, $settings_by_access_list) {
if ( $_configuration['multiple_access_urls']) { if ( $_configuration['multiple_access_urls']) {
if (api_is_global_platform_admin()) { if (api_is_global_platform_admin()) {
if ($row['access_url_changeable'] == '1') { if ($row['access_url_locked'] == 0) {
$form->addElement('html', '<div style="float: right;"><a class="share_this_setting" data_status = "0" data_to_send = "'.$row['id'].'" href="javascript:void(0);">'.Display::return_icon('shared_setting.png', get_lang('ChangeSharedSetting')).'</a></div>'); if ($row['access_url_changeable'] == '1') {
} else { $form->addElement('html', '<div style="float: right;"><a class="share_this_setting" data_status = "0" data_to_send = "'.$row['id'].'" href="javascript:void(0);">'.
$form->addElement('html', '<div style="float: right;"><a class="share_this_setting" data_status = "1" data_to_send = "'.$row['id'].'" href="javascript:void(0);">'.Display::return_icon('shared_setting_na.png', get_lang('ChangeSharedSetting')).'</a></div>'); Display::return_icon('shared_setting.png', get_lang('ChangeSharedSetting')).'</a></div>');
} else {
$form->addElement('html', '<div style="float: right;"><a class="share_this_setting" data_status = "1" data_to_send = "'.$row['id'].'" href="javascript:void(0);">'.
Display::return_icon('shared_setting_na.png', get_lang('ChangeSharedSetting')).'</a></div>');
}
} }
} }
} }
@ -1096,7 +1101,7 @@ function generate_settings_form($settings, $settings_by_access_list) {
switch ($row['type']) { switch ($row['type']) {
case 'textfield': case 'textfield':
if (in_array($row['variable'], $convert_byte_to_mega_list)) { if (in_array($row['variable'], $convert_byte_to_mega_list)) {
$form->addElement('text', $row['variable'], array(get_lang($row['title']), get_lang($row['comment']), get_lang('MB')), array('maxlength' => '8')); $form->addElement('text', $row['variable'], array(get_lang($row['title']), get_lang($row['comment']), get_lang('MB')), array('class' => 'span1', 'maxlength' => '8'));
$form->applyFilter($row['variable'], 'html_filter'); $form->applyFilter($row['variable'], 'html_filter');
$default_values[$row['variable']] = round($row['selected_value']/1024/1024, 1); $default_values[$row['variable']] = round($row['selected_value']/1024/1024, 1);
} elseif ($row['variable'] == 'account_valid_duration') { } elseif ($row['variable'] == 'account_valid_duration') {
@ -1131,6 +1136,7 @@ function generate_settings_form($settings, $settings_by_access_list) {
$form->addElement('select', $row['variable'], array(get_lang($row['title']), get_lang($row['comment'])), $valid_encodings); $form->addElement('select', $row['variable'], array(get_lang($row['title']), get_lang($row['comment'])), $valid_encodings);
$default_values[$row['variable']] = $current_system_encoding; $default_values[$row['variable']] = $current_system_encoding;
} else { } else {
$hideme['class'] = 'span4';
$form->addElement('text', $row['variable'], array(get_lang($row['title']), get_lang($row['comment'])), $hideme); $form->addElement('text', $row['variable'], array(get_lang($row['title']), get_lang($row['comment'])), $hideme);
$form->applyFilter($row['variable'],'html_filter'); $form->applyFilter($row['variable'],'html_filter');
$default_values[$row['variable']] = $row['selected_value']; $default_values[$row['variable']] = $row['selected_value'];
@ -1235,130 +1241,7 @@ function generate_settings_form($settings, $settings_by_access_list) {
$renderer->setElementTemplate(' {element}</div><br />', 'gradebook_display['.$row['variable'].'][score]'); $renderer->setElementTemplate(' {element}</div><br />', 'gradebook_display['.$row['variable'].'][score]');
break; break;
case 'custom': case 'custom':
/*$values = api_get_settings_options($row['variable']);
//$renderer = & $form->defaultRenderer();
//$renderer->setElementTemplate('{label} - {element}<!-- BEGIN label_2 --><span class="help-block">{label_2}</span><!-- END label_2 -->');
$numbers = array();
for($j=1;$j<=20;$j++) {
$numbers[$j] = $j;
}
if (!empty($values)) {
foreach($values as $option) {
$group = array();
$id = $option['id'];
$option_id = $row['variable']."[$id]";
$group[] = $form->createElement('text', $option_id.'[display_text]', array(get_lang($row['title']), get_lang($row['comment'])),'class="begin_model"');
$default_values[$option_id.'[display_text]'] = $option['display_text'];
$parts = api_grading_model_functions($option['value'], 'to_array');
$denominator = $parts['denominator'];
$j = 1;
foreach($parts['items'] as $item) {
$letter = $item['letter'];
$value = $item['value'];
$group[] =$form->createElement('static','<div>');
$class = 'number';
if ($j == 1) {
$class = 'first_number';
}
$group[] = $form->createElement('select', $option_id.'[items]['.$j.']', array('dd'), $numbers, array('class'=>$class));
$sum = ' ';
if ($j != count($parts['items'])) {
$sum = ' + ';
}
//$group[] =$form->createElement('static',' * '.$letter.$sum);
$default_values[$option_id.'[items]['.$j.']'] = $value;
$j++;
}
$group[] = $form->createElement('select', $option_id.'[denominator]', array('/'), $numbers,'class="denominator"');
$group[] = $form->createElement('button', "delete", get_lang('Delete'), array('type'=>'button', 'class' => 'btn btn-danger','id'=>$id, 'onclick'=>"delete_grading_model('$id');"));
$default_values[$option_id.'[denominator]'] = $denominator;
$form->addGroup($group, '', get_lang($row['title']), ' ');
}
}
//New Grading Model form
$group = array();
$group[] = $form->createElement('text', 'new_model', array(get_lang('AddNewModel')));
$group[] = $form->createElement('select', 'number_evaluations', array(''), $numbers,'');
$form->addGroup($group, '', get_lang('AddNewModel'), "&nbsp;&nbsp;".get_lang('NumberOfSubEvaluations')."&nbsp;");
$form->addElement('style_submit_button', null, get_lang('Add'), 'class="add"');
*/
break; break;
/*
* Used to display custom values for the gradebook score display
*/
/* this configuration is moved now inside gradebook tool
case 'gradebook_score_display_custom':
if(api_get_setting('gradebook_score_display_custom', 'my_display_custom') == 'false') {
$form->addElement('static', null, null, get_lang('GradebookActivateScoreDisplayCustom'));
} else {
// Get score displays.
require_once api_get_path(SYS_CODE_PATH).'gradebook/lib/scoredisplay.class.php';
$scoredisplay = ScoreDisplay::instance();
$customdisplays = $scoredisplay->get_custom_score_display_settings();
$nr_items = (count($customdisplays)!='0') ? count($customdisplays) : '1';
$form->addElement('hidden', 'gradebook_score_display_custom_values_maxvalue', '100');
$form->addElement('hidden', 'gradebook_score_display_custom_values_minvalue', '0');
$form->addElement('static', null, null, get_lang('ScoreInfo'));
$scorenull[] = $form->CreateElement('static', null, null, get_lang('Between'));
$form->setDefaults(array (
'beginscore' => '0'
));
$scorenull[] = $form->CreateElement('text', 'beginscore', null, array (
'size' => 5,
'maxlength' => 5,
'disabled' => 'disabled'
));
$scorenull[] = $form->CreateElement('static', null, null, ' %');
$form->addGroup($scorenull, '', '', ' ');
for ($counter= 1; $counter <= 20; $counter++) {
$renderer = $form->defaultRenderer();
$elementTemplateTwoLabel =
'<div id=' . $counter . ' style="display: '.(($counter<=$nr_items)?'inline':'none').';">
<p><!-- BEGIN required --><span class="form_required">*</span> <!-- END required -->{label}
<div class="formw"><!-- BEGIN error --><span class="form_error">{error}</span><br /><!-- END error --> <b>'.get_lang('And').'</b>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp{element} % =';
$elementTemplateTwoLabel2 =
'<!-- BEGIN error --><span class="form_error">{error}</span><br /><!-- END error -->&nbsp{element}
<a href="javascript:minItem(' . ($counter) . ')"><img style="display: '.(($counter >= $nr_items && $counter != 1) ? 'inline' : 'none').';" id="min-' . $counter . '" src="../img/gradebook_remove.gif" alt="'.get_lang('Delete').'" title="'.get_lang('Delete').'"></img></a>
<a href="javascript:plusItem(' . ($counter+1) . ')"><img style="display: '.(($counter >= $nr_items) ? 'inline' : 'none').';" id="plus-' . ($counter+1) . '" src="../img/gradebook_add.gif" alt="'.get_lang('Add').'" title="'.get_lang('Add').'"></img></a>
</div></p></div>';
$scorebetw= array ();
$form->addElement('text', 'gradebook_score_display_custom_values_endscore[' . $counter . ']', null, array (
'size' => 5,
'maxlength' => 5,
'id' => 'txta-'.$counter
));
$form->addElement('text', 'gradebook_score_display_custom_values_displaytext[' . $counter . ']', null,array (
'size' => 40,
'maxlength' => 40,
'id' => 'txtb-'.$counter
));
$renderer->setElementTemplate($elementTemplateTwoLabel,'gradebook_score_display_custom_values_endscore[' . $counter . ']');
$renderer->setElementTemplate($elementTemplateTwoLabel2,'gradebook_score_display_custom_values_displaytext[' . $counter . ']');
$form->addRule('gradebook_score_display_custom_values_endscore[' . $counter . ']', get_lang('OnlyNumbers'), 'numeric');
$form->addRule(array('gradebook_score_display_custom_values_endscore[' . $counter . ']', 'gradebook_score_display_custom_values_maxvalue'), get_lang('Over100'), 'compare', '<=');
$form->addRule(array('gradebook_score_display_custom_values_endscore[' . $counter . ']', 'gradebook_score_display_custom_values_minvalue'), get_lang('UnderMin'), 'compare', '>');
if ($customdisplays[$counter - 1]) {
$default_values['gradebook_score_display_custom_values_endscore['.$counter.']'] = $customdisplays[$counter - 1]['score'];
$default_values['gradebook_score_display_custom_values_displaytext['.$counter.']'] = $customdisplays[$counter - 1]['display'];
}
}
}
break;
*/
} }
if ($row['variable'] == 'pdf_export_watermark_enable') { if ($row['variable'] == 'pdf_export_watermark_enable') {
@ -1392,13 +1275,13 @@ function generate_settings_form($settings, $settings_by_access_list) {
} }
/** /**
* Searchs a platform setting * Searchs a platform setting in all categories except from the Plugins category
* @param string $search * @param string $search
* @return array * @return array
*/ */
function search_setting($search) { function search_setting($search) {
$table_settings_current = Database :: get_main_table(TABLE_MAIN_SETTINGS_CURRENT); $table_settings_current = Database :: get_main_table(TABLE_MAIN_SETTINGS_CURRENT);
$sql = "SELECT * FROM $table_settings_current GROUP BY variable ORDER BY id ASC "; $sql = "SELECT * FROM $table_settings_current WHERE category <> 'Plugins' GROUP BY variable ORDER BY id ASC ";
$result = Database::store_result(Database::query($sql), 'ASSOC'); $result = Database::store_result(Database::query($sql), 'ASSOC');
$settings = array(); $settings = array();

@ -107,6 +107,7 @@ if (!empty($_GET['category']) && !in_array($_GET['category'], array('Plugins', '
$row['subkey'] = 0; $row['subkey'] = 0;
if (empty($row['category'])) if (empty($row['category']))
$row['category'] = 0; $row['category'] = 0;
// One more validation if is changeable. // One more validation if is changeable.
if ($row['access_url_changeable'] == 1) if ($row['access_url_changeable'] == 1)
$settings_by_access_list[ $row['variable'] ] [ $row['subkey'] ] [ $row['category'] ] = $row; $settings_by_access_list[ $row['variable'] ] [ $row['subkey'] ] [ $row['category'] ] = $row;

@ -22,7 +22,7 @@ $interbreadcrumb[] = array ('url' => 'specific_fields.php', 'name' => get_lang('
$libpath = api_get_path(LIBRARY_PATH); $libpath = api_get_path(LIBRARY_PATH);
require_once $libpath.'sortabletable.class.php'; require_once $libpath.'sortable_table.class.php';
include_once $libpath.'specific_fields_manager.lib.php'; include_once $libpath.'specific_fields_manager.lib.php';
// Create an add-field box // Create an add-field box

@ -5,7 +5,7 @@
$language_file = 'admin'; $language_file = 'admin';
$cidReset = true; $cidReset = true;
require_once '../inc/global.inc.php'; require_once '../inc/global.inc.php';
require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php'; require_once api_get_path(LIBRARY_PATH).'sortable_table.class.php';
require_once 'sub_language.class.php'; require_once 'sub_language.class.php';
require_once api_get_path(LIBRARY_PATH).'array.lib.php'; require_once api_get_path(LIBRARY_PATH).'array.lib.php';
$this_section=SECTION_PLATFORM_ADMIN; $this_section=SECTION_PLATFORM_ADMIN;

@ -35,15 +35,18 @@ api_block_anonymous_users();
define('MODULE_HELP_NAME', 'Settings'); define('MODULE_HELP_NAME', 'Settings');
define('COURSE_CHANGE_PROPERTIES', 'COURSE_CHANGE_PROPERTIES'); define('COURSE_CHANGE_PROPERTIES', 'COURSE_CHANGE_PROPERTIES');
$TABLECOURSE = Database :: get_main_table(TABLE_MAIN_COURSE);
$TABLEFACULTY = Database :: get_main_table(TABLE_MAIN_CATEGORY);
$TABLELANGUAGES = Database :: get_main_table(TABLE_MAIN_LANGUAGE);
$currentCourseRepository = $_course['path']; $currentCourseRepository = $_course['path'];
$is_allowedToEdit = $is_courseAdmin || $is_platformAdmin; $is_allowedToEdit = $is_courseAdmin || $is_platformAdmin;
$course_code = $_course['sysCode']; $course_code = $_course['sysCode'];
$course_access_settings = CourseManager :: get_access_settings($course_code); $course_access_settings = CourseManager :: get_access_settings($course_code);
$video_conference_enabled = false;
if (api_get_setting('bbb_plugin') == 'true') {
$video_conference_enabled = true;
}
//LOGIC FUNCTIONS //LOGIC FUNCTIONS
function is_settings_editable() { function is_settings_editable() {
return $GLOBALS['course_info_is_editable']; return $GLOBALS['course_info_is_editable'];
@ -245,27 +248,6 @@ $form->addElement('style_submit_button', null, get_lang('SaveSettings'), 'class=
$form->addElement('html', '</div></div>'); $form->addElement('html', '</div></div>');
// Gradebook SETTINGS
//$form->addElement('html', '<div><h3>'.Display::return_icon('gradebook.png', Security::remove_XSS(get_lang('Gradebook')),'',ICON_SIZE_SMALL).' '.Security::remove_XSS(get_lang('Gradebook')).'</h3><div>');
/*$group = array();
$models = api_get_settings_options('grading_model');
if (!empty($models )) {
foreach ($models as $option) {
$grading_parsed = api_grading_model_functions($option['value'], 'decorate');
$element = $form->createElement('radio', 'course_grading_model', '', $option['display_text'].': '.$grading_parsed, $option['id']);
$group[] = $element;
}
}
$element = $form->createElement('radio', 'course_grading_model', '', get_lang('None'), 0);
$group[] = $element;
$form->addGroup($group, '', array(get_lang('GradingModelTitle')), '', 'li', false);
$form->addElement('style_submit_button', null, get_lang('SaveSettings'), 'class="save"');
$form->addElement('html', '</div></div>');*/
// USER RIGHTS // USER RIGHTS
$form->addElement('html', '<div> <h3>'.Display::return_icon('user.png', Security::remove_XSS(get_lang('UserRights')),'',ICON_SIZE_SMALL).' '.Security::remove_XSS(get_lang('UserRights')).'</h3><div>'); $form->addElement('html', '<div> <h3>'.Display::return_icon('user.png', Security::remove_XSS(get_lang('UserRights')),'',ICON_SIZE_SMALL).' '.Security::remove_XSS(get_lang('UserRights')).'</h3><div>');
@ -290,7 +272,6 @@ $group[]=$form->createElement('radio', 'allow_user_view_user_list', null, get_la
$form->addGroup($group, '', array(get_lang("AllowUserViewUserList")), ''); $form->addGroup($group, '', array(get_lang("AllowUserViewUserList")), '');
$form->addElement('style_submit_button', null, get_lang('SaveSettings'), 'class="save"'); $form->addElement('style_submit_button', null, get_lang('SaveSettings'), 'class="save"');
$form->addElement('html', '</div></div>'); $form->addElement('html', '</div></div>');
@ -355,11 +336,44 @@ $form->addElement('style_submit_button', null, get_lang('SaveSettings'), 'class=
$form->addElement('html', '</div></div>'); $form->addElement('html', '</div></div>');
// BBB SETTINGS
if ($video_conference_enabled) {
$form->addElement('html', '<div><h3>'.Display::return_icon('visio.png', Security::remove_XSS(get_lang('VideoConferenceSettings')),'', ICON_SIZE_SMALL).' '.Security::remove_XSS(get_lang('VideoConferenceSettings')).'</h3><div>');
// $form->add_textfield('big_blue_button_welcome_message', get_lang('big_blue_button_welcome_message'), false, array('class' => 'span5'));
/* $form->add_textfield('big_blue_button_meeting_name', get_lang('big_blue_button_meeting_name'), false, array('class' => 'span5'));
$form->add_textfield('big_blue_button_attendee_password', get_lang('big_blue_button_attendee_password'), false, array('class' => 'span5'));
$form->add_textfield('big_blue_button_moderator_password', get_lang('big_blue_button_moderator_password'), false, array('class' => 'span5'));
$form->addElement('checkbox', 'big_blue_button_open_new_window', array(null, null, get_lang('big_blue_button_open_new_window')), null);
$form->addElement('checkbox', 'big_blue_button_student_must_wait_until_moderator', array(null, null, get_lang('big_blue_button_student_must_wait_until_moderator')), null);
$form->addElement('datepicker', 'big_blue_button_join_start_date', array(get_lang('big_blue_button_join_start_date')), null);
$form->addElement('datepicker', 'big_blue_button_join_end_date', array(get_lang('big_blue_button_join_end_date')), null);*/
$form->add_textfield('big_blue_button_max_students_allowed', get_lang('big_blue_button_max_students_allowed'), false, array('class' => 'span5'));
$form->addElement('checkbox', 'big_blue_button_record_and_store', array(null, null, get_lang('big_blue_button_record_and_store')), null);
$form->addElement('style_submit_button', null, get_lang('SaveSettings'), 'class="save"');
$form->addElement('html', '</div></div>');
}
// Get all the course information // Get all the course information
$all_course_information = CourseManager::get_course_information($_course['sysCode']); $all_course_information = CourseManager::get_course_information($_course['sysCode']);
// Set the default values of the form // Set the default values of the form
$values = array();
$values['title'] = $_course['name']; $values['title'] = $_course['name'];
//$values['visual_code'] = $_course['official_code']; //$values['visual_code'] = $_course['official_code'];
@ -376,8 +390,6 @@ $values['course_registration_password'] = $all_course_information['registration_
$values['legal'] = $all_course_information['legal']; $values['legal'] = $all_course_information['legal'];
$values['activate_legal'] = $all_course_information['activate_legal']; $values['activate_legal'] = $all_course_information['activate_legal'];
// Get send_mail_setting (auth)from table // Get send_mail_setting (auth)from table
$values['email_alert_to_teacher_on_new_user_in_course']= api_get_course_setting('email_alert_to_teacher_on_new_user_in_course'); $values['email_alert_to_teacher_on_new_user_in_course']= api_get_course_setting('email_alert_to_teacher_on_new_user_in_course');
// Get send_mail_setting (work)from table // Get send_mail_setting (work)from table
@ -405,24 +417,44 @@ $values['display_info_advance_inside_homecourse'] = api_get_course_setting('di
$values['email_alert_students_on_new_homework'] = api_get_course_setting('email_alert_students_on_new_homework'); $values['email_alert_students_on_new_homework'] = api_get_course_setting('email_alert_students_on_new_homework');
$values['enable_lp_auto_launch'] = api_get_course_setting('enable_lp_auto_launch'); $values['enable_lp_auto_launch'] = api_get_course_setting('enable_lp_auto_launch');
$values['pdf_export_watermark_text'] = api_get_course_setting('pdf_export_watermark_text'); $values['pdf_export_watermark_text'] = api_get_course_setting('pdf_export_watermark_text');
//$values['course_grading_model'] = api_get_course_setting('course_grading_model'); if ($video_conference_enabled) {
$values['big_blue_button_welcome_message'] = api_get_course_setting('big_blue_button_welcome_message');
$values['big_blue_button_max_students_allowed'] = api_get_course_setting('big_blue_button_max_students_allowed');
/*$values['big_blue_button_meeting_name'] = api_get_course_setting('big_blue_button_meeting_name');
$values['big_blue_button_attendee_password'] = api_get_course_setting('big_blue_button_attendee_password');
$values['big_blue_button_moderator_password'] = api_get_course_setting('big_blue_button_moderator_password');
$values['big_blue_button_open_new_window'] = api_get_course_setting('big_blue_button_open_new_window');
$values['big_blue_button_student_must_wait_until_moderator'] = api_get_course_setting('big_blue_button_student_must_wait_until_moderator');
$start_date = api_get_course_setting('big_blue_button_join_start_date');
if (empty($start_date)) {
$start_date = date('Y-m-d 12:00:00');
}
$values['big_blue_button_join_start_date'] = $start_date;
$end_date = api_get_course_setting('big_blue_button_join_end_date');
if (empty($end_date)) {
$end_date = date('Y-m-d 18:00:00');
}
$values['big_blue_button_join_end_date'] = $end_date;
*/
$values['big_blue_button_record_and_store'] = api_get_course_setting('big_blue_button_record_and_store');
}
$form->setDefaults($values); $form->setDefaults($values);
// Validate form // Validate form
if ($form->validate() && is_settings_editable()) { if ($form->validate() && is_settings_editable()) {
$update_values = $form->exportValues(); $update_values = $form->exportValues();
/*
// update course picture
$picture = $_FILES['picture'];
if (!empty($picture['name'])) {
$picture_uri = CourseManager::update_course_picture($course_code, $picture['name'], $picture['tmp_name']);
}*/
$pdf_export_watermark_path = $_FILES['pdf_export_watermark_path']; $pdf_export_watermark_path = $_FILES['pdf_export_watermark_path'];
@ -439,8 +471,6 @@ if ($form->validate() && is_settings_editable()) {
$update_values[$index] = Database::escape_string($value); $update_values[$index] = Database::escape_string($value);
} }
unset($value); unset($value);
//visual_code = '".$update_values['visual_code']."',
//tutor_name = '".$update_values['tutor_name']."',
$table_course = Database :: get_main_table(TABLE_MAIN_COURSE); $table_course = Database :: get_main_table(TABLE_MAIN_COURSE);
$sql = "UPDATE $table_course SET $sql = "UPDATE $table_course SET
title = '".$update_values['title']."', title = '".$update_values['title']."',
@ -457,10 +487,30 @@ if ($form->validate() && is_settings_editable()) {
WHERE code = '".$course_code."'"; WHERE code = '".$course_code."'";
Database::query($sql); Database::query($sql);
if ($video_conference_enabled) {
/*
if (isset($update_values['big_blue_button_open_new_window']) && $update_values['big_blue_button_open_new_window']) {
$update_values['big_blue_button_open_new_window'] = 1;
} else {
$update_values['big_blue_button_open_new_window'] = 0;
}
if (isset($update_values['big_blue_button_student_must_wait_until_moderator']) && $update_values['big_blue_button_student_must_wait_until_moderator']) {
$update_values['big_blue_button_student_must_wait_until_moderator'] = 1;
} else {
$update_values['big_blue_button_student_must_wait_until_moderator'] = 0;
}
*/
if (isset($update_values['big_blue_button_record_and_store']) && $update_values['big_blue_button_record_and_store']) {
$update_values['big_blue_button_record_and_store'] = 1;
} else {
$update_values['big_blue_button_record_and_store'] = 0;
}
}
// Update course_settings table - this assumes those records exist, otherwise triggers an error // Update course_settings table - this assumes those records exist, otherwise triggers an error
$table_course_setting = Database::get_course_table(TABLE_COURSE_SETTING); $table_course_setting = Database::get_course_table(TABLE_COURSE_SETTING);
foreach($update_values as $key =>$value) { foreach ($update_values as $key =>$value) {
//We do not update variables that were already saved in the TABLE_MAIN_COURSE table //We do not update variables that were already saved in the TABLE_MAIN_COURSE table
if (!in_array($key, $update_in_course_table)) { if (!in_array($key, $update_in_course_table)) {
Database::update($table_course_setting, array('value' => $update_values[$key]), array('variable = ? AND c_id = ?' => array($key, api_get_course_int_id()), true)); Database::update($table_course_setting, array('value' => $update_values[$key]), array('variable = ? AND c_id = ?' => array($key, api_get_course_int_id()), true));
@ -488,7 +538,7 @@ echo '<script>
$(function() { $(function() {
$("#course_settings").accordion({ $("#course_settings").accordion({
autoHeight: false, autoHeight: false,
header: "div> h3" header: "div > h3"
}); });
}); });
</script>'; </script>';

@ -320,4 +320,26 @@ class Course
} }
$this->encoding = api_get_system_encoding(); $this->encoding = api_get_system_encoding();
} }
/**
* Serialize the course with the best serializer available
*/
public static function serialize($course) {
if (extension_loaded('igbinary')) {
return igbinary_serialize($course);
} else {
return serialize($course);
}
}
/**
* Unserialize the course with the best serializer available
*/
public static function unserialize($course) {
if (extension_loaded('igbinary')) {
return igbinary_unserialize($course);
} else {
return unserialize($course);
}
}
} }

@ -153,7 +153,7 @@ class CourseSelectForm
$course->resources['document']= null; $course->resources['document']= null;
} }
echo '<input type="hidden" name="course" value="'.base64_encode(serialize($course)).'"/>'; echo '<input type="hidden" name="course" value="'.base64_encode(Course::serialize($course)).'"/>';
if (is_array($hidden_fields)) { if (is_array($hidden_fields)) {
foreach ($hidden_fields as $key => $value) { foreach ($hidden_fields as $key => $value) {
@ -218,7 +218,7 @@ class CourseSelectForm
* in the form given by display_form(...) * in the form given by display_form(...)
*/ */
function get_posted_course($from='', $session_id = 0, $course_code = '') { function get_posted_course($from='', $session_id = 0, $course_code = '') {
$course = unserialize(base64_decode($_POST['course'])); $course = Course::unserialize(base64_decode($_POST['course']));
//Create the resource DOCUMENT objects //Create the resource DOCUMENT objects
//Loading the results from the checkboxes of the javascript //Loading the results from the checkboxes of the javascript
@ -432,7 +432,7 @@ class CourseSelectForm
// this is a known issue of serialize // this is a known issue of serialize
$course->resources['document']= null; $course->resources['document']= null;
} }
echo '<input type="hidden" name="course" value="'.base64_encode(serialize($course)).'"/>'; echo '<input type="hidden" name="course" value="'.base64_encode(Course::serialize($course)).'"/>';
if (is_array($hidden_fields)) { if (is_array($hidden_fields)) {
foreach ($hidden_fields as $key => $value) { foreach ($hidden_fields as $key => $value) {
echo "\n"; echo "\n";

@ -201,7 +201,7 @@ class FillBlanks extends Question
$objAnswer->save(); $objAnswer->save();
} }
function return_header($feedback_type, $counter = null) { function return_header($feedback_type = null, $counter = null) {
parent::return_header($feedback_type, $counter); parent::return_header($feedback_type, $counter);
$header = '<table width="100%" class="data_table_exercise_result_left"> $header = '<table width="100%" class="data_table_exercise_result_left">
<tr> <tr>

@ -58,7 +58,7 @@ class FreeAnswer extends Question {
$this->save(); $this->save();
} }
function return_header($feedback_type, $counter = null) { function return_header($feedback_type = null, $counter = null) {
parent::return_header($feedback_type, $counter); parent::return_header($feedback_type, $counter);
$header = '<table width="100%" class="data_table_exercise_result_left" > $header = '<table width="100%" class="data_table_exercise_result_left" >
<tr> <tr>

@ -244,7 +244,7 @@ class Matching extends Question {
$this->save(); $this->save();
} }
function return_header($feedback_type, $counter = null) { function return_header($feedback_type = null, $counter = null) {
parent::return_header($feedback_type, $counter); parent::return_header($feedback_type, $counter);
echo '<table width="100%" height="71" class="data_table_exercise_result_left">'; echo '<table width="100%" height="71" class="data_table_exercise_result_left">';
echo '<tr> echo '<tr>

@ -213,7 +213,7 @@ class MultipleAnswer extends Question {
$this->save(); $this->save();
} }
function return_header($feedback_type, $counter = null) { function return_header($feedback_type = null, $counter = null) {
parent::return_header($feedback_type, $counter); parent::return_header($feedback_type, $counter);
$header = '<table width="100%" class="data_table_exercise_result"> $header = '<table width="100%" class="data_table_exercise_result">
<tr> <tr>

@ -218,7 +218,7 @@ class MultipleAnswerCombination extends Question {
$this -> save(); $this -> save();
} }
function return_header($feedback_type, $counter = null) { function return_header($feedback_type = null, $counter = null) {
parent::return_header($feedback_type, $counter); parent::return_header($feedback_type, $counter);
$header = '<table width="100%" class="data_table_exercise_result"> $header = '<table width="100%" class="data_table_exercise_result">
<tr> <tr>

@ -283,7 +283,7 @@ class MultipleAnswerTrueFalse extends Question {
$this -> save(); $this -> save();
} }
function return_header($feedback_type, $counter = null) { function return_header($feedback_type = null, $counter = null) {
$header = ""; $header = "";
if ($in_echo == 1) { if ($in_echo == 1) {
parent::return_header($feedback_type, $counter, $in_echo); parent::return_header($feedback_type, $counter, $in_echo);

@ -56,7 +56,7 @@ class OralExpression extends Question {
$this->save(); $this->save();
} }
function return_header($feedback_type, $counter = null) { function return_header($feedback_type = null, $counter = null) {
parent::return_header($feedback_type, $counter); parent::return_header($feedback_type, $counter);
$header = '<table width="100%" border="0" cellspacing="3" cellpadding="3"> $header = '<table width="100%" border="0" cellspacing="3" cellpadding="3">
<tr> <tr>

@ -356,7 +356,7 @@ class UniqueAnswer extends Question {
$this -> save(); $this -> save();
} }
function return_header($feedback_type, $counter = null) { function return_header($feedback_type = null, $counter = null) {
parent::return_header($feedback_type, $counter); parent::return_header($feedback_type, $counter);
$header = '<table width="100%" class="data_table_exercise_result"> $header = '<table width="100%" class="data_table_exercise_result">
<tr> <tr>

@ -406,7 +406,7 @@ class UniqueAnswerNoOption extends Question {
$this -> save(); $this -> save();
} }
function return_header($feedback_type, $counter = null) { function return_header($feedback_type = null, $counter = null) {
parent::return_header($feedback_type, $counter); parent::return_header($feedback_type, $counter);
$header = '<table width="100%" class="data_table_exercise_result"> $header = '<table width="100%" class="data_table_exercise_result">
<tr> <tr>

@ -10,7 +10,7 @@
$language_file = 'gradebook'; $language_file = 'gradebook';
//$cidReset = true; //$cidReset = true;
require_once '../inc/global.inc.php'; require_once '../inc/global.inc.php';
require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php'; require_once api_get_path(LIBRARY_PATH).'sortable_table.class.php';
require_once 'lib/be.inc.php'; require_once 'lib/be.inc.php';
require_once 'lib/gradebook_functions.inc.php'; require_once 'lib/gradebook_functions.inc.php';
require_once 'lib/fe/evalform.class.php'; require_once 'lib/fe/evalform.class.php';

@ -10,7 +10,7 @@
$language_file = 'gradebook'; $language_file = 'gradebook';
//$cidReset = true; //$cidReset = true;
require_once '../inc/global.inc.php'; require_once '../inc/global.inc.php';
require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php'; require_once api_get_path(LIBRARY_PATH).'sortable_table.class.php';
require_once 'lib/be.inc.php'; require_once 'lib/be.inc.php';
require_once 'lib/gradebook_functions.inc.php'; require_once 'lib/gradebook_functions.inc.php';
require_once 'lib/fe/evalform.class.php'; require_once 'lib/fe/evalform.class.php';

@ -205,12 +205,10 @@ function build_edit_icons_cat($cat, $selectcat) {
$visibility_icon= ($cat->is_visible() == 0) ? 'invisible' : 'visible'; $visibility_icon= ($cat->is_visible() == 0) ? 'invisible' : 'visible';
$visibility_command= ($cat->is_visible() == 0) ? 'set_visible' : 'set_invisible'; $visibility_command= ($cat->is_visible() == 0) ? 'set_visible' : 'set_invisible';
if (empty($grade_model_id) || $grade_model_id == -1) { $modify_icons .= '<a class="view_children" data-cat-id="'.$cat->get_id().'" href="javascript:void(0);">'.Display::return_icon('view_more_stats.gif', get_lang('Show'),'',ICON_SIZE_SMALL).'</a>';
$modify_icons= '<a href="gradebook_edit_cat.php?editcat='.$cat->get_id().'&amp;cidReq='.$cat->get_course_code().'">'.Display::return_icon('edit.png', get_lang('Modify'),'',ICON_SIZE_SMALL).'</a>';
}
if (!empty($grade_model_id) && $grade_model_id != -1) { if (empty($grade_model_id) || $grade_model_id == -1) {
$modify_icons= '<a class="view_children" data-cat-id="'.$cat->get_id().'" href="javascript:void(0);">'.Display::return_icon('view_more_stats.gif', get_lang('Show'),'',ICON_SIZE_SMALL).'</a>'; $modify_icons .= '<a href="gradebook_edit_cat.php?editcat='.$cat->get_id().'&amp;cidReq='.$cat->get_course_code().'">'.Display::return_icon('edit.png', get_lang('Modify'),'',ICON_SIZE_SMALL).'</a>';
} }
$modify_icons .= '&nbsp;<a href="' . api_get_self() . '?visiblecat=' . $cat->get_id() . '&amp;' . $visibility_command . '=&amp;selectcat=' . $selectcat . ' ">'.Display::return_icon($visibility_icon.'.png', get_lang('Visible'),'',ICON_SIZE_SMALL).'</a>'; $modify_icons .= '&nbsp;<a href="' . api_get_self() . '?visiblecat=' . $cat->get_id() . '&amp;' . $visibility_command . '=&amp;selectcat=' . $selectcat . ' ">'.Display::return_icon($visibility_icon.'.png', get_lang('Visible'),'',ICON_SIZE_SMALL).'</a>';

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -195,7 +195,7 @@ switch ($action) {
break; break;
case 'get_sessions': case 'get_sessions':
$columns = array('name', 'nbr_courses','category_name', 'date_start','date_end', 'coach_name', 'session_active', 'visibility'); $columns = array('name', 'nbr_courses', 'nbr_users', 'category_name', 'date_start','date_end', 'coach_name', 'session_active', 'visibility');
$result = SessionManager::get_sessions_admin(array('where'=> $where_condition, 'order'=>"$sidx $sord", 'limit'=> "$start , $limit")); $result = SessionManager::get_sessions_admin(array('where'=> $where_condition, 'order'=>"$sidx $sord", 'limit'=> "$start , $limit"));
break; break;
case 'get_timelines': case 'get_timelines':

@ -8,7 +8,6 @@
*/ */
$firstExpirationDelay = 31536000; // <- 86400*365 // 60*60*24 = 1 jour = 86400 $firstExpirationDelay = 31536000; // <- 86400*365 // 60*60*24 = 1 jour = 86400
//$defaultVisibilityForANewCourse = 2; //Variable is no longer used. Use the platform setting: courses_default_creation_visibility
$prefixAntiNumber = 'z'; $prefixAntiNumber = 'z';
$DEBUG = false; $DEBUG = false;

@ -106,7 +106,7 @@ require_once $lib_path.'events.lib.inc.php';
//require_once $lib_path.'rights.lib.php'; moved to autoload //require_once $lib_path.'rights.lib.php'; moved to autoload
require_once $lib_path.'model.lib.php'; require_once $lib_path.'model.lib.php';
//require_once $lib_path.'sortabletable.class.php'; moved to autoload //require_once $lib_path.'sortable_table.class.php'; moved to autoload
require_once $lib_path.'usermanager.lib.php'; require_once $lib_path.'usermanager.lib.php';
require_once $lib_path.'message.lib.php'; require_once $lib_path.'message.lib.php';
require_once $lib_path.'social.lib.php'; require_once $lib_path.'social.lib.php';

@ -283,7 +283,7 @@ function get_course_tables() {
/** /**
* Creates all the necessary tables for a new course * Creates all the necessary tables for a new course
*/ */
function update_Db_course($course_db_name = null) { function update_db_course($course_db_name = null) {
global $_configuration; global $_configuration;
$charset_clause = ' DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci'; $charset_clause = ' DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci';
@ -2242,32 +2242,21 @@ function fill_Db_course($course_id, $course_repository, $language, $default_docu
if (is_null($fill_with_exemplary_content)) { if (is_null($fill_with_exemplary_content)) {
$fill_with_exemplary_content = api_get_setting('example_material_course_creation') != 'false'; $fill_with_exemplary_content = api_get_setting('example_material_course_creation') != 'false';
} }
global $_configuration, $_user; global $_configuration;
$course_id = intval($course_id); $course_id = intval($course_id);
if (empty($course_id)) { if (empty($course_id)) {
return false; return false;
} }
$tbl_course_homepage = Database::get_course_table(TABLE_TOOL_LIST); $tbl_course_homepage = Database::get_course_table(TABLE_TOOL_LIST);
$TABLEINTROS = Database::get_course_table(TABLE_TOOL_INTRO); $TABLEINTROS = Database::get_course_table(TABLE_TOOL_INTRO);
$TABLEGROUPS = Database::get_course_table(TABLE_GROUP);
$TABLEGROUPCATEGORIES = Database::get_course_table(TABLE_GROUP_CATEGORY); $TABLEGROUPCATEGORIES = Database::get_course_table(TABLE_GROUP_CATEGORY);
$TABLEGROUPUSER = Database::get_course_table(TABLE_GROUP_USER);
$TABLEITEMPROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY); $TABLEITEMPROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
$TABLETOOLCOURSEDESC = Database::get_course_table(TABLE_COURSE_DESCRIPTION);
$TABLETOOLAGENDA = Database::get_course_table(TABLE_AGENDA); $TABLETOOLAGENDA = Database::get_course_table(TABLE_AGENDA);
$TABLETOOLANNOUNCEMENTS = Database::get_course_table(TABLE_ANNOUNCEMENT); $TABLETOOLANNOUNCEMENTS = Database::get_course_table(TABLE_ANNOUNCEMENT);
$TABLEADDEDRESOURCES = Database::get_course_table(TABLE_LINKED_RESOURCES);
$TABLETOOLWORKS = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
$TABLETOOLDOCUMENT = Database::get_course_table(TABLE_DOCUMENT); $TABLETOOLDOCUMENT = Database::get_course_table(TABLE_DOCUMENT);
$TABLETOOLWIKI = Database::get_course_table(TABLE_WIKI);
$TABLETOOLLINK = Database::get_course_table(TABLE_LINK); $TABLETOOLLINK = Database::get_course_table(TABLE_LINK);
$TABLEQUIZ = Database::get_course_table(TABLE_QUIZ_TEST); $TABLEQUIZ = Database::get_course_table(TABLE_QUIZ_TEST);
$TABLEQUIZQUESTION = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION); $TABLEQUIZQUESTION = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
$TABLEQUIZQUESTIONLIST = Database::get_course_table(TABLE_QUIZ_QUESTION); $TABLEQUIZQUESTIONLIST = Database::get_course_table(TABLE_QUIZ_QUESTION);
@ -2403,7 +2392,7 @@ function fill_Db_course($course_id, $course_repository, $language, $default_docu
// FILL THE COURSE DOCUMENT WITH DEFAULT COURSE PICTURES // FILL THE COURSE DOCUMENT WITH DEFAULT COURSE PICTURES
$sys_course_path = api_get_path(SYS_COURSE_PATH); $sys_course_path = api_get_path(SYS_COURSE_PATH);
if (is_array($default_document_array) && count($default_document_array)>0) { if (is_array($default_document_array) && count($default_document_array) > 0) {
foreach ($default_document_array as $media_type => $array_media) { foreach ($default_document_array as $media_type => $array_media) {
if ($media_type == 'images') { if ($media_type == 'images') {
$path_documents = '/images/gallery/'; $path_documents = '/images/gallery/';
@ -2513,9 +2502,7 @@ function fill_Db_course($course_id, $course_repository, $language, $default_docu
VALUES ( '.$course_id.', '1', '".lang2db(get_lang('SocraticIrony')) . "', '".lang2db(get_lang('ManyAnswers')) . "', '10', '1', '2','',1)"); VALUES ( '.$course_id.', '1', '".lang2db(get_lang('SocraticIrony')) . "', '".lang2db(get_lang('ManyAnswers')) . "', '10', '1', '2','',1)");
Database::query("INSERT INTO $TABLEQUIZQUESTION (c_id, question_id, exercice_id, question_order) VALUES ('.$course_id.', 1,1,1)"); Database::query("INSERT INTO $TABLEQUIZQUESTION (c_id, question_id, exercice_id, question_order) VALUES ('.$course_id.', 1,1,1)");
/* /* Forum tool */
Forum tool
*/
Database::query("INSERT INTO $TABLEFORUMCATEGORIES VALUES ($course_id, 1,'".lang2db(get_lang('ExampleForumCategory'))."', '', 1, 0, 0)"); Database::query("INSERT INTO $TABLEFORUMCATEGORIES VALUES ($course_id, 1,'".lang2db(get_lang('ExampleForumCategory'))."', '', 1, 0, 0)");
$insert_id = Database :: insert_id(); $insert_id = Database :: insert_id();
@ -2535,16 +2522,16 @@ function fill_Db_course($course_id, $course_repository, $language, $default_docu
VALUES ($course_id, 'forum_thread',1,NOW(),NOW(),$insert_id,'ForumThreadAdded',1,0,NULL,1)"); VALUES ($course_id, 'forum_thread',1,NOW(),NOW(),$insert_id,'ForumThreadAdded',1,0,NULL,1)");
Database::query("INSERT INTO $TABLEFORUMPOSTS VALUES ($course_id, 1, '".lang2db(get_lang('ExampleThread'))."', '".lang2db(get_lang('ExampleThreadContent'))."', 1, 1, 1, '', NOW(), 0, 0, 1)"); Database::query("INSERT INTO $TABLEFORUMPOSTS VALUES ($course_id, 1, '".lang2db(get_lang('ExampleThread'))."', '".lang2db(get_lang('ExampleThreadContent'))."', 1, 1, 1, '', NOW(), 0, 0, 1)");
} }
// PLUGINS - if an installed plugin has a course_install.php file, execute it // PLUGINS - if an installed plugin has a course_install.php file, execute it
$installed_plugins = api_get_settings('Plugins','list',$_configuration['access_url']); $installed_plugins = api_get_settings('Plugins','list', $_configuration['access_url']);
$shortlist_installed = array(); $shortlist_installed = array();
foreach ($installed_plugins as $plugin) { foreach ($installed_plugins as $plugin) {
$shortlist_installed[] = $plugin['subkey']; $shortlist_installed[] = $plugin['subkey'];
} }
$shortlist_installed = array_flip(array_flip($shortlist_installed)); $shortlist_installed = array_flip(array_flip($shortlist_installed));
foreach ($shortlist_installed as $plugin) { foreach ($shortlist_installed as $plugin) {
$pluginpath = api_get_path(SYS_PLUGIN_PATH).$plugin.'/course_install.php'; $pluginpath = api_get_path(SYS_PLUGIN_PATH).$plugin.'/course_install.php';
if (is_file($pluginpath) && is_readable($pluginpath)) { if (is_file($pluginpath) && is_readable($pluginpath)) {

@ -13,6 +13,7 @@ require_once 'fckeditor/fckeditor.php';
define ('CAREER_STATUS_ACTIVE', 1); define ('CAREER_STATUS_ACTIVE', 1);
define ('CAREER_STATUS_INACTIVE',0); define ('CAREER_STATUS_INACTIVE',0);
/** /**
* @package chamilo.library * @package chamilo.library
*/ */
@ -162,7 +163,6 @@ class Career extends Model {
return $cid; return $cid;
} }
public function save($params) { public function save($params) {
$id = parent::save($params); $id = parent::save($params);
if (!empty($id)) { if (!empty($id)) {
@ -175,5 +175,4 @@ class Career extends Model {
parent::delete($id); parent::delete($id);
event_system(LOG_CAREER_DELETE, LOG_CAREER_ID, $id, api_get_utc_datetime(), api_get_user_id()); event_system(LOG_CAREER_DELETE, LOG_CAREER_ID, $id, api_get_utc_datetime(), api_get_user_id());
} }
} }

@ -1174,7 +1174,7 @@ class Database {
} }
$sql = "SELECT $clean_columns FROM $table_name $conditions"; $sql = "SELECT $clean_columns FROM $table_name $conditions";
///var_dump($sql); //var_dump($sql);
$result = self::query($sql); $result = self::query($sql);
$array = array(); $array = array();
//if (self::num_rows($result) > 0 ) { //if (self::num_rows($result) > 0 ) {
@ -1338,7 +1338,7 @@ class Database {
//Parsing and cleaning the where conditions //Parsing and cleaning the where conditions
$where_return = self::parse_where_conditions($where_conditions); $where_return = self::parse_where_conditions($where_conditions);
$sql = "UPDATE $table_name SET $update_sql $where_return "; $sql = "UPDATE $table_name SET $update_sql $where_return ";
if ($show_query) { echo $sql; echo '<br />'; } if ($show_query) { var_dump($sql); }
$result = self::query($sql); $result = self::query($sql);
$affected_rows = self::affected_rows(); $affected_rows = self::affected_rows();
return $affected_rows; return $affected_rows;

@ -20,6 +20,31 @@
/* FUNCTIONS */ /* FUNCTIONS */
class Link extends Model {
var $table;
var $is_course_model = true;
var $columns = array('id', 'c_id','url','title','description','category_id', 'display_order', 'on_homepage', 'target', 'session_id');
var $required = array('url', 'title');
public function __construct() {
$this->table = Database::get_course_table(TABLE_LINK);
}
public function save($params) {
$course_info = api_get_course_info();
$params['session_id'] = api_get_session_id();
$params['category_id'] = isset($params['category_id']) ? $params['category_id'] : 0;
$id = parent::save($params);
if (!empty($id)) {
api_item_property_update($course_info, TOOL_LINK, $id, 'LinkAdded', api_get_user_id());
}
return $id;
}
}
/** /**
* Used to add a link or a category * Used to add a link or a category
* @param string $type, "link" or "category" * @param string $type, "link" or "category"

@ -4223,8 +4223,7 @@ function & api_get_settings($cat = null, $ordering = 'list', $access_url = 1, $u
$where_condition = " AND access_url_changeable= '1' "; $where_condition = " AND access_url_changeable= '1' ";
} }
if (empty($access_url) or $access_url == -1) { $access_url = 1; } if (empty($access_url) or $access_url == -1) { $access_url = 1; }
$sql = "SELECT id, variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url, access_url_changeable " . $sql = "SELECT * FROM $t_cs WHERE access_url = $access_url $where_condition ";
" FROM $t_cs WHERE access_url = $access_url $where_condition ";
if (!empty($cat)) { if (!empty($cat)) {
$cat = Database::escape_string($cat); $cat = Database::escape_string($cat);

@ -231,7 +231,7 @@ class SessionManager {
('$today' < s.date_end AND '0000-00-00' = s.date_start) ('$today' < s.date_end AND '0000-00-00' = s.date_start)
, 1, 0) , 1, 0)
as session_active, as session_active,
s.name, nbr_courses, s.date_start, s.date_end, $coach_name, sc.name as category_name, s.visibility, u.user_id, s.id"; s.name, nbr_courses, nbr_users, s.date_start, s.date_end, $coach_name, sc.name as category_name, s.visibility, u.user_id, s.id";
$query = "$select FROM $tbl_session s $query = "$select FROM $tbl_session s
LEFT JOIN $tbl_session_category sc ON s.session_category_id = sc.id LEFT JOIN $tbl_session_category sc ON s.session_category_id = sc.id
@ -260,7 +260,6 @@ class SessionManager {
$query .= " ORDER BY ".$options['order']." LIMIT ".$options['limit']; $query .= " ORDER BY ".$options['order']." LIMIT ".$options['limit'];
// echo $query;
$result = Database::query($query); $result = Database::query($query);
$formatted_sessions = array(); $formatted_sessions = array();
if (Database::num_rows($result)) { if (Database::num_rows($result)) {
@ -302,6 +301,7 @@ class SessionManager {
$formatted_sessions[] = $session; $formatted_sessions[] = $session;
} }
} }
return $formatted_sessions; return $formatted_sessions;
} }

@ -31,9 +31,9 @@ class SkillProfile extends Model {
return $profiles; return $profiles;
} }
public function save($params) { public function save($params, $show_query = false) {
if (!empty($params)) { if (!empty($params)) {
$profile_id = parent::save($params); $profile_id = parent::save($params, $show_query);
if ($profile_id) { if ($profile_id) {
$skill_rel_profile = new SkillRelProfile(); $skill_rel_profile = new SkillRelProfile();
if (isset($params['skills'])) { if (isset($params['skills'])) {

@ -2039,7 +2039,7 @@ class UserManager {
if (api_is_allowed_to_create_course()) { if (api_is_allowed_to_create_course()) {
foreach($sessions as $enreg) { foreach($sessions as $enreg) {
$id_session = $enreg['id']; $id_session = $enreg['id'];
$personal_course_list_sql = "SELECT DISTINCT course.code, $personal_course_list_sql = "SELECT DISTINCT course.code k, course.title i,
".(api_is_western_name_order() ? "CONCAT(user.firstname,' ',user.lastname)" : "CONCAT(user.lastname,' ',user.firstname)")." t, email, course.course_language l, 1 sort, ".(api_is_western_name_order() ? "CONCAT(user.firstname,' ',user.lastname)" : "CONCAT(user.lastname,' ',user.firstname)")." t, email, course.course_language l, 1 sort,
category_code user_course_cat, date_start, date_end, session.id as id_session, session.name as session_name category_code user_course_cat, date_start, date_end, session.id as id_session, session.name as session_name
FROM $tbl_session_course_user as session_course_user FROM $tbl_session_course_user as session_course_user
@ -2066,7 +2066,7 @@ class UserManager {
foreach ($sessions as $enreg) { foreach ($sessions as $enreg) {
$id_session = $enreg['id']; $id_session = $enreg['id'];
// this query is very similar to the above query, but it will check the session_rel_course_user table if there are courses registered to our user or not // this query is very similar to the above query, but it will check the session_rel_course_user table if there are courses registered to our user or not
$personal_course_list_sql = "SELECT DISTINCT course.code CONCAT(user.lastname,' ',user.firstname) t, email, $personal_course_list_sql = "SELECT DISTINCT course.code k, course.title i, CONCAT(user.lastname,' ',user.firstname) t, email,
course.course_language l, 1 sort, category_code user_course_cat, date_start, date_end, session.id as id_session, session.name as session_name, " . course.course_language l, 1 sort, category_code user_course_cat, date_start, date_end, session.id as id_session, session.name as session_name, " .
"IF((session_course_user.id_user = 3 AND session_course_user.status=2),'2', '5') "IF((session_course_user.id_user = 3 AND session_course_user.status=2),'2', '5')
FROM $tbl_session_course_user as session_course_user FROM $tbl_session_course_user as session_course_user

@ -560,6 +560,7 @@ CREATE TABLE IF NOT EXISTS settings_current (
subkeytext varchar(255) default NULL, subkeytext varchar(255) default NULL,
access_url int unsigned not null default 1, access_url int unsigned not null default 1,
access_url_changeable int unsigned not null default 0, access_url_changeable int unsigned not null default 0,
access_url_locked int not null default 0,
PRIMARY KEY id (id), PRIMARY KEY id (id),
INDEX (access_url) INDEX (access_url)
); );

@ -1562,7 +1562,6 @@ function display_database_parameter($install_type, $parameter_name, $form_field_
if ($install_type == INSTALL_TYPE_UPDATE) { if ($install_type == INSTALL_TYPE_UPDATE) {
echo '<input type="hidden" name="'.$form_field_name.'" id="'.$form_field_name.'" value="'.api_htmlentities($parameter_value).'" />'; echo '<input type="hidden" name="'.$form_field_name.'" id="'.$form_field_name.'" value="'.api_htmlentities($parameter_value).'" />';
echo '<td>'.api_htmlentities($parameter_value)."</td>"; echo '<td>'.api_htmlentities($parameter_value)."</td>";
//echo "<td>$extra_notice</td>\n";
} else { } else {
echo '<td><input type="'.$inputtype.'" size="'.DATABASE_FORM_FIELD_DISPLAY_LENGTH.'" maxlength="'.$maxlength.'" name="'.$form_field_name.'" id="'.$form_field_name.'" value="'.api_htmlentities($parameter_value).'" />'."</td>"; echo '<td><input type="'.$inputtype.'" size="'.DATABASE_FORM_FIELD_DISPLAY_LENGTH.'" maxlength="'.$maxlength.'" name="'.$form_field_name.'" id="'.$form_field_name.'" value="'.api_htmlentities($parameter_value).'" />'."</td>";
echo "<td>$extra_notice</td>"; echo "<td>$extra_notice</td>";
@ -1685,26 +1684,6 @@ function display_database_settings_form($installType, $dbHostForm, $dbUsernameFo
} }
display_database_parameter($installType, get_lang('UserDB'), 'dbUserForm', $dbUserForm, '&nbsp;', null, 'id="optional_param4" '.$style); display_database_parameter($installType, get_lang('UserDB'), 'dbUserForm', $dbUserForm, '&nbsp;', null, 'id="optional_param4" '.$style);
} }
//Database Prefix
//display_database_parameter($installType, get_lang('DbPrefixForm'), 'dbPrefixForm', $dbPrefixForm, '', null, 'id="optional_param5" '.$style); //get_lang('DbPrefixCom')
/* Tracking is always available see #2066
*
<tr id="optional_param5" style="display:none;">
<td><?php echo get_lang('EnableTracking'); ?> </td>
<?php if ($installType == 'update'): ?>
<td><input type="hidden" name="enableTrackingForm" value="<?php echo $enableTrackingForm; ?>" /><?php echo $enableTrackingForm ? get_lang('Yes') : get_lang('No'); ?></td>
<?php else: ?>
<td>
<input class="checkbox" type="radio" name="enableTrackingForm" value="1" id="enableTracking1" <?php echo $enableTrackingForm ? 'checked="checked" ' : ''; ?>/> <label for="enableTracking1"><?php echo get_lang('Yes'); ?></label>
<input class="checkbox" type="radio" name="enableTrackingForm" value="0" id="enableTracking0" <?php echo $enableTrackingForm ? '' : 'checked="checked" '; ?>/> <label for="enableTracking0"><?php echo get_lang('No'); ?></label>
</td>
<?php endif; ?>
<td>&nbsp;</td>
</tr> */
?> ?>
<tr> <tr>
<td> <td>
@ -1883,23 +1862,6 @@ function display_configuration_settings_form($installType, $urlForm, $languageFo
//Parameter 11: institute (short) name //Parameter 11: institute (short) name
display_configuration_parameter($installType, get_lang('InstituteURL'), 'institutionUrlForm', $institutionUrlForm); display_configuration_parameter($installType, get_lang('InstituteURL'), 'institutionUrlForm', $institutionUrlForm);
/*
//old method
<tr>
<td><?php echo get_lang('EncryptUserPass'); ?> :</td>
<?php if($installType == 'update'): ?>
<td><input type="hidden" name="encryptPassForm" value="<?php echo $encryptPassForm; ?>" /><?php echo $encryptPassForm? get_lang('Yes') : get_lang('No'); ?></td>
<?php else: ?>
<td>
<input class="checkbox" type="radio" name="encryptPassForm" value="1" id="encryptPass1" <?php echo $encryptPassForm?'checked="checked" ':''; ?>/> <label for="encryptPass1"><?php echo get_lang('Yes'); ?></label>
<input class="checkbox" type="radio" name="encryptPassForm" value="0" id="encryptPass0" <?php echo $encryptPassForm?'':'checked="checked" '; ?>/> <label for="encryptPass0"><?php echo get_lang('No'); ?></label>
</td>
<?php endif; ?>
</tr>
*/
?> ?>
<tr> <tr>
<td><?php echo get_lang("EncryptMethodUserPass"); ?> :</td> <td><?php echo get_lang("EncryptMethodUserPass"); ?> :</td>
@ -2008,7 +1970,6 @@ function display_after_install_message($installType, $nbr_courses) {
* @return array|string countries list * @return array|string countries list
*/ */
function get_countries_list_from_array($combo = false) { function get_countries_list_from_array($combo = false) {
$a_countries = array( $a_countries = array(
"Afghanistan", "Albania", "Algeria", "Andorra", "Angola", "Antigua and Barbuda", "Argentina", "Armenia", "Australia", "Austria", "Azerbaijan", "Afghanistan", "Albania", "Algeria", "Andorra", "Angola", "Antigua and Barbuda", "Argentina", "Armenia", "Australia", "Austria", "Azerbaijan",
"Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bhutan", "Bolivia", "Bosnia and Herzegovina", "Botswana", "Brazil", "Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bhutan", "Bolivia", "Bosnia and Herzegovina", "Botswana", "Brazil", "Brunei", "Bulgaria", "Burkina Faso", "Burundi",
@ -2049,3 +2010,49 @@ function get_countries_list_from_array($combo = false) {
return $a_countries; return $a_countries;
} }
/**
* Lockis settings that can't be changed in other portals
*/
function locking_settings() {
$access_url_locked_settings = array(
'server_type',
'use_document_title',
'permanently_remove_deleted_files',
'account_valid_duration',
'service_visio',
'service_ppt2lp',
'wcag_anysurfer_public_pages',
'upload_extensions_list_type',
'upload_extensions_blacklist',
'upload_extensions_whitelist',
'upload_extensions_skip',
'upload_extensions_replace_by',
'hide_dltt_markup',
'split_users_upload_directory',
'permissions_for_new_directories',
'permissions_for_new_files',
'platform_charset',
'service_visio',
'ldap_description',
'cas_activate',
'cas_server',
'cas_server_uri',
'cas_port',
'cas_protocol',
'cas_add_user_activate',
'update_user_info_cas_with_ldap',
'languagePriority1',
'languagePriority2',
'languagePriority3',
'languagePriority4',
'login_is_email',
'chamilo_database_version'
);
$table = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT);
foreach ($access_url_locked_settings as $setting) {
$sql = "UPDATE $table SET access_url_locked = 1 WHERE variable = '$setting'";
Database::query($sql);
}
}

@ -117,7 +117,7 @@ load_main_database($installation_settings);
//Adds the c_XXX courses tables see #3910 //Adds the c_XXX courses tables see #3910
require_once api_get_path(LIBRARY_PATH).'add_course.lib.inc.php'; require_once api_get_path(LIBRARY_PATH).'add_course.lib.inc.php';
update_Db_course(); update_db_course();
load_database_script('db_stats.sql'); load_database_script('db_stats.sql');
@ -125,3 +125,5 @@ $track_countries_table = "track_c_countries";
fill_track_countries_table($track_countries_table); fill_track_countries_table($track_countries_table);
load_database_script('db_user.sql'); load_database_script('db_user.sql');
locking_settings();

@ -189,6 +189,9 @@ ALTER TABLE gradebook_evaluation MODIFY COLUMN weight FLOAT NOT NULL;
INSERT INTO settings_options(variable,value,display_text) VALUES ('page_after_login', 'main/auth/courses.php', 'CourseCatalog'); INSERT INTO settings_options(variable,value,display_text) VALUES ('page_after_login', 'main/auth/courses.php', 'CourseCatalog');
ALTER TABLE settings_current ADD COLUMN access_url_locked INTEGER NOT NULL DEFAULT 0;
-- Do not move this query -- Do not move this query
UPDATE settings_current SET selected_value = '1.9.0.17631' WHERE variable = 'chamilo_database_version'; UPDATE settings_current SET selected_value = '1.9.0.17631' WHERE variable = 'chamilo_database_version';

@ -248,8 +248,6 @@ if (defined('SYSTEM_INSTALLATION')) {
if ($res === false) { die('Error while querying the courses list in update_db-1.8.6.2-1.8.7.inc.php'); } if ($res === false) { die('Error while querying the courses list in update_db-1.8.6.2-1.8.7.inc.php'); }
$errors = array(); $errors = array();
//$filename = api_get_path(SYS_ARCHIVE_PATH).'migration_report.log';
//$time = date(); file_put_contents($filename, "File creation at $time ");
if (Database::num_rows($res) > 0) { if (Database::num_rows($res) > 0) {
$i = 0; $i = 0;
@ -258,7 +256,6 @@ if (defined('SYSTEM_INSTALLATION')) {
$list[] = $row; $list[] = $row;
$i++; $i++;
} }
$query_id = '';
foreach ($list as $row_course) { foreach ($list as $row_course) {
// Now use the $c_q_list // Now use the $c_q_list
@ -378,7 +375,7 @@ if (defined('SYSTEM_INSTALLATION')) {
error_log('<<<------- Loading DB course '.$row_course['db_name'].' -------->>'); error_log('<<<------- Loading DB course '.$row_course['db_name'].' -------->>');
$count = $old_count = 0; $count = $old_count = 0;
foreach($table_list as $table) { foreach ($table_list as $table) {
$old_table = $row_course['db_name'].".".$table; $old_table = $row_course['db_name'].".".$table;
if ($singleDbForm) { if ($singleDbForm) {
$old_table = "$prefix{$row_course['db_name']}_".$table; $old_table = "$prefix{$row_course['db_name']}_".$table;
@ -429,21 +426,6 @@ if (defined('SYSTEM_INSTALLATION')) {
} }
} }
error_log('<<<------- end -------->>'); error_log('<<<------- end -------->>');
//error
/*
//Adding all_day to the calendar event table
$calendar_event_table = $row_course['db_name'].".calendar_event";
if ($singleDbForm) {
$calendar_event_table = "$prefix{$row_course['db_name']}_calendar_event";
}
$query = "ALTER TABLE `".$calendar_event_table."` ADD COLUMN all_day INTEGER NOT NULL DEFAULT 0;";
$res = Database::query($query);
if ($res === false) {
error_log('Error in '.$query.': '.Database::error());
} */
} }
} }
} }

@ -224,7 +224,7 @@ if (api_is_allowed_to_edit(null, true) && isset($_GET['action'])) {
<span class="form_required">*</span> URL <span class="form_required">*</span> URL
</label> </label>
<div class="controls"> <div class="controls">
<input type="text" name="urllink" size="50" value="' . (empty($urllink) ? 'http://' : Security::remove_XSS($urllink)) . '" /> <input type="text" name="urllink" class="span6" value="' . (empty($urllink) ? 'http://' : Security::remove_XSS($urllink)) . '" />
</div> </div>
</div>'; </div>';
echo ' <div class="control-group"> echo ' <div class="control-group">
@ -232,7 +232,7 @@ if (api_is_allowed_to_edit(null, true) && isset($_GET['action'])) {
'.get_lang('LinkName').' '.get_lang('LinkName').'
</label> </label>
<div class="controls"> <div class="controls">
<input type="text" name="title" size="50" value="' . Security::remove_XSS($title) . '" /> <input type="text" name="title" class="span6" value="' . Security::remove_XSS($title) . '" />
</div> </div>
</div>'; </div>';
echo ' <div class="control-group"> echo ' <div class="control-group">
@ -248,7 +248,7 @@ if (api_is_allowed_to_edit(null, true) && isset($_GET['action'])) {
'.get_lang('Description').' '.get_lang('Description').'
</label> </label>
<div class="controls"> <div class="controls">
<textarea rows="3" cols="50" name="description">' . Security::remove_XSS($description) . '</textarea> <textarea class="span3" cols="50" name="description">' . Security::remove_XSS($description) . '</textarea>
</div> </div>
</div>'; </div>';

@ -1741,7 +1741,7 @@ class Rsys {
$language_file = 'reservation'; $language_file = 'reservation';
$cidReset = true; $cidReset = true;
require_once '../inc/global.inc.php'; require_once '../inc/global.inc.php';
require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php'; require_once api_get_path(LIBRARY_PATH).'sortable_table.class.php';
Rsys :: init(); Rsys :: init();
require_once 'rcalendar.php'; require_once 'rcalendar.php';
require_once api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php'; require_once api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php';

@ -80,7 +80,7 @@ if (!empty($new_session_list)) {
$exercise = new Exercise($course_info['real_id']); $exercise = new Exercise($course_info['real_id']);
$exercise->read($exercise_item['id']); $exercise->read($exercise_item['id']);
$visible_return = $exercise->is_visible(); $visible_return = $exercise->is_visible();
if ($visible_return['value'] == false) { if ($visible_return['value'] != false) {
//$exercise_course_list[$exercise_item['id']] = $exercise; //$exercise_course_list[$exercise_item['id']] = $exercise;
//Reading all Exercise results by user, exercise_id, code, and session //Reading all Exercise results by user, exercise_id, code, and session
$user_results = get_exercise_results_by_user(api_get_user_id(), $exercise_item['id'], $my_course['code'], $my_session_id); $user_results = get_exercise_results_by_user(api_get_user_id(), $exercise_item['id'], $my_course['code'], $my_session_id);

@ -1,370 +1,252 @@
<?php <?php
/** /**
* This file contains the helper libraries for the BigBlueButton conference plugin. * This script initiates a videoconference session, calling the BigBlueButton API
* It is based on code written by Dual Code Inc in GNU/GPLv2
* Copyright (C) 2010 Dual Code Inc. (www.dualcode.com)
* Copyright (C) 2010 BeezNest Belgium SPRL (www.beeznest.com) - Yannick Warnier - y@beeznest.com
* @package chamilo.plugin.bigbluebutton * @package chamilo.plugin.bigbluebutton
*/
/**
* Inserts an item into the plugin_bbb table
*/
function bigbluebutton_insert_record($table,$object) {
//ignore the first param (used for compatibility with existing code)
$table = Database::get_main_table('plugin_bbb');
$sql = "INSERT INTO $table (course_id, name, meeting_name, meeting_id, attendee_pw, moderator_pw, auto_login, new_window, welcome_msg)" .
"VALUES (" .
intval($object->course) .", " .
"'".Database::escape_string($object->name)."'," .
"'".Database::escape_string($object->meetingname)."'," .
"'".Database::escape_string($object->meetingid)."'," .
"'".Database::escape_string($object->attendeepw)."'," .
"'".Database::escape_string($object->moderatorpw)."'," .
"'".Database::escape_string($object->autologin)."'," .
"'".Database::escape_string($object->newwindow)."'," .
"'".Database::escape_string($object->welcomemsg)."'" .
")";
Database::query($sql);
return Database::insert_id();
}
/**
* Updates a bigbluebutton record
*/
function bigbluebutton_update_record($table, $object) {
//ignore the first param (used for compatibility with existing code) $table = Database::get_main_table('plugin_bbb');
$sql = "UPDATE $table (course_id, name, meeting_name, meeting_id, attendee_pw, moderator_pw, auto_login, new_window, welcome_msg)" .
" SET course_id = ".intval($object->course) .", " .
" name = '".Database::escape_string($object->name)."'," .
" meeting_name = '".Database::escape_string($object->meetingname)."'," .
" meeting_id = '".Database::escape_string($object->meetingid)."'," .
" attendee_pw = '".Database::escape_string($object->attendeepw)."'," .
" moderator_pw = '".Database::escape_string($object->moderatorpw)."'," .
" auto_login = '".Database::escape_string($object->autologin)."'," .
" new_window = '".Database::escape_string($object->newwindow)."'," .
" welcome_msg = '".Database::escape_string($object->welcomemsg)."'," .
" WHERE id = " .intval($object->id).
")";
Database::query($sql);
return $oject->id;
}
/**
* Gets a bigbluebutton room record from an ID
*/
function bigbluebutton_get_record($table,$field,$id) {
//ignore the first param (used for compatibility with existing code)
$table = Database::get_main_table('plugin_bbb');
$sql = "SELECT * FROM $table WHERE id = ".intval($id);
$res = Database::query($sql);
if (Database::num_rows($res)>0) {
$row = Database::fetch_assoc($res);
$room = null;
$room->id = $id;
$room->course = $row['course_id'];
$room->name = $row['name'];
$room->meetingname = $row['meeting_name'];
$room->meetingid = $row['meeting_id'];
$room->attendeepw = $row['attendee_pw'];
$room->moderatorpw = $row['moderator_pw'];
$room->autologin = $row['auto_login'];
$room->newwindow = $row['new_window'];
$room->welcomemsg = $row['welcome_msg'];
return $room;
} else {
return null;
}
}
/**
* Gets a bigbluebutton room record from an ID
*/
function bigbluebutton_delete_records($table,$field,$id) {
//ignore the first param (used for compatibility with existing code)
$table = Database::get_main_table('plugin_bbb');
$sql = "DELETE FROM $table WHERE id = ".intval($id);
}
/**
* Add an event
*/
function bigbluebutton_add_event($event) {
//
}
/**
* Given an object containing all the necessary data,
* (defined by the form in mod.html) this function
* will create a new instance and return the id number
* of the new instance.
*/ */
function bigbluebutton_add_instance($bigbluebutton) {
$bigbluebutton->timemodified = time();
if ($returnid = bigbluebutton_insert_record('bigbluebutton', $bigbluebutton)) {
$event = NULL;
$event->courseid = $bigbluebutton->course;
$event->name = $bigbluebutton->name;
$event->meetingname = $bigbluebutton->meetingname;
$event->meetingid = $bigbluebutton->meetingid;
$event->attendeepw = $bigbluebutton->attendeepw;
$event->moderatorpw = $bigbluebutton->moderatorpw;
$event->autologin = $bigbluebutton->autologin;
$event->newwindow = $bigbluebutton->newwindow;
$event->welcomemsg = $bigbluebutton->welcomemsg;
bigbluebutton_add_event($event);
}
return $returnid;
}
class bbb {
/** var $url;
* Given an object containing all the necessary data, var $salt;
* (defined by the form in mod.html) this function var $api;
* will update an existing instance with new data. var $user_complete_name = null;
*/ var $protocol = 'http://';
function bigbluebutton_update_instance($bigbluebutton) { var $debug = true;
$bigbluebutton->timemodified = time(); var $logout_url = null;
$bigbluebutton->id = $bigbluebutton->instance;
if ($returnid = bigbluebutton_update_record('bigbluebutton', $bigbluebutton)) { function __construct() {
/*
$event = NULL;
if ($event->id = bigbluebutton_get_field('event', 'id', 'modulename', 'bigbluebutton', 'instance', $bigbluebutton->id)) {
$event->courseid = $bigbluebutton->course;
$event->name = $bigbluebutton->name;
$event->meetingname = $bigbluebutton->meetingname;
$event->meetingid = $bigbluebutton->meetingid;
$event->attendeepw = $bigbluebutton->attendeepw;
$event->moderatorpw = $bigbluebutton->moderatorpw;
$event->autologin = $bigbluebutton->autologin;
$event->newwindow = $bigbluebutton->newwindow;
$event->welcomemsg = $bigbluebutton->welcomemsg;
bigbluebutton_update_event($event);
}*/
}
return $returnid;
}
// initialize video server settings from global settings
$settings = api_get_settings('Extra','list',api_get_current_access_url_id());
$bbb_settings = array();
foreach ($settings as $setting) {
if (substr($setting['variable'],0,4)==='bbb_') {
$bbb_settings[$setting['variable']] = $setting['selected_value'];
}
}
$bbb_plugin = $bbb_settings['bbb_plugin'] === 'true';
$bbb_host = $bbb_settings['bbb_plugin_host'];
$bbb_salt = $bbb_settings['bbb_plugin_salt'];
$course_code = api_get_course_id();
/** $this->logout_url = api_get_path(WEB_COURSE_PATH).$course_code;
* Given an ID of an instance of this module,
* this function will permanently delete the instance if ($bbb_plugin) {
* and any data that depends on it. $user_info = api_get_user_info();
*/ $this->user_complete_name = $user_info['complete_name'];
function bigbluebutton_delete_instance($id) { $this->salt = $bbb_salt;
if (! $bigbluebutton = bigbluebutton_get_record('bigbluebutton', 'id', $id)) { $this->url = $bbb_host.'/bigbluebutton/';
$this->table = Database::get_main_table('plugin_bbb_meeting');
return true;
}
return false; return false;
} }
$result = true; function create_meeting($params) {
$params['c_id'] = api_get_course_int_id();
$course_code = api_get_course_id();
# Delete any dependent records here # $attende_password = $params['attendee_pw'] = isset($params['moderator_pw']) ? $params['moderator_pw'] : api_get_course_id();
$moderator_password = $params['moderator_pw'] = isset($params['moderator_pw']) ? $params['moderator_pw'] : api_get_course_id().'mod';
if (! bigbluebutton_delete_records('bigbluebutton', 'id', $bigbluebutton->id)) { $params['record'] = api_get_course_setting('big_blue_button_record_and_store', $course_code) == 1 ? true : false;
$result = false; $max = api_get_course_setting('big_blue_button_max_students_allowed', $course_code);
}
/* $max = isset($max) ? $max : -1;
$pagetypes = page_import_types('mod/bigbluebutton/'); $params['status'] = 1;
foreach($pagetypes as $pagetype) {
if(!delete_records('block_instance', 'pageid', $bigbluebutton->id, 'pagetype', $pagetype)) { if ($this->debug) error_log("enter create_meeting ".print_r($params, 1));
$result = false;
$params['created_at'] = api_get_utc_datetime();
$id = Database::insert($this->table, $params);
if ($id) {
if ($this->debug) error_log("create_meeting $id ");
$meeting_name = isset($params['meeting_name']) ? $params['meeting_name'] : api_get_course_id();
$welcome_msg = isset($params['welcome_msg']) ? $params['welcome_msg'] : null;
$record = isset($params['record']) && $params['record'] ? 'true' : 'false';
$duration = isset($params['duration']) ? intval($params['duration']) : 0;
// ??
$voiceBridge = 0;
$metadata = array('maxParticipants' => $max);
return $this->protocol.BigBlueButtonBN::createMeetingAndGetJoinURL($this->user_complete_name, $meeting_name, $id, $welcome_msg, $moderator_password, $attende_password,
$this->salt, $this->url, $this->logout_url, $record, $duration, $voiceBridge, $metadata);
//$id = Database::update($this->table, array('created_at' => ''));
} }
} }
*/
/* function is_meeting_exist($meeting_name) {
if (! bigbluebutton_delete_records('event', 'modulename', 'bigbluebutton', 'instance', $bigbluebutton->id)) { $course_id = api_get_course_int_id();
$result = false; $meeting_data = Database::select('*', $this->table, array('where' => array('c_id = ? AND meeting_name = ? AND status = 1 ' => array($course_id, $meeting_name))), 'first');
if ($this->debug) error_log("is_meeting_exist ".print_r($meeting_data,1));
if (empty($meeting_data)) {
return false;
} else {
return true;
}
} }
*/
return $result;
}
/**
* @todo implement moderator pass
*/
function join_meeting($meeting_name) {
$pass = $this->get_user_metting_password();
$meeting_data = Database::select('*', $this->table, array('where' => array('meeting_name = ? AND status = 1 ' => $meeting_name)), 'first');
if (empty($meeting_data)) {
if ($this->debug) error_log("meeting does not exist: $meeting_name ");
return false;
}
/** $meeting_is_running = BigBlueButtonBN::isMeetingRunning($meeting_data['id'], $this->url, $this->salt);
* Create string where we check if the meeting is running
*/
function wc_isMeetingRunningURL($myIP,$mySecuritySalt,$myMeetingID) {
$checkAPI = "/bigbluebutton/api/isMeetingRunning?";
$queryStr = "meetingID=".$myMeetingID;
$checksum = sha1('isMeetingRunning'.$queryStr.$mySecuritySalt);
$secQueryURL = "http://".$myIP.$checkAPI.$queryStr."&checksum=".$checksum;
return $secQueryURL;
}
/** $meeting_info = BigBlueButtonBN::getMeetingInfoArray($meeting['id'], $pass, $this->url, $this->salt);
* Determine if the meeting is already running (e.g. has attendees in it) $meeting_info_exists = false;
*/
function wc_isMeetingRunning($myIP,$mySecuritySalt,$myMeetingID) {
$secQueryURL = wc_isMeetingRunningURL($myIP,$mySecuritySalt,$myMeetingID);
$myResponse = @file_get_contents($secQueryURL);
if ($myResponse === false) { return false;}
$doc = new DOMDocument();
$doc->loadXML($myResponse);
$returnCodeNode = $doc->getElementsByTagName("returncode");
$returnCode = $returnCodeNode->item(0)->nodeValue;
$runningNode = $doc->getElementsByTagName("running");
$isRunning = $runningNode->item(0)->nodeValue;
return $isRunning;
}
/** if ($meeting_info['returncode'] != 'FAILED') {
* Create meeting if it's not already running $meeting_info_exists = true;
*/ }
function wc_createMeeting($myIP,$mySecuritySalt,$myMeetingName,$myMeetingID,$myAttendeePW,$myModeratorPW,$myWelcomeMsg,$myLogoutURL) { $url = false;
$createAPI = "/bigbluebutton/api/create?"; if ($this->debug) error_log("meeting is running".$meeting_is_running);
$myVoiceBridge = rand(70000,79999);
$queryStr = "name=".urlencode($myMeetingName)."&meetingID=".urlencode($myMeetingID)."&attendeePW=".urlencode($myAttendeePW)."&moderatorPW=".urlencode($myModeratorPW)."&voiceBridge=".$myVoiceBridge."&welcome=".urlencode($myWelcomeMsg)."&logoutURL=".urlencode($myLogoutURL); if (isset($meeting_is_running) && $meeting_info_exists) {
$checksum = sha1('create'.$queryStr.$mySecuritySalt); $url = $this->protocol.BigBlueButtonBN::joinURL($meeting_data['id'], $this->user_complete_name, $pass, $this->salt, $this->url);
$secQueryURL = "http://".$myIP.$createAPI.$queryStr."&checksum=".$checksum; }
$myResponse = @file_get_contents($secQueryURL); if ($this->debug) error_log("return url :".$url);
if ($myResponse === false) { return false; } return $url;
$doc= new DOMDocument();
$doc->loadXML($myResponse);
$returnCodeNode = $doc->getElementsByTagName("returncode");
$returnCode = $returnCodeNode->item(0)->nodeValue;
if ($returnCode=="SUCCESS") {
return $returnCode;
} else {
$messageKeyNode = $doc->getElementsByTagName("messageKey");
$messageKey = $messageKeyNode->item(0)->nodeValue;
return $messageKey;
} }
}
/**
* Gets all the course meetings saved in the plugin_bbb_meeting table
* @return string
*/
function get_course_meetings() {
$pass = $this->get_user_metting_password();
$meeting_list = Database::select('*', $this->table, array('where' => array('c_id = ? ' => api_get_course_int_id())));
$new_meeting_list = array();
foreach ($meeting_list as $meeting) {
$item_meeting = $meeting;
$item_meeting['info'] = BigBlueButtonBN::getMeetingInfoArray($meeting['id'], $pass, $this->url, $this->salt);
if ($meeting['info']['returncode'] == 'FAILED') {
} else {
$item_meeting['end_url'] = api_get_self().'?action=end&id='.$meeting['id'];
}
$record_array = array();
if ($meeting['record'] == 1) {
$records = BigBlueButtonBN::getRecordingsArray($meeting['id'], $this->url, $this->salt);
//var_dump($meeting['id']);
if (!empty($records)) {
foreach ($records as $record) {
if (is_array($record) && isset($record['recordID']) && isset($record['playbacks'])) {
//Fix the bbb timestamp
$record['startTime'] = substr($record['startTime'], 0, strlen($record['startTime']) -3);
$record['endTime'] = substr($record['endTime'], 0, strlen($record['endTime']) -3);
foreach ($record['playbacks'] as $item) {
$url = Display::url(get_lang('ViewRecord'), $item['url'], array('target' => '_blank')).' - '.api_convert_and_format_date($record['startTime']).' - '.api_convert_and_format_date($record['endTime']);
//$url .= Display::url(get_lang('DeleteRecord'), api_get_self().'?action=delete_record&'.$record['recordID']);
$url .= Display::url(get_lang('CopyToLinkTool'), api_get_self().'?action=copy_record_to_link_tool&id='.$meeting['id'].'&record_id='.$record['recordID']);
//$url .= api_get_self().'?action=publish&id='.$record['recordID'];
$record_array[] = $url;
}
}
}
}
$item_meeting['show_links'] = implode('<br />', $record_array);
}
/** $item_meeting['created_at'] = api_get_local_time($item_meeting['created_at']);
* Create a URL to join the meeting //created_at
*/
function wc_joinMeetingURL($myIP,$mySecuritySalt,$myName,$myMeetingID,$myPassword,$userID) {
$joinAPI = "/bigbluebutton/api/join?";
$queryStr = "fullName=".urlencode($myName)."&meetingID=".urlencode($myMeetingID)."&password=".urlencode($myPassword)."&userID=".$userID;
$checksum = sha1('join'.$queryStr.$mySecuritySalt);
$createStr = "http://".$myIP.$joinAPI.$queryStr."&checksum=".$checksum;
return $createStr; $item_meeting['publish_url'] = api_get_self().'?action=publish&id='.$meeting['id'];
} $item_meeting['unpublish_url'] = api_get_self().'?action=unpublish&id='.$meeting['id'];
/** if ($meeting['status'] == 1) {
* This API is not yet supported in bigbluebutton $item_meeting['go_url'] = $this->protocol.BigBlueButtonBN::joinURL($meeting['id'], $this->user_complete_name, $pass, $this->salt, $this->url);
*/ }
function wc_endMeeting($myIP,$mySecuritySalt,$myMeetingID,$myModeratorPW) { $new_meeting_list[] = $item_meeting;
$endAPI = "/bigbluebutton/api/end?"; }
$myVoiceBridge = rand(70000,79999); return $new_meeting_list;
$queryStr = "meetingID=".$myMeetingID."&moderatorPW=".$myModeratorPW."&voiceBridge=".$myVoiceBridge;
$checksum = sha1('create'.$queryStr.$mySecuritySalt);
$secQueryURL = "http://".$myIP.$endAPI.$queryStr."&checksum=".$checksum;
$myResponse = @file_get_contents($secQueryURL);
if ($myResponse === false) { return false; }
$doc= new DOMDocument();
$doc->loadXML($myResponse);
$returnCodeNode = $doc->getElementsByTagName("returncode");
$returnCode = $returnCodeNode->item(0)->nodeValue;
if ($returnCode=="SUCCESS") {
return $returnCode;
} else {
$messageKeyNode = $doc->getElementsByTagName("messageKey");
$messageKey = $messageKeyNode->item(0)->nodeValue;
return $messageKey;
} }
}
/** function publish_meeting($id) {
* This API is not yet supported in bigbluebutton return BigBlueButtonBN::setPublishRecordings($id, 'true', $this->url, $this->salt);
*/ }
function wc_listAttendees() {
return false;
}
/** function unpublish_meeting($id) {
* This API is not yet supported in bigbluebutton return BigBlueButtonBN::setPublishRecordings($id, 'false', $this->url, $this->salt);
*/
function wc_getMeetingInfo($myIP,$mySecuritySalt,$meetingID,$modPW) {
$checkAPI = "/bigbluebutton/api/getMeetingInfo?";
$queryStr = 'meetingID='.$meetingID.'&password='.$modPW;
$checksum = sha1('getMeetingInfo'.$queryStr.$mySecuritySalt);
$secQueryURL = "http://".$myIP.$checkAPI.$queryStr."&checksum=".$checksum;
$myResponse = @file_get_contents($secQueryURL);
if ($myResponse === false) { return false;}
$doc = new DOMDocument();
$doc->loadXML($myResponse);
$returnCodeNode = $doc->getElementsByTagName("returncode");
$returnCode = $returnCodeNode->item(0)->nodeValue;
$createTimeNode = $doc->getElementsByTagName("createTime");
$createTime = $createTimeNode->item(0)->nodeValue;
$runningNode = $doc->getElementsByTagName("running");
$running = $runningNode->item(0)->nodeValue;
$attendeesNode = $doc->getElementsByTagName("attendee");
$attendees = array();
foreach ($attendeesNode as $attendeeNode) {
$attendee = array();
if ($attendeeNode->childNodes->length) {
foreach ($attendeeNode->childNodes as $i) {
//see http://code.google.com/p/bigbluebutton/wiki/API#Get_Meeting_Info for details
$attendee[$i->nodeName] = $i->nodeValue;
}
}
$attendees[] = $attendee;
} }
$info = array('returnCode'=>$returnCode,'createTime'=>$createTime,'attendees'=>$attendees,'running'=>$running);
return $info;
}
/** function end_meeting($id) {
* Determine the URL of the current page (for logoutURL) $pass = $this->get_user_metting_password();
*/ BigBlueButtonBN::endMeeting($id, $pass, $this->url, $this->salt);
function wc_currentPageURL() { Database::update($this->table, array('status' => 0), array('id = ? ' => $id));
$isHTTPS = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on"); }
$port = (isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443")));
$port = ($port) ? ':'.$_SERVER["SERVER_PORT"] : '';
$pageURL = ($isHTTPS ? 'https://' : 'http://').$_SERVER["SERVER_NAME"].$port.$_SERVER["REQUEST_URI"];
return $pageURL;
}
function get_user_metting_password() {
$teacher = api_is_course_admin() || api_is_coach() || api_is_platform_admin();
if ($teacher) {
return api_get_course_id().'mod';
} else {
return api_get_course_id();
}
}
/** /**
* Determine the IP/Domain of the current Corporate University * Get users online in the current course room
*/ */
function wc_currentDomain() { function get_users_online_in_current_room() {
$currentDomain = $_SERVER["SERVER_NAME"]; $course_id = api_get_course_int_id();
return $currentDomain; $meeting_data = Database::select('*', $this->table, array('where' => array('c_id = ? AND status = 1 ' => $course_id)), 'first');
} if (empty($meeting_data)) {
return 0;
}
$pass = $this->get_user_metting_password();
//$meeting_is_running = BigBlueButtonBN::isMeetingRunning($meeting_data['id'], $this->url, $this->salt);
$info = BigBlueButtonBN::getMeetingInfoArray($meeting_data['id'], $pass, $this->url, $this->salt);
if (!empty($info) && isset($info['participantCount'])) {
return $info['participantCount'];
/** }
* Determine if a new version of the plug-in is available return 0;
*/ }
function wc_needUpgrade() {
$returnValue = false;
$installedVersion = "20100805";
$availableVersion = dc_getVersion();
if ((int)$installedVersion < (int)$availableVersion) {
$returnValue = true;
}
return $returnValue;
}
/** /**
* Gets a list of all meetings currently running * @todo
*/ */
function wc_getRunningMeetings($myIP,$mySecuritySalt) { function delete_record($id) {
$checkAPI = "/bigbluebutton/api/getMeetings?"; }
$queryStr = '';
$checksum = sha1('getMeetings'.$queryStr.$mySecuritySalt); function copy_record_to_link_tool($id, $record_id) {
$secQueryURL = "http://".$myIP.$checkAPI.$queryStr."&checksum=".$checksum; require_once api_get_path(LIBRARY_PATH).'link.lib.php';
$myResponse = @file_get_contents($secQueryURL); $records = BigBlueButtonBN::getRecordingsArray($id, $this->url, $this->salt);
if ($myResponse === false) { return false;} if (!empty($records)) {
$doc = new DOMDocument(); foreach ($records as $record) {
$doc->loadXML($myResponse); if ($record['recordID'] == $record_id) {
$returnCodeNode = $doc->getElementsByTagName("returncode"); if (is_array($record) && isset($record['recordID']) && isset($record['playbacks'])) {
$returnCode = $returnCodeNode->item(0)->nodeValue; foreach ($record['playbacks'] as $item) {
$meetingsNode = $doc->getElementsByTagName("meeting"); $link = new Link();
$meetings = array(); $params['url'] = $item['url'];
foreach ($meetingsNode as $meetingNode) { $params['title'] = 'bbb 1';
$meeting = array(); $id = $link->save($params);
if ($meetingNode->childNodes->length) { return $id;
foreach ($meetingNode->childNodes as $i) { }
//see http://code.google.com/p/bigbluebutton/wiki/API#Get_Meetings for details }
$meeting[$i->nodeName] = $i->nodeValue;
}
} }
} }
$meetings[] = $meeting; return false;
} }
return $meetings;
} }

@ -0,0 +1,760 @@
<?php
/*
Copyright 2010-2011 Blindside Networks
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Versions:
1.0 -- Initial version written by DJP
(email: djp [a t ] architectes DOT .org)
1.1 -- Updated by Omar Shammas and Sebastian Schneider
(email : omar [at] b l i n ds i de n e t w o r ks [dt] com)
(email : seb DOT sschneider [ a t ] g m ail DOT com)
1.2 -- Updated by Omar Shammas
(email : omar [at] b l i n ds i de n e t w o r ks [dt] com)
1.3 -- Reviewed and extended by Jesus Federico
(email : jesus [at] b l i n ds i de n e t w o r ks [dt] com)
0.8_1.4.10 -- Extended by Jesus Federico to support BigBlueButton 0.8 version
(email : jesus [at] b l i n ds i de n e t w o r ks [dt] com)
*/
/*
@param
$userName = userName AND meetingID (string)
$welcomeString = welcome message (string)
$modPW = moderator password (string)
$vPW = viewer password (string)
$voiceBridge = voice bridge (integer)
$logout = logout url (url)
*/
// create a meeting and return the url to join as moderator
// TODO::
// create some set methods
class BigBlueButtonBN {
var $userName = array();
var $meetingID; // the meeting id
var $welcomeString;
// the next 2 fields are maybe not needed?!?
var $modPW; // the moderator password
var $attPW; // the attendee pw
var $securitySalt; // the security salt; gets encrypted with sha1
var $URL; // the url the bigbluebuttonbn server is installed
var $sessionURL; // the url for the administrator to join the sessoin
var $userURL;
var $conferenceIsRunning = false;
// this constructor is used to create a BigBlueButton Object
// use this object to create servers
// Use is either 0 arguments or all 7 arguments
public function __construct() {
$numargs = func_num_args();
if( $numargs == 0 ) {
# echo "Constructor created";
}
// pass the information to the class variables
else if( $numargs >= 6 ) {
$this->userName = func_get_arg(0);
$this->meetingID = func_get_arg(1);
$this->welcomeString = func_get_arg(2);
$this->modPW = func_get_arg(3);
$this->attPW = func_get_arg(4);
$this->securitySalt = func_get_arg(5);
$this->URL = func_get_arg(6);
$arg_list = func_get_args();
}// end else if
}
//------------------------------------------------GET URLs-------------------------------------------------
/**
*This method returns the url to join the specified meeting.
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param username -- the display name to be used when the user joins the meeting
*@param PW -- the attendee or moderator password of the meeting
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return The url to join the meeting
*/
public static function joinURL( $meetingID, $userName, $PW, $SALT, $URL ) {
$url_join = $URL."api/join?";
$params = 'meetingID='.urlencode($meetingID).'&fullName='.urlencode($userName).'&password='.urlencode($PW);
return ($url_join.$params.'&checksum='.sha1("join".$params.$SALT) );
}
/**
*This method returns the url to join the specified meeting.
*
*@param name -- a name fot the meeting
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param attendeePW -- the attendee of the meeting
*@param moderatorPW -- the moderator of the meeting
*@param welcome -- the welcome message that gets displayed on the chat window
*@param logoutURL -- the URL that the bbb client will go to after users logouut
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*@param record -- the flag which indicate if the meetings will be recorded or not record=true|false, default false
*@param duration -- this value indicate the duration of a meeting to be recorded. Duration is represented in munutes
*
*@return The url to join the meeting
*/
public static function createMeetingURL($name, $meetingID, $attendeePW, $moderatorPW, $welcome, $logoutURL, $SALT, $URL, $record = 'false', $duration=0, $voiceBridge=0, $metadata = array() ) {
$url_create = $URL."api/create?";
if ( $voiceBridge == 0)
$voiceBridge = 70000 + rand(0, 9999);
$meta = '';
while ($data = current($metadata)) {
$meta = $meta.'&'.key($metadata).'='.urlencode($data);
next($metadata);
}
$params = 'name='.urlencode($name).'&meetingID='.urlencode($meetingID).'&attendeePW='.urlencode($attendeePW).'&moderatorPW='.urlencode($moderatorPW).'&voiceBridge='.$voiceBridge.'&logoutURL='.urlencode($logoutURL).'&record='.$record.$meta;
$duration = intval($duration);
if( $duration > 0 )
$params .= '&duration='.$duration;
if( trim( $welcome ) )
$params .= '&welcome='.urlencode($welcome);
return ( $url_create.$params.'&checksum='.sha1("create".$params.$SALT) );
}
/**
*This method returns the url to check if the specified meeting is running.
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return The url to check if the specified meeting is running.
*/
public static function isMeetingRunningURL( $meetingID, $URL, $SALT ) {
$base_url = $URL."api/isMeetingRunning?";
$params = 'meetingID='.urlencode($meetingID);
return ($base_url.$params.'&checksum='.sha1("isMeetingRunning".$params.$SALT) );
}
/**
*This method returns the url to getMeetingInfo of the specified meeting.
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param modPW -- the moderator password of the meeting
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return The url to check if the specified meeting is running.
*/
public static function getMeetingInfoURL( $meetingID, $modPW, $URL, $SALT ) {
$base_url = $URL."api/getMeetingInfo?";
$params = 'meetingID='.urlencode($meetingID).'&password='.urlencode($modPW);
return ( $base_url.$params.'&checksum='.sha1("getMeetingInfo".$params.$SALT));
}
/**
*This method returns the url for listing all meetings in the bigbluebuttonbn server.
*
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return The url of getMeetings.
*/
public static function getMeetingsURL($URL, $SALT) {
$base_url = $URL."api/getMeetings?";
$params = '';
return ( $base_url.$params.'&checksum='.sha1("getMeetings".$params.$SALT));
}
/**
*This method returns the url to end the specified meeting.
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param modPW -- the moderator password of the meeting
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return The url to end the specified meeting.
*/
public static function endMeetingURL( $meetingID, $modPW, $URL, $SALT ) {
$base_url = $URL."api/end?";
$params = 'meetingID='.urlencode($meetingID).'&password='.urlencode($modPW);
return ( $base_url.$params.'&checksum='.sha1("end".$params.$SALT) );
}
//-----------------------------------------------CREATE----------------------------------------------------
/**
*This method creates a meeting and returnS the join url for moderators.
*
*@param username
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param welcomeString -- the welcome message to be displayed when a user logs in to the meeting
*@param mPW -- the moderator password of the meeting
*@param aPW -- the attendee password of the meeting
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*@param logoutURL -- the url the user should be redirected to when they logout of bigbluebuttonbn
*@param record -- the flag which indicate if the meetings will be recorded or not record=true|false, default false
*
*@return The joinURL if successful or an error message if unsuccessful
*/
public static function createMeetingAndGetJoinURL( $username, $meeting_name, $meetingID, $welcomeString, $mPW, $aPW, $SALT, $URL, $logoutURL, $record = 'false', $duration=0, $voiceBridge=0, $metadata = array()) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::createMeetingURL($meeting_name, $meetingID, $aPW, $mPW, $welcomeString, $logoutURL, $SALT, $URL, $record, $duration, $voiceBridge, $metadata ) );
if( $xml && $xml->returncode == 'SUCCESS' ) {
return ( BigBlueButtonBN::joinURL( $meetingID, $username, $mPW, $SALT, $URL ) );
}
else if( $xml ) {
return ( $xml->messageKey.' : '.$xml->message );
}
else {
return ('Unable to fetch URL '.$url_create.$params.'&checksum='.sha1("create".$params.$SALT) );
}
}
/**
*This method creates a meeting and return an array of the xml packet
*
*@param username
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param welcomeString -- the welcome message to be displayed when a user logs in to the meeting
*@param mPW -- the moderator password of the meeting
*@param aPW -- the attendee password of the meeting
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*@param logoutURL -- the url the user should be redirected to when they logout of bigbluebuttonbn
*@param record -- the flag which indicate if the meetings will be recorded or not record=true|false, default false
*
*@return
* - Null if unable to reach the bigbluebuttonbn server
* - If failed it returns an array containing a returncode, messageKey, message.
* - If success it returns an array containing a returncode, messageKey, message, meetingID, attendeePW, moderatorPW, hasBeenForciblyEnded.
*/
public static function createMeetingArray( $username, $meetingID, $welcomeString, $mPW, $aPW, $SALT, $URL, $logoutURL, $record='false', $duration=0, $voiceBridge=0, $metadata = array() ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::createMeetingURL($username, $meetingID, $aPW, $mPW, $welcomeString, $logoutURL, $SALT, $URL, $record, $duration, $voiceBridge, $metadata ) );
if( $xml ) {
if($xml->meetingID) return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey, 'meetingID' => $xml->meetingID, 'attendeePW' => $xml->attendeePW, 'moderatorPW' => $xml->moderatorPW, 'hasBeenForciblyEnded' => $xml->hasBeenForciblyEnded );
else return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey );
}
else {
return null;
}
}
//-------------------------------------------getMeetingInfo---------------------------------------------------
/**
*This method calls the getMeetingInfo on the bigbluebuttonbn server and returns an xml packet.
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param modPW -- the moderator password of the meeting
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return An xml packet.
* If failed it returns an xml packet containing a returncode, messagekey, and message.
* If success it returnsan xml packet containing a returncode,
*/
public static function getMeetingInfo( $meetingID, $modPW, $URL, $SALT ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::getMeetingInfoURL( $meetingID, $modPW, $URL, $SALT ) );
if($xml){
return ( str_replace('</response>', '', str_replace("<?xml version=\"1.0\"?>\n<response>", '', $xml->asXML())));
}
return false;
}
/**
*This method calls the getMeetingInfo on the bigbluebuttonbn server and returns an array.
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param modPW -- the moderator password of the meeting
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return An Array.
* - Null if unable to reach the bigbluebuttonbn server
* - If failed it returns an array containing a returncode, messagekey, message.
* - If success it returns an array containing a meetingID, moderatorPW, attendeePW, hasBeenForciblyEnded, running, startTime, endTime,
participantCount, moderatorCount, attendees.
*/
public static function getMeetingInfoArray( $meetingID, $modPW, $URL, $SALT ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::getMeetingInfoURL( $meetingID, $modPW, $URL, $SALT ) );
if( $xml && $xml->returncode == 'SUCCESS' && $xml->messageKey == null){//The meetings were returned
return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey );
}
else if($xml && $xml->returncode == 'SUCCESS'){ //If there were meetings already created
return array( 'meetingID' => $xml->meetingID, 'moderatorPW' => $xml->moderatorPW, 'attendeePW' => $xml->attendeePW, 'hasBeenForciblyEnded' => $xml->hasBeenForciblyEnded, 'running' => $xml->running, 'recording' => $xml->recording, 'startTime' => $xml->startTime, 'endTime' => $xml->endTime, 'participantCount' => $xml->participantCount, 'moderatorCount' => $xml->moderatorCount, 'attendees' => $xml->attendees, 'metadata' => $xml->metadata );
}
else if( ($xml && $xml->returncode == 'FAILED') || $xml) { //If the xml packet returned failure it displays the message to the user
return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
//return array('returncode' => $xml->returncode, 'message' => $xml->errors->error['message'], 'messageKey' => $xml->errors->error['key']); //For API version 0.8
}
else { //If the server is unreachable, then prompts the user of the necessary action
return null;
}
}
//-----------------------------------------------getMeetings------------------------------------------------------
/**
*This method calls getMeetings on the bigbluebuttonbn server, then calls getMeetingInfo for each meeting and concatenates the result.
*
*@param URL -- the url of the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*
*@return
* - If failed then returns a boolean of false.
* - If succeeded then returns an xml of all the meetings.
*/
public static function getMeetings( $URL, $SALT ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::getMeetingsURL( $URL, $SALT ) );
if( $xml && $xml->returncode == 'SUCCESS' ) {
if( $xml->messageKey )
return ( $xml->message->asXML() );
ob_start();
echo '<meetings>';
if( count( $xml->meetings ) && count( $xml->meetings->meeting ) ) {
foreach ($xml->meetings->meeting as $meeting)
{
echo '<meeting>';
echo BigBlueButtonBN::getMeetingInfo($meeting->meetingID, $meeting->moderatorPW, $URL, $SALT);
echo '</meeting>';
}
}
echo '</meetings>';
return (ob_get_clean());
}
else {
return (false);
}
}
/**
*This method calls getMeetings on the bigbluebuttonbn server, then calls getMeetingInfo for each meeting and concatenates the result.
*
*@param URL -- the url of the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*
*@return
* - Null if the server is unreachable
* - If FAILED then returns an array containing a returncode, messageKey, message.
* - If SUCCESS then returns an array of all the meetings. Each element in the array is an array containing a meetingID,
moderatorPW, attendeePW, hasBeenForciblyEnded, running.
*/
public static function getMeetingsArray( $URL, $SALT ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::getMeetingsURL( $URL, $SALT ) );
if( $xml && $xml->returncode == 'SUCCESS' && $xml->messageKey ) {//The meetings were returned
return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
}
else if($xml && $xml->returncode == 'SUCCESS'){ //If there were meetings already created
foreach ($xml->meetings->meeting as $meeting)
{
$meetings[] = array( 'meetingID' => $meeting->meetingID, 'moderatorPW' => $meeting->moderatorPW, 'attendeePW' => $meeting->attendeePW, 'hasBeenForciblyEnded' => $meeting->hasBeenForciblyEnded, 'running' => $meeting->running );
}
return $meetings;
}
else if( $xml ) { //If the xml packet returned failure it displays the message to the user
return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
}
else { //If the server is unreachable, then prompts the user of the necessary action
return null;
}
}
//----------------------------------------------getUsers---------------------------------------
/**
*This method prints the usernames of the attendees in the specified conference.
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param modPW -- the moderator password of the meeting
*@param URL -- the url of the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param UNAME -- is a boolean to determine how the username is formatted when printed. Default if false.
*
*@return A boolean of true if the attendees were printed successfully and false otherwise.
*/
public static function getUsers( $meetingID, $modPW, $URL, $SALT, $UNAME = false ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::getMeetingInfoURL( $meetingID, $modPW, $URL, $SALT ) );
if( $xml && $xml->returncode == 'SUCCESS' ) {
ob_start();
if( count( $xml->attendees ) && count( $xml->attendees->attendee ) ) {
foreach ( $xml->attendees->attendee as $attendee ) {
if( $UNAME == true ) {
echo "User name: ".$attendee->fullName.'<br />';
}
else {
echo $attendee->fullName.'<br />';
}
}
}
return (ob_end_flush());
}
else {
return (false);
}
}
/**
*This method returns an array of the attendees in the specified meeting.
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param modPW -- the moderator password of the meeting
*@param URL -- the url of the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*
*@return
* - Null if the server is unreachable.
* - If FAILED, returns an array containing a returncode, messageKey, message.
* - If SUCCESS, returns an array of array containing the userID, fullName, role of each attendee
*/
public static function getUsersArray( $meetingID, $modPW, $URL, $SALT ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::getMeetingInfoURL( $meetingID, $modPW, $URL, $SALT ) );
if( $xml && $xml->returncode == 'SUCCESS' && $xml->messageKey == null ) {//The meetings were returned
return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
}
else if($xml && $xml->returncode == 'SUCCESS'){ //If there were meetings already created
foreach ($xml->attendees->attendee as $attendee){
$users[] = array( 'userID' => $attendee->userID, 'fullName' => $attendee->fullName, 'role' => $attendee->role );
}
return $users;
}
else if( $xml ) { //If the xml packet returned failure it displays the message to the user
return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
}
else { //If the server is unreachable, then prompts the user of the necessary action
return null;
}
}
//------------------------------------------------Other Methods------------------------------------
/**
*This method calls end meeting on the specified meeting in the bigbluebuttonbn server.
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param modPW -- the moderator password of the meeting
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return
* - Null if the server is unreachable
* - An array containing a returncode, messageKey, message.
*/
public static function endMeeting( $meetingID, $modPW, $URL, $SALT ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::endMeetingURL( $meetingID, $modPW, $URL, $SALT ) );
if( $xml ) { //If the xml packet returned failure it displays the message to the user
return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
}
else { //If the server is unreachable, then prompts the user of the necessary action
return null;
}
}
/**
*This method check the BigBlueButton server to see if the meeting is running (i.e. there is someone in the meeting)
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return A boolean of true if the meeting is running and false if it is not running
*/
public static function isMeetingRunning( $meetingID, $URL, $SALT ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::isMeetingRunningURL( $meetingID, $URL, $SALT ) );
if( $xml && $xml->returncode == 'SUCCESS' )
return ( ( $xml->running == 'true' ) ? true : false);
else
return ( false );
}
/**
*This method calls isMeetingRunning on the BigBlueButton server.
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return
* - If SUCCESS it returns an xml packet
* - If the FAILED or the server is unreachable returns a string of 'false'
*/
public static function getMeetingXML( $meetingID, $URL, $SALT ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::isMeetingRunningURL( $meetingID, $URL, $SALT ) );
if( $xml && $xml->returncode == 'SUCCESS')
return ( str_replace('</response>', '', str_replace("<?xml version=\"1.0\"?>\n<response>", '', $xml->asXML())));
else
return 'false';
}
// TODO: WRITE AN ITERATOR WHICH GOES OVER WHATEVER IT IS BEING TOLD IN THE API AND LIST INFORMATION
/* we have to define at least 2 variable fields for getInformation to read out information at any position
The first is: An identifier to chose if we look for attendees or the meetings or something else
The second is: An identifier to chose what integrated functions are supposed to be used
@param IDENTIFIER -- needs to be put in for the function to identify the information to print out
current values which can be used are 'attendee' and 'meetings'
@param meetingID -- needs to be put in to identify the meeting
@param modPW -- needs to be put in if the users are supposed to be shown or to retrieve information about the meetings
@param URL -- needs to be put in the URL to the bigbluebuttonbn server
@param SALT -- needs to be put in for the security salt calculation
Note: If 'meetings' is used, then only the parameters URL and SALT needs to be used
If 'attendee' is used, then all the parameters needs to be used
*/
public static function getInformation( $IDENTIFIER, $meetingID, $modPW, $URL, $SALT ) {
// if the identifier is null or '', then return false
if( $IDENTIFIER == "" || $IDENTIFIER == null ) {
echo "You need to type in a valid value into the identifier.";
return false;
}
// if the identifier is attendee, call getUsers
else if( $IDENTIFIER == 'attendee' ) {
return BigBlueButtonBN::getUsers( $meetingID, $modPW, $URL, $SALT );
}
// if the identifier is meetings, call getMeetings
else if( $IDENTIFIER == 'meetings' ) {
return BigBlueButtonBN::getMeetings( $URL, $SALT );
}
// return nothing
else {
return true;
}
}
function getServerIP() {
// get the server url
$sIP = $_SERVER['SERVER_ADDR'];
return $serverIP = 'http://'.$sIP.'/bigbluebuttonbn/';
}
/**
*This method check the BigBlueButton server to see if the meeting has been created
*
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*
*@return A boolean of true if the meeting has been created, doesn't matter if is running or not and false if it does not exist
*/
public static function isMeetingCreated( $meetingID, $URL, $SALT ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::getMeetingsURL( $URL, $SALT ) );
if( $xml && $xml->returncode == 'SUCCESS' )
foreach ($xml->meetings->meeting as $meeting)
if ( $meeting->meetingID == $meetingID && $meeting->hasBeenForciblyEnded == 'false' )
return true;
return false;
}
/**
*This method creates a new meeting room in the BigBlueButton server
*
*@param name -- a name fot the meeting
*@param meetingID -- the unique meeting identifier used to store the meeting in the bigbluebuttonbn server
*@param attendeePW -- the attendee of the meeting
*@param moderatorPW -- the moderator of the meeting
*@param welcome -- the welcome message that gets displayed on the chat window
*@param logoutURL -- the URL that the bbb client will go to after users logouut
*@param SALT -- the security salt of the bigbluebuttonbn server
*@param URL -- the url of the bigbluebuttonbn server
*@param record -- the flag which indicate if the meetings will be recorded or not record=true|false, default false
*
*@return A boolean of true if the meeting has been created, doesn't matter if is running or not and false if it was an error
*/
public static function createMeeting($name, $meetingID, $attendeePW, $moderatorPW, $welcome, $logoutURL, $SALT, $URL, $record = 'false', $duration=0, $voiceBridge=0, $metadata = array() ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::createMeetingURL($name, $meetingID, $attendeePW, $moderatorPW, $welcome, $logoutURL, $SALT, $URL, $record, $duration, $voiceBridge, $metadata ) );
if( $xml && $xml->returncode == 'SUCCESS' )
return true;
else
return false;
}
////////////////////////TO DO: CHANGE THE DESCRIPTION OF THE NEW METHODS
public static function getRecordingsURL($meetingID, $URL, $SALT ) {
$base_url_record = $URL."api/getRecordings?";
$params = "meetingID=".urlencode($meetingID);
return ($base_url_record.$params."&checksum=".sha1("getRecordings".$params.$SALT) );
}
/**
*This method calls getMeetings on the bigbluebuttonbn server, then calls getMeetingInfo for each meeting and concatenates the result.
*
*@param URL -- the url of the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*
*@return
* - Null if the server is unreachable
* - If FAILED then returns an array containing a returncode, messageKey, message.
* - If SUCCESS then returns an array of all the meetings. Each element in the array is an array containing a meetingID,
moderatorPW, attendeePW, hasBeenForciblyEnded, running.
*/
public static function getRecordingsArray($meetingID, $URL, $SALT ) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::getRecordingsURL( $meetingID, $URL, $SALT ) );
if( $xml && $xml->returncode == 'SUCCESS' && $xml->messageKey ) {//The meetings were returned
return array('returncode' => (string) $xml->returncode, 'message' => (string) $xml->message, 'messageKey' => (string) $xml->messageKey);
} else if($xml && $xml->returncode == 'SUCCESS'){ //If there were meetings already created
$recordings = array();
foreach ($xml->recordings->recording as $recording) {
$recordings[(string) $recording->recordID] = array( 'recordID' => (string) $recording->recordID, 'meetingID' => (string) $recording->meetingID, 'meetingName' => (string) $recording->name, 'published' => (string) $recording->published, 'startTime' => (string) $recording->startTime, 'endTime' => (string) $recording->endTime );
$recordings[(string) $recording->recordID]['playbacks'] = array();
foreach ( $recording->playback->format as $format ){
$recordings[(string) $recording->recordID]['playbacks'][(string) $format->type] = array( 'type' => (string) $format->type, 'url' => (string) $format->url );
}
// THIS IS FOR TESTING MULTIPLE FORMATS, DO REMOVE IT FOR FINAL RELEASE
//$recordings[(string) $recording->recordID]['playbacks']['desktop'] = array( 'type' => 'desktop', 'url' => (string) $recording->playback->format->url );
//Add the metadata to the recordings array
$metadata = get_object_vars($recording->metadata);
while ($data = current($metadata)) {
$recordings[(string) $recording->recordID]['meta_'.key($metadata)] = $data;
next($metadata);
}
}
ksort($recordings);
return $recordings;
} else if( $xml ) { //If the xml packet returned failure it displays the message to the user
return array('returncode' => (string) $xml->returncode, 'message' => (string) $xml->message, 'messageKey' => (string) $xml->messageKey);
} else { //If the server is unreachable, then prompts the user of the necessary action
return NULL;
}
}
public static function deleteRecordingsURL( $recordID, $URL, $SALT ) {
$url_delete = $URL."api/deleteRecordings?";
$params = 'recordID='.urlencode($recordID);
return ($url_delete.$params.'&checksum='.sha1("deleteRecordings".$params.$SALT) );
}
public static function deleteRecordings( $recordIDs, $URL, $SALT ) {
$ids = explode(",", $recordIDs);
foreach( $ids as $id){
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::deleteRecordingsURL($id, $URL, $SALT) );
if( $xml && $xml->returncode != 'SUCCESS' )
return false;
}
return true;
}
public static function setPublishRecordingsURL( $recordID, $set, $URL, $SALT ) {
$url_delete = $URL."api/publishRecordings?";
$params = 'recordID='.$recordID."&publish=".$set;
return ($url_delete.$params.'&checksum='.sha1("publishRecordings".$params.$SALT) );
}
public static function setPublishRecordings( $recordIDs, $set, $URL, $SALT ) {
$ids = explode(",", $recordIDs);
foreach( $ids as $id){
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::setPublishRecordingsURL($id, $set, $URL, $SALT) );
if( $xml && $xml->returncode != 'SUCCESS' )
return false;
}
return true;
}
public static function getServerVersion( $URL ){
$base_url_record = $URL."api";
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( $base_url_record );
if( $xml && $xml->returncode == 'SUCCESS' )
return $xml->version;
else
return NULL;
}
public static function isServerRunning( $URL ){
$base_url_record = $URL."api";
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( $base_url_record );
if( $xml && $xml->returncode == 'SUCCESS' )
return true;
else
return false;
}
public function _wrap_simplexml_load_file($url){
if (extension_loaded('curl')) {
$ch = curl_init() or die ( curl_error() );
$timeout = 10;
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec( $ch );
curl_close( $ch );
if($data)
return (new SimpleXMLElement($data,LIBXML_NOCDATA));
else
return false;
}
return (simplexml_load_file($url,'SimpleXMLElement', LIBXML_NOCDATA));
}
}
//----End

@ -0,0 +1,9 @@
<?php
$variables = array( 'big_blue_button_meeting_name',
'big_blue_button_attendee_password',
'big_blue_button_moderator_password',
'big_blue_button_welcome_message',
'big_blue_button_max_students_allowed',
);

@ -8,15 +8,45 @@
*/ */
$t_course = Database::get_course_table(TABLE_COURSE_SETTING); $t_course = Database::get_course_table(TABLE_COURSE_SETTING);
$course_id = api_get_course_int_id(); // $course_id is set in the add_course.lib.inc.php
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_meeting_name','','plugins')"; if (!empty($course_id)) {
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_attendee_password','','plugins')"; $sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_welcome_message','','plugins')";
$r = Database::query($sql_course); $r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_moderator_password','','plugins')";
$r = Database::query($sql_course); /*
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_welcome_message','','plugins')"; $sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_meeting_name','','plugins')";
$r = Database::query($sql_course); $r = Database::query($sql_course);
$t_tool = Database::get_course_table(TABLE_TOOL_LIST); $sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_attendee_password','','plugins')";
$sql_course = "INSERT INTO $t_tool VALUES ($course_id, NULL, 'videoconference','../../plugin/bbb/start.php','visio.gif','".string2binary(api_get_setting('course_create_active_tools', 'videoconference'))."','0','squaregrey.gif','NO','_blank','plugin','0')"; $r = Database::query($sql_course);
$r = Database::query($sql_course); $sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_moderator_password','','plugins')";
$r = Database::query($sql_course);
//New BBB settings
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_max_students_allowed','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_open_new_window','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_student_must_wait_until_moderator','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_join_start_date','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_join_end_date','','plugins')";
$r = Database::query($sql_course);*/
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_record_and_store','','plugins')";
$r = Database::query($sql_course);
$t_tool = Database::get_course_table(TABLE_TOOL_LIST);
$sql_course = "INSERT INTO $t_tool VALUES ($course_id, NULL, 'videoconference','../../plugin/bbb/start.php','visio.gif','".string2binary(api_get_setting('course_create_active_tools', 'videoconference'))."','0','squaregrey.gif','NO','_blank','plugin','0')";
$r = Database::query($sql_course);
}

@ -7,36 +7,38 @@
/** /**
* Initialization * Initialization
*/ */
require 'config.php';
$t_settings = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT); $t_settings = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT);
$t_options = Database::get_main_table(TABLE_MAIN_SETTINGS_OPTIONS); $t_options = Database::get_main_table(TABLE_MAIN_SETTINGS_OPTIONS);
/** /**
* Queries * Queries
*/ */
$sql = "INSERT INTO $t_settings (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES $sql = "INSERT INTO $t_settings (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable, access_url_locked) VALUES
('bbb_plugin', '', 'radio', 'Extra', 'false', 'BigBlueButtonEnableTitle','BigBlueButtonEnableComment',NULL,NULL, 1)"; ('bbb_plugin', '', 'radio', 'Extra', 'false', 'BigBlueButtonEnableTitle','BigBlueButtonEnableComment',NULL,NULL, 1, 1)";
Database::query($sql); Database::query($sql);
$sql = "INSERT INTO $t_options (variable, value, display_text) VALUES ('bbb_plugin', 'true', 'Yes')"; $sql = "INSERT INTO $t_options (variable, value, display_text) VALUES ('bbb_plugin', 'true', 'Yes')";
Database::query($sql); Database::query($sql);
$sql = "INSERT INTO $t_options (variable, value, display_text) VALUES ('bbb_plugin', 'false', 'No')"; $sql = "INSERT INTO $t_options (variable, value, display_text) VALUES ('bbb_plugin', 'false', 'No')";
Database::query($sql); Database::query($sql);
$sql = "INSERT INTO $t_settings (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES $sql = "INSERT INTO $t_settings (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable, access_url_locked) VALUES
('bbb_plugin_host', '', 'textfield', 'Extra', '192.168.0.100', 'BigBlueButtonHostTitle','BigBlueButtonHostComment',NULL,NULL, 1)"; ('bbb_plugin_host', '', 'textfield', 'Extra', '192.168.0.100', 'BigBlueButtonHostTitle','BigBlueButtonHostComment',NULL,NULL, 1,1)";
Database::query($sql); Database::query($sql);
$sql = "INSERT INTO $t_settings (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES $sql = "INSERT INTO $t_settings (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable, access_url_locked) VALUES
('bbb_plugin_salt', '', 'textfield', 'Extra', '', 'BigBlueButtonSecuritySaltTitle','BigBlueButtonSecuritySaltComment',NULL,NULL, 1)"; ('bbb_plugin_salt', '', 'textfield', 'Extra', '', 'BigBlueButtonSecuritySaltTitle','BigBlueButtonSecuritySaltComment',NULL,NULL, 1,1)";
Database::query($sql); Database::query($sql);
$table = Database::get_main_table('plugin_bbb'); $table = Database::get_main_table('plugin_bbb_meeting');
$sql = "CREATE TABLE $table ( " . $sql = "CREATE TABLE $table ( " .
"id BIGINT unsigned NOT NULL auto_increment PRIMARY KEY, " . "id INT unsigned NOT NULL auto_increment PRIMARY KEY, " .
"course_id INT unsigned NOT NULL DEFAULT 0, " . "c_id INT unsigned NOT NULL DEFAULT 0, " .
"name VARCHAR(255) NOT NULL DEFAULT '', " .
"meeting_name VARCHAR(255) NOT NULL DEFAULT '', " . "meeting_name VARCHAR(255) NOT NULL DEFAULT '', " .
"meeting_id VARCHAR(255) NOT NULL DEFAULT '', " .
"attendee_pw VARCHAR(255) NOT NULL DEFAULT '', " . "attendee_pw VARCHAR(255) NOT NULL DEFAULT '', " .
"moderator_pw VARCHAR(255) NOT NULL DEFAULT '', " . "moderator_pw VARCHAR(255) NOT NULL DEFAULT '', " .
"auto_login VARCHAR(255) NOT NULL DEFAULT '', " . "record INT NOT NULL DEFAULT 0, " .
"new_window VARCHAR(255) NOT NULL DEFAULT '', " . "status INT NOT NULL DEFAULT 0, " .
"created_at VARCHAR(255) NOT NULL, " .
"welcome_msg VARCHAR(255) NOT NULL DEFAULT '')"; "welcome_msg VARCHAR(255) NOT NULL DEFAULT '')";
Database::query($sql); Database::query($sql);
@ -45,35 +47,17 @@ $t_courses = Database::get_main_table(TABLE_MAIN_COURSE);
$sql = "SELECT id, code FROM $t_courses ORDER BY id"; $sql = "SELECT id, code FROM $t_courses ORDER BY id";
$res = Database::query($sql); $res = Database::query($sql);
while ($row = Database::fetch_assoc($res)) { while ($row = Database::fetch_assoc($res)) {
$t_course = Database::get_course_table(TABLE_COURSE_SETTING);
$course_id = $row['id']; $course_id = $row['id'];
$sql = "SELECT value FROM $t_course WHERE c_id = $course_id AND variable = 'big_blue_button_meeting_name' ";
$result = Database::query($sql);
if (!Database::num_rows($result)) {
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_meeting_name','','plugins')";
$r = Database::query($sql_course);
}
$sql = "SELECT value FROM $t_course WHERE c_id = $course_id AND variable = 'big_blue_button_attendee_password' ";
$result = Database::query($sql);
if (!Database::num_rows($result)) {
$sql_course = "INSERT INTO $t_course (c_id, variable, value, category) VALUES ($course_id, 'big_blue_button_attendee_password','','plugins')";
$r = Database::query($sql_course);
}
$sql = "SELECT value FROM $t_course WHERE c_id = $course_id AND variable = 'big_blue_button_moderator_password' "; foreach ($variables as $variable) {
$result = Database::query($sql); $sql = "SELECT value FROM $t_course WHERE c_id = $course_id AND variable = '$variable' ";
if (!Database::num_rows($result)) { $result = Database::query($sql);
$sql_course = "INSERT INTO $t_course (c_id, variable, value, category) VALUES ($course_id, 'big_blue_button_moderator_password','','plugins')"; if (!Database::num_rows($result)) {
$r = Database::query($sql_course); $sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, '$variable','','plugins')";
$r = Database::query($sql_course);
}
} }
$sql = "SELECT value FROM $t_course WHERE c_id = $course_id AND variable = 'big_blue_button_welcome_message' ";
$result = Database::query($sql);
if (!Database::num_rows($result)) {
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_welcome_message','','plugins')";
$r = Database::query($sql_course);
}
$t_tool = Database::get_course_table(TABLE_TOOL_LIST); $t_tool = Database::get_course_table(TABLE_TOOL_LIST);
$sql = "SELECT name FROM $t_tool WHERE c_id = $course_id AND name = 'videoconference' "; $sql = "SELECT name FROM $t_tool WHERE c_id = $course_id AND name = 'videoconference' ";

@ -0,0 +1,60 @@
<?php
/**
* This script initiates a videoconference session, calling the BigBlueButton API
* @package chamilo.plugin.bigbluebutton
*/
/**
* Initialization
*/
$language_file = array('videoconf');
require_once '../../main/inc/global.inc.php';
require_once 'bbb.lib.php';
require_once 'bbb_api.php';
$bbb = new bbb();
$action = isset($_GET['action']) ? $_GET['action'] : null;
switch ($action) {
case 'copy_record_to_link_tool':
$result = $bbb->copy_record_to_link_tool($_GET['id'], $_GET['record_id']);
if ($result) {
$message = Display::return_message(get_lang('Copied'), 'success');
} else {
$message = Display::return_message(get_lang('Error'), 'error');
}
break;
case 'delete_recording':
//$bbb->delete_record($_GET['id']);
break;
case 'end':
$bbb->end_meeting($_GET['id']);
$message = Display::return_message(get_lang('MeetingClosed'), 'success');
break;
case 'publish':
//$result = $bbb->publish_meeting($_GET['id']);
break;
case 'unpublish':
//$result = $bbb->unpublish_meeting($_GET['id']);
break;
}
$meetings = $bbb->get_course_meetings();
$users_online = $bbb->get_users_online_in_current_room();
$tool_name = get_lang('OrganisationSVideoconference');
$tpl = new Template($tool_name);
$tpl->assign('meetings', $meetings);
$conference_url = api_get_path(WEB_PLUGIN_PATH).'bbb/start.php?launch=1&'.api_get_cidreq();
$tpl->assign('conference_url', $conference_url);
$tpl->assign('users_online', $users_online);
$tpl->assign('actions', $actions);
$tpl->assign('message', $message);
$listing_tpl = 'bbb/listing.tpl';
$content = $tpl->fetch($listing_tpl);
$tpl->assign('content', $content);
$tpl->display_one_col_template();

@ -0,0 +1,52 @@
<div class ="row">
<div class ="span12" style="text-align:center">
<a href="{{ conference_url }}" class="btn btn-primary btn-large">
{{ 'StartConference'|get_lang }}
</a>
<span id="users_online" class="label label-warning">{{ users_online }} user(s) online</span>
</div>
<div class ="span12">
<div class="page-header">
<h2>{{ 'RecordList'|get_lang }}</h2>
</div>
<table class="table">
<tr>
<th>#</th>
<th>{{'Meeting'|get_lang}}</th>
<th>{{'Date'|get_lang}}</th>
<th>{{'Actions'|get_lang}}</th>
</tr>
{% for meeting in meetings %}
<tr>
<td>{{ meeting.id }}</td>
<td>{{ meeting.meeting_name }}</td>
<td>{{ meeting.created_at }}</td>
<td>
{% if meeting.record == 1 %}
{# Record list #}
{{ meeting.show_links }}
<!-- <a href="{{ meeting.publish_url}} "> Publish </a>
<a href="{{ meeting.unpublish_url}} "> UnPublish </a> -->
{% endif %}
<br />
{% if meeting.status == 1 %}
<span class="label label-success">{{'MeetingOpened'|get_lang}}</span>
<a class="btn" href="{{ meeting.end_url }} "> {{'CloseMeeting'|get_lang}} </a>
{% else %}
<span class="label label-info">{{'MeetingClosed'|get_lang}}</span>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
</div>
</div>

@ -15,6 +15,6 @@ $plugin_info['comment']="Open Source Videoconference tool";
//the locations where this plugin can be shown //the locations where this plugin can be shown
$plugin_info['location']=array('course_tool_plugin'); $plugin_info['location']=array('course_tool_plugin');
//the plugin version //the plugin version
$plugin_info['version']='0.9'; $plugin_info['version']='1.0';
//the plugin author //the plugin author
$plugin_info['author']='Yannick Warnier'; $plugin_info['author']='Julio Montoya & Yannick Warnier';

@ -8,41 +8,56 @@
*/ */
require_once '../../main/inc/global.inc.php'; require_once '../../main/inc/global.inc.php';
require_once 'bbb.lib.php'; require_once 'bbb.lib.php';
//The script receives the course_code (cidReq), which allows it to get the corresponding data require_once 'bbb_api.php';
$cid = api_get_real_course_id();
$ccode = api_get_course_id();
// initialize conference settings from course settings
$meeting_name = api_get_course_setting('big_blue_button_meeting_name',$ccode);
if (empty($meeting_name) or $meeting_name==-1) { $meeting_name = $ccode; }
$meeting_att_pw = api_get_course_setting('big_blue_button_meeting_attendee_pw',$ccode);
if (empty($meeting_att_pw) or $meeting_att_pw==-1) { $meeting_att_pw = $ccode; }
$meeting_mod_pw = api_get_course_setting('big_blue_button_meeting_moderator_pw',$ccode);
if (empty($meeting_mod_pw) or $meeting_mod_pw==-1) { $meeting_mod_pw = $ccode.'mod'; }
$meeting_wel_ms = api_get_course_setting('big_blue_button_meeting_welcome_message',$ccode);
if (empty($meeting_wel_ms) or $meeting_wel_ms==-1) { $meeting_wel_ms = ''; }
// initialize video server settings from global settings $course_code = api_get_course_id();
$settings = api_get_settings('Extra','list',api_get_current_access_url_id());
$bbb_settings = array(); $meeting_params = array();
foreach ($settings as $setting) { $meeting_params['meeting_name'] = api_get_course_id();
if (substr($setting['variable'],0,4)==='bbb_') {
$bbb_settings[$setting['variable']] = $setting['selected_value']; $teacher = api_is_course_admin() || api_is_coach() || api_is_platform_admin();
}
//If I'm a teacher I'm going to the listing page
if ($teacher && !isset($_GET['launch'])) {
header('location: listing.php?'.api_get_cidreq());
exit;
} }
$bbb_plugin = $bbb_settings['bbb_plugin'] === 'true';
$bbb_host = $bbb_settings['bbb_plugin_host'];
$bbb_salt = $bbb_settings['bbb_plugin_salt'];
if (!$bbb_plugin) { $bbb = new bbb();
//the BigBlueButton plugin is not enabled (strangely), return to course homepage
header('location: '.api_get_path(WEB_COURSE_PATH).'/'.$ccode); if ($bbb) {
if ($bbb->is_meeting_exist($meeting_params['meeting_name'])) {
$url = $bbb->join_meeting($meeting_params['meeting_name']);
if ($url) {
header('location: '.$url);
exit;
} else {
$url = $bbb->create_meeting($meeting_params);
header('location: '.$url);
exit;
}
} else {
$url = $bbb->create_meeting($meeting_params);
header('location: '.$url);
exit;
}
} else {
if (api_is_platform_admin()) {
Display::display_warning_message(get_lang('NotConfigured'));
}
} }
header('location: '.api_get_path(WEB_COURSE_PATH).'/'.$course_code);
exit;
/*
$teacher = api_is_course_admin() || api_is_coach() || api_is_platform_admin(); $teacher = api_is_course_admin() || api_is_coach() || api_is_platform_admin();
$user_info = api_get_user_info(api_get_user_id()); $user_info = api_get_user_info(api_get_user_id());
$full_user_name = api_get_person_name($user_info['firstname'],$user_info['lastname']); $full_user_name = api_get_person_name($user_info['firstname'],$user_info['lastname']);
$user_id = api_get_user_id(); $user_id = api_get_user_id();
$is_running = wc_isMeetingRunning($bbb_host,$bbb_salt,$meeting_name); $is_running = wc_isMeetingRunning($bbb_host, $bbb_salt, $meeting_name);
if ($is_running == 'true') { if ($is_running == 'true') {
// The conference is running, everything is fine, join // The conference is running, everything is fine, join
header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id)); header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id));
@ -51,33 +66,41 @@ if ($is_running == 'true') {
// The conference room does not seem to be running... // The conference room does not seem to be running...
// First, try harder and ignore the "running" status // First, try harder and ignore the "running" status
$meetings = wc_getRunningMeetings($bbb_host,$bbb_salt); $meetings = wc_getRunningMeetings($bbb_host,$bbb_salt);
$found = false;
foreach ($meetings as $meeting) { if (!empty($meetings)) {
//Try to find our meeting room in the list... foreach ($meetings as $meeting) {
if ($meeting['meetingID'] == $meeting_name) { //Try to find our meeting room in the list...
$meeting_info = wc_getMeetingInfo($bbb_host,$bbb_salt,$meeting_name,$meeting_mod_pw); if ($meeting['meetingID'] == $meeting_name) {
error_log('Found passive meeting created '.($meeting_info['createTime']).' seconds ago with '.count($meeting_info['attendees']).' attendees - joining as '.($teacher?'teacher':'student')); $meeting_info = wc_getMeetingInfo($bbb_host,$bbb_salt,$meeting_name,$meeting_mod_pw);
//if the user is a teacher, or if there are already attendees in error_log('Found passive meeting created '.($meeting_info['createTime']).' seconds ago with '.count($meeting_info['attendees']).' attendees - joining as '.($teacher?'teacher':'student'));
// the conference room, then allow joining it //if the user is a teacher, or if there are already attendees in
if ($teacher or count($meeting_info['attendees'])>0) { // the conference room, then allow joining it
header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id)); if ($teacher or count($meeting_info['attendees'])>0) {
exit; header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id));
exit;
}
} }
} }
} }
// That conference room is really not running or it has no
// accompanying moderator subscribed // That conference room is really not running or it has no accompanying moderator subscribed
//if (1) {
if ($teacher) { if ($teacher) {
// The user is a teacher, so he has the right to create the // The user is a teacher, so he has the right to create the
// room, so create it and join it // room, so create it and join it
wc_createMeeting($bbb_host,$bbb_salt,$meeting_name,$meeting_name,$meeting_att_pw,$meeting_mod_pw,$meeting_wel_ms,api_get_path(WEB_COURSE_PATH).'/'.$ccode); //var_dump($bbb_host,$bbb_salt,$meeting_name,$meeting_name,$meeting_att_pw,$meeting_mod_pw,$meeting_wel_ms,api_get_path(WEB_COURSE_PATH).'/'.$course_code);
header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id)); $result = wc_createMeeting($bbb_host, $bbb_salt, $meeting_name, $meeting_name, $meeting_att_pw, $meeting_mod_pw, $meeting_wel_ms, api_get_path(WEB_COURSE_PATH).'/'.$course_code, $record_conference);
exit; if ($result) {
} else { header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id));
// There is no conference room for this course and the user exit;
// is a mere student, so he cannot start a conference room by }
// himself: a teacher has to launch it first
header('location: '.api_get_path(WEB_COURSE_PATH).'/'.$ccode);
exit;
} }
// There is no conference room for this course and the user
// is a mere student, so he cannot start a conference room by
// himself: a teacher has to launch it first
header('location: '.api_get_path(WEB_COURSE_PATH).'/'.$course_code);
exit;
} }
*/

@ -8,8 +8,12 @@
/** /**
* Queries * Queries
*/ */
require 'config.php';
$t_settings = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT); $t_settings = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT);
$t_options = Database::get_main_table(TABLE_MAIN_SETTINGS_OPTIONS); $t_options = Database::get_main_table(TABLE_MAIN_SETTINGS_OPTIONS);
$sql = "DELETE FROM $t_settings WHERE variable = 'bbb_plugin'"; $sql = "DELETE FROM $t_settings WHERE variable = 'bbb_plugin'";
Database::query($sql); Database::query($sql);
$sql = "DELETE FROM $t_options WHERE variable = 'bbb_plugin'"; $sql = "DELETE FROM $t_options WHERE variable = 'bbb_plugin'";
@ -18,22 +22,21 @@ $sql = "DELETE FROM $t_settings WHERE variable = 'bbb_plugin_host'";
Database::query($sql); Database::query($sql);
$sql = "DELETE FROM $t_settings WHERE variable = 'bbb_plugin_salt'"; $sql = "DELETE FROM $t_settings WHERE variable = 'bbb_plugin_salt'";
Database::query($sql); Database::query($sql);
$sql = "DROP TABLE IF EXISTS plugin_bbb"; $sql = "DROP TABLE IF EXISTS plugin_bbb_meeting";
Database::query($sql); Database::query($sql);
// update existing courses to add conference settings // update existing courses to add conference settings
$t_courses = Database::get_main_table(TABLE_MAIN_COURSE); $t_courses = Database::get_main_table(TABLE_MAIN_COURSE);
$sql = "SELECT id, code, db_name FROM $t_courses ORDER BY id"; $sql = "SELECT id, code FROM $t_courses ORDER BY id";
$res = Database::query($sql); $res = Database::query($sql);
while ($row = Database::fetch_assoc($res)) { while ($row = Database::fetch_assoc($res)) {
$t_course = Database::get_course_table(TABLE_COURSE_SETTING); $t_course = Database::get_course_table(TABLE_COURSE_SETTING);
$sql_course = "DELETE FROM $t_course WHERE c_id = ".$row['id']." AND variable = 'big_blue_button_meeting_name'";
$r = Database::query($sql_course); foreach ($variables as $variable) {
$sql_course = "DELETE FROM $t_course WHERE c_id = ".$row['id']." AND variable = 'big_blue_button_attendee_password'"; $sql_course = "DELETE FROM $t_course WHERE c_id = ".$row['id']." AND variable = '$variable'";
$r = Database::query($sql_course); $r = Database::query($sql_course);
$sql_course = "DELETE FROM $t_course WHERE c_id = ".$row['id']." AND variable = 'big_blue_button_moderator_password'"; }
$r = Database::query($sql_course);
$sql_course = "DELETE FROM $t_course WHERE c_id = ".$row['id']." AND variable = 'big_blue_button_welcome_message'";
$r = Database::query($sql_course);
$t_tool = Database::get_course_table(TABLE_TOOL_LIST); $t_tool = Database::get_course_table(TABLE_TOOL_LIST);
$sql_course = "DELETE FROM $t_tool WHERE c_id = ".$row['id']." AND link = '../../plugin/bbb/start.php'"; $sql_course = "DELETE FROM $t_tool WHERE c_id = ".$row['id']." AND link = '../../plugin/bbb/start.php'";
$r = Database::query($sql_course); $r = Database::query($sql_course);

@ -1,14 +1,11 @@
<?php <?php
/** /**
* This script is a configuration file for the date plugin. You can use it as a master for other platform plugins (course plugins are slightly different). * This script is a configuration file for the add_this plugin.
* These settings will be used in the administration interface for plugins (Chamilo configuration settings->Plugins) * These settings will be used in the administration interface for plugins
* (Chamilo configuration settings->Plugins)
* @package chamilo.plugin * @package chamilo.plugin
* @author Julio Montoya <gugli100@gmail.com> * @author Julio Montoya <gugli100@gmail.com>
*/ */
/**
* Plugin details (must be present)
*/
/* Plugin config */ /* Plugin config */
//the plugin title //the plugin title
@ -19,6 +16,5 @@ $plugin_info['comment'] = "Show social icons to share a page using addthis.c
$plugin_info['version'] = '1.0'; $plugin_info['version'] = '1.0';
//the plugin author //the plugin author
$plugin_info['author'] = 'Julio Montoya'; $plugin_info['author'] = 'Julio Montoya';
//For bigger icons change this value to addthis_32x32_style //For bigger icons change this value to addthis_32x32_style
$plugin_info['icon_class'] = ''; $plugin_info['icon_class'] = '';

@ -13,7 +13,7 @@ class TestAnnouncements extends UnitTestCase {
} }
/*public function Testdisplay_announcement(){ /*public function Testdisplay_announcement(){
global $_user, $dateFormatLong, $_course; global $_user, $dateFormatLong, $_course;
global $defaultVisibilityForANewCourse, $error_msg; global $error_msg;
ob_start(); ob_start();
//create course //create course
$courseSysCode= '142'; $courseSysCode= '142';

@ -1,11 +1,11 @@
<?php <?php
require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php'; require_once api_get_path(LIBRARY_PATH).'sortable_table.class.php';
require_once api_get_path(LIBRARY_PATH).'export.lib.inc.php'; require_once api_get_path(LIBRARY_PATH).'export.lib.inc.php';
class TestSortableTable extends UnitTestCase { class TestSortableTable extends UnitTestCase {
public function __construct() { public function __construct() {
$this->UnitTestCase('Sortabletable library - main/inc/lib/sortabletable.class.test.php'); $this->UnitTestCase('Sortabletable library - main/inc/lib/sortable_table.class.test.php');
} }
function testdisplay() { function testdisplay() {
Loading…
Cancel
Save