chamilo /
chamilo-lms
| 1 | <?php |
||
| 2 | |||
| 3 | /* For licensing terms, see /license.txt */ |
||
| 4 | |||
| 5 | use Chamilo\CoreBundle\Enums\ActionIcon; |
||
| 6 | use Chamilo\CoreBundle\Framework\Container; |
||
| 7 | use Chamilo\CourseBundle\Entity\CGlossary; |
||
| 8 | use ChamiloSession as Session; |
||
| 9 | |||
| 10 | /** |
||
| 11 | * @author Christian Fasanando, initial version |
||
| 12 | * @author Bas Wijnen import/export to CSV |
||
| 13 | */ |
||
| 14 | require_once __DIR__.'/../inc/global.inc.php'; |
||
| 15 | |||
| 16 | $current_course_tool = TOOL_GLOSSARY; |
||
| 17 | |||
| 18 | // Notification for unauthorized people. |
||
| 19 | $this_section = SECTION_COURSES; |
||
| 20 | api_protect_course_script(true); |
||
| 21 | |||
| 22 | // Additional javascripts. |
||
| 23 | $htmlHeadXtra[] = GlossaryManager::javascript_glossary(); |
||
| 24 | $htmlHeadXtra[] = '<script> |
||
| 25 | function setFocus(){ |
||
| 26 | $("#glossary_title").focus(); |
||
| 27 | } |
||
| 28 | |||
| 29 | $(function() { |
||
| 30 | setFocus(); |
||
| 31 | $( "#dialog:ui-dialog" ).dialog( "destroy" ); |
||
| 32 | $( "#dialog-confirm" ).dialog({ |
||
| 33 | autoOpen: false, |
||
| 34 | show: "blind", |
||
| 35 | resizable: false, |
||
| 36 | height:300, |
||
| 37 | modal: true |
||
| 38 | }); |
||
| 39 | $("#export_opener").click(function() { |
||
| 40 | var targetUrl = $(this).attr("href"); |
||
| 41 | $( "#dialog-confirm" ).dialog({ |
||
| 42 | width:400, |
||
| 43 | height:300, |
||
| 44 | buttons: { |
||
| 45 | "'.addslashes(get_lang('Download')).'": function() { |
||
| 46 | var export_format = $("input[name=export_format]:checked").val(); |
||
| 47 | location.href = targetUrl+"&export_format="+export_format; |
||
| 48 | $( this ).dialog( "close" ); |
||
| 49 | } |
||
| 50 | } |
||
| 51 | }); |
||
| 52 | $( "#dialog-confirm" ).dialog("open"); |
||
| 53 | return false; |
||
| 54 | }); |
||
| 55 | }); |
||
| 56 | </script>'; |
||
| 57 | |||
| 58 | // Tracking |
||
| 59 | Event::event_access_tool(TOOL_GLOSSARY); |
||
|
0 ignored issues
–
show
|
|||
| 60 | |||
| 61 | /* |
||
| 62 | function sorter($item1, $item2) |
||
| 63 | { |
||
| 64 | if ($item1[2] == $item2[2]) { |
||
| 65 | return 0; |
||
| 66 | } |
||
| 67 | |||
| 68 | return $item1[2] < $item2[2] ? -1 : 1; |
||
| 69 | } |
||
| 70 | */ |
||
| 71 | // Displaying the header |
||
| 72 | $action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : ''; |
||
| 73 | $currentUrl = api_get_self().'?'.api_get_cidreq(); |
||
| 74 | $interbreadcrumb[] = ['url' => 'index.php?'.api_get_cidreq(), 'name' => get_lang('Glossary')]; |
||
| 75 | |||
| 76 | $content = ''; |
||
| 77 | $tool_name = ''; |
||
| 78 | switch ($action) { |
||
| 79 | case 'addglossary': |
||
| 80 | if (!api_is_allowed_to_edit(null, true)) { |
||
| 81 | api_not_allowed(true); |
||
| 82 | } |
||
| 83 | $tool_name = get_lang('Add'); |
||
| 84 | $form = new FormValidator( |
||
| 85 | 'glossary', |
||
| 86 | 'post', |
||
| 87 | api_get_self().'?action=addglossary&'.api_get_cidreq() |
||
| 88 | ); |
||
| 89 | // Setting the form elements |
||
| 90 | $form->addElement('header', get_lang('Add new glossary term')); |
||
| 91 | if ('true' === api_get_setting('editor.save_titles_as_html')) { |
||
| 92 | $form->addHtmlEditor( |
||
| 93 | 'title', |
||
| 94 | get_lang('Term'), |
||
| 95 | false, |
||
| 96 | false, |
||
| 97 | ['ToolbarSet' => 'TitleAsHtml'] |
||
| 98 | ); |
||
| 99 | } else { |
||
| 100 | $form->addElement('text', 'title', get_lang('Term'), ['id' => 'glossary_title']); |
||
| 101 | } |
||
| 102 | |||
| 103 | $form->addHtmlEditor( |
||
| 104 | 'description', |
||
| 105 | get_lang('Term definition'), |
||
| 106 | true, |
||
| 107 | false, |
||
| 108 | ['ToolbarSet' => 'Glossary', 'Height' => '300'] |
||
| 109 | ); |
||
| 110 | $form->addButtonCreate(get_lang('Save term'), 'SubmitGlossary'); |
||
| 111 | // setting the rules |
||
| 112 | $form->addRule('title', get_lang('Required field'), 'required'); |
||
| 113 | // The validation or display |
||
| 114 | if ($form->validate()) { |
||
| 115 | $check = Security::check_token('post'); |
||
| 116 | if ($check) { |
||
| 117 | $values = $form->exportValues(); |
||
| 118 | GlossaryManager::save_glossary($values); |
||
| 119 | } |
||
| 120 | Security::clear_token(); |
||
| 121 | header('Location: '.$currentUrl); |
||
| 122 | exit; |
||
| 123 | } else { |
||
| 124 | $token = Security::get_token(); |
||
| 125 | $form->addElement('hidden', 'sec_token'); |
||
| 126 | $form->setConstants(['sec_token' => $token]); |
||
| 127 | $content = Display::toolbarAction( |
||
| 128 | 'add_glossary', |
||
| 129 | [ |
||
| 130 | Display::url( |
||
| 131 | Display::getMdiIcon(ActionIcon::BACK, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Back')), |
||
| 132 | api_get_self().'?'.api_get_cidreq() |
||
| 133 | ), |
||
| 134 | ] |
||
| 135 | ); |
||
| 136 | $content .= $form->returnForm(); |
||
| 137 | } |
||
| 138 | |||
| 139 | break; |
||
| 140 | case 'edit_glossary': |
||
| 141 | if (!api_is_allowed_to_edit(null, true)) { |
||
| 142 | api_not_allowed(true); |
||
| 143 | } |
||
| 144 | $tool_name = get_lang('Edit'); |
||
| 145 | $glossaryId = isset($_GET['glossary_id']) ? (int) $_GET['glossary_id'] : 0; |
||
| 146 | if (!empty($glossaryId)) { |
||
| 147 | // initiate the object |
||
| 148 | $form = new FormValidator( |
||
| 149 | 'glossary', |
||
| 150 | 'post', |
||
| 151 | api_get_self().'?action=edit_glossary&glossary_id='.$glossaryId.'&'.api_get_cidreq() |
||
| 152 | ); |
||
| 153 | // Setting the form elements |
||
| 154 | $form->addElement('header', get_lang('Edit term')); |
||
| 155 | $form->addElement('hidden', 'glossary_id'); |
||
| 156 | if ('true' === api_get_setting('editor.save_titles_as_html')) { |
||
| 157 | $form->addHtmlEditor( |
||
| 158 | 'title', |
||
| 159 | get_lang('Term'), |
||
| 160 | false, |
||
| 161 | false, |
||
| 162 | ['ToolbarSet' => 'TitleAsHtml'] |
||
| 163 | ); |
||
| 164 | } else { |
||
| 165 | $form->addElement('text', 'title', get_lang('Term'), ['id' => 'glossary_title']); |
||
| 166 | } |
||
| 167 | |||
| 168 | $form->addElement( |
||
| 169 | 'html_editor', |
||
| 170 | 'description', |
||
| 171 | get_lang('Term definition'), |
||
| 172 | null, |
||
| 173 | ['ToolbarSet' => 'Glossary', 'Height' => '300'] |
||
| 174 | ); |
||
| 175 | |||
| 176 | $repo = Container::getGlossaryRepository(); |
||
| 177 | /** @var CGlossary $glossaryData */ |
||
| 178 | $glossaryData = $repo->find($glossaryId); |
||
| 179 | /* |
||
| 180 | // setting the defaults |
||
| 181 | $glossary_data = GlossaryManager::get_glossary_information($glossaryId); |
||
| 182 | |||
| 183 | // Date treatment for timezones |
||
| 184 | if (!empty($glossary_data['insert_date'])) { |
||
| 185 | $glossary_data['insert_date'] = Display::dateToStringAgoAndLongDate($glossary_data['insert_date']); |
||
| 186 | } else { |
||
| 187 | $glossary_data['insert_date'] = ''; |
||
| 188 | } |
||
| 189 | |||
| 190 | if (!empty($glossary_data['update_date'])) { |
||
| 191 | $glossary_data['update_date'] = Display::dateToStringAgoAndLongDate($glossary_data['update_date']); |
||
| 192 | } else { |
||
| 193 | $glossary_data['update_date'] = ''; |
||
| 194 | } |
||
| 195 | |||
| 196 | $form->addLabel(get_lang('Creation date'), $glossary_data['insert_date']); |
||
| 197 | $form->addLabel(get_lang('Updated'), $glossary_data['update_date']); |
||
| 198 | |||
| 199 | */ |
||
| 200 | $form->addButtonUpdate(get_lang('Update term'), 'SubmitGlossary'); |
||
| 201 | $default = [ |
||
| 202 | 'glossary_id' => $glossaryData->getIid(), |
||
| 203 | 'title' => $glossaryData->getTitle(), |
||
| 204 | 'description' => $glossaryData->getDescription(), |
||
| 205 | ]; |
||
| 206 | $form->setDefaults($default); |
||
| 207 | |||
| 208 | // setting the rules |
||
| 209 | $form->addRule('title', get_lang('Required field'), 'required'); |
||
| 210 | |||
| 211 | // The validation or display |
||
| 212 | if ($form->validate()) { |
||
| 213 | $check = Security::check_token('post'); |
||
| 214 | if ($check) { |
||
| 215 | $values = $form->exportValues(); |
||
| 216 | GlossaryManager::update_glossary($values); |
||
| 217 | } |
||
| 218 | Security::clear_token(); |
||
| 219 | header('Location: '.$currentUrl); |
||
| 220 | exit; |
||
| 221 | } else { |
||
| 222 | $token = Security::get_token(); |
||
| 223 | $form->addElement('hidden', 'sec_token'); |
||
| 224 | $form->setConstants(['sec_token' => $token]); |
||
| 225 | $content = Display::toolbarAction( |
||
| 226 | 'edit_glossary', |
||
| 227 | [ |
||
| 228 | Display::url( |
||
| 229 | Display::getMdiIcon(ActionIcon::BACK, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Back')), |
||
| 230 | api_get_self().'?'.api_get_cidreq() |
||
| 231 | ), |
||
| 232 | ] |
||
| 233 | ); |
||
| 234 | $content .= $form->returnForm(); |
||
| 235 | } |
||
| 236 | } |
||
| 237 | |||
| 238 | break; |
||
| 239 | case 'delete_glossary': |
||
| 240 | if (!api_is_allowed_to_edit(null, true)) { |
||
| 241 | api_not_allowed(true); |
||
| 242 | } |
||
| 243 | GlossaryManager::delete_glossary($_GET['glossary_id']); |
||
| 244 | Security::clear_token(); |
||
| 245 | header('Location: '.$currentUrl); |
||
| 246 | exit; |
||
| 247 | |||
| 248 | break; |
||
| 249 | case 'moveup': |
||
| 250 | //GlossaryManager::move_glossary('up',$_GET['glossary_id']); //actions not available |
||
| 251 | GlossaryManager::display_glossary(); |
||
| 252 | |||
| 253 | break; |
||
| 254 | case 'movedown': |
||
| 255 | //GlossaryManager::move_glossary('down',$_GET['glossary_id']); //actions not available |
||
| 256 | GlossaryManager::display_glossary(); |
||
| 257 | |||
| 258 | break; |
||
| 259 | case 'import': |
||
| 260 | if (!api_is_allowed_to_edit(null, true)) { |
||
| 261 | api_not_allowed(true); |
||
| 262 | } |
||
| 263 | $tool_name = get_lang('Import glossary'); |
||
| 264 | $form = new FormValidator( |
||
| 265 | 'glossary', |
||
| 266 | 'post', |
||
| 267 | api_get_self().'?action=import&'.api_get_cidreq() |
||
| 268 | ); |
||
| 269 | $form->addHeader(get_lang('Import glossary')); |
||
| 270 | $form->addElement('file', 'file', get_lang('File')); |
||
| 271 | $group = []; |
||
| 272 | $group[] = $form->createElement( |
||
| 273 | 'radio', |
||
| 274 | 'file_type', |
||
| 275 | '', |
||
| 276 | 'CSV', |
||
| 277 | 'csv' |
||
| 278 | ); |
||
| 279 | $group[] = $form->createElement( |
||
| 280 | 'radio', |
||
| 281 | 'file_type', |
||
| 282 | '', |
||
| 283 | 'XLS', |
||
| 284 | 'xls' |
||
| 285 | ); |
||
| 286 | $form->addGroup($group, '', get_lang('File type'), null); |
||
| 287 | $form->addElement('checkbox', 'replace', null, get_lang('Delete all terms before import.')); |
||
| 288 | $form->addElement('checkbox', 'update', null, get_lang('Update existing terms.')); |
||
| 289 | $form->addButtonImport(get_lang('Import'), 'SubmitImport'); |
||
| 290 | $form->setDefaults(['file_type' => 'csv']); |
||
| 291 | $content = $form->returnForm(); |
||
| 292 | |||
| 293 | $content .= get_lang('The CSV file must look like this').' ('.get_lang('Fields in <strong>bold</strong> are mandatory.').')'; |
||
| 294 | $content .= '<pre> |
||
| 295 | <strong>term</strong>;<strong>definition</strong>; |
||
| 296 | "Hello";"Hola"; |
||
| 297 | "Goodbye";"Adiós"; |
||
| 298 | </pre>'; |
||
| 299 | |||
| 300 | if ($form->validate()) { |
||
| 301 | $values = $form->getSubmitValues(); |
||
| 302 | |||
| 303 | $termsDeleted = []; |
||
| 304 | //this is a bad idea //jm |
||
| 305 | if (isset($_POST['replace']) && $_POST['replace']) { |
||
| 306 | foreach (GlossaryManager::get_glossary_terms() as $term) { |
||
| 307 | if (!GlossaryManager::delete_glossary($term['id'], false)) { |
||
| 308 | Display::addFlash( |
||
| 309 | Display::return_message(get_lang('Cannot delete glossary').':'.$term['id'], 'error') |
||
| 310 | ); |
||
| 311 | } else { |
||
| 312 | $termsDeleted[] = $term['title']; |
||
| 313 | } |
||
| 314 | } |
||
| 315 | } |
||
| 316 | |||
| 317 | $updateTerms = isset($_POST['update']) && $_POST['update'] ? true : false; |
||
| 318 | |||
| 319 | $format = $values['file_type']; |
||
| 320 | switch ($format) { |
||
| 321 | case 'csv': |
||
| 322 | $data = Import::csvToArray($_FILES['file']['tmp_name']); |
||
| 323 | |||
| 324 | break; |
||
| 325 | case 'xls': |
||
| 326 | $data = Import::xlsToArray($_FILES['file']['tmp_name']); |
||
| 327 | |||
| 328 | break; |
||
| 329 | } |
||
| 330 | |||
| 331 | $updatedList = []; |
||
| 332 | $addedList = []; |
||
| 333 | $badList = []; |
||
| 334 | $doubles = []; |
||
| 335 | $termsPerKey = []; |
||
| 336 | |||
| 337 | if ($data) { |
||
| 338 | $termsToAdd = []; |
||
| 339 | foreach ($data as $item) { |
||
| 340 | if (!isset($item['term'])) { |
||
| 341 | continue; |
||
| 342 | } |
||
| 343 | $items = [ |
||
| 344 | 'title' => $item['term'], |
||
| 345 | 'description' => $item['definition'], |
||
| 346 | ]; |
||
| 347 | $termsToAdd[] = $items; |
||
| 348 | $termsPerKey[$item['term']] = $items; |
||
| 349 | } |
||
| 350 | |||
| 351 | if (empty($termsToAdd)) { |
||
| 352 | Display::addFlash( |
||
| 353 | Display::return_message(get_lang('Nothing to add'), 'warning') |
||
| 354 | ); |
||
| 355 | header('Location: '.$currentUrl); |
||
| 356 | exit; |
||
| 357 | } |
||
| 358 | |||
| 359 | $repeatItems = array_count_values(array_column($termsToAdd, 'title')); |
||
| 360 | foreach ($repeatItems as $item => $count) { |
||
| 361 | if ($count > 1) { |
||
| 362 | $doubles[] = $item; |
||
| 363 | } |
||
| 364 | } |
||
| 365 | |||
| 366 | $uniqueTerms = array_unique(array_keys($repeatItems)); |
||
| 367 | |||
| 368 | foreach ($uniqueTerms as $itemTerm) { |
||
| 369 | $item = $termsPerKey[$itemTerm]; |
||
| 370 | |||
| 371 | if ($updateTerms) { |
||
| 372 | $glossaryInfo = GlossaryManager::get_glossary_term_by_glossary_name($item['title']); |
||
| 373 | |||
| 374 | if (!empty($glossaryInfo)) { |
||
| 375 | $glossaryInfo['description'] = $item['description']; |
||
| 376 | GlossaryManager::update_glossary($glossaryInfo, false); |
||
| 377 | $updatedList[] = $item['title']; |
||
| 378 | } else { |
||
| 379 | $result = GlossaryManager::save_glossary($item, false); |
||
| 380 | if ($result) { |
||
| 381 | $addedList[] = $item['title']; |
||
| 382 | } else { |
||
| 383 | $badList[] = $item['title']; |
||
| 384 | } |
||
| 385 | } |
||
| 386 | } else { |
||
| 387 | $result = GlossaryManager::save_glossary($item, false); |
||
| 388 | if ($result) { |
||
| 389 | $addedList[] = $item['title']; |
||
| 390 | } else { |
||
| 391 | $badList[] = $item['title']; |
||
| 392 | } |
||
| 393 | } |
||
| 394 | } |
||
| 395 | } |
||
| 396 | |||
| 397 | if (count($termsDeleted) > 0) { |
||
| 398 | Display::addFlash( |
||
| 399 | Display::return_message(get_lang('Term removed').': '.implode(', ', $termsDeleted)) |
||
| 400 | ); |
||
| 401 | } |
||
| 402 | |||
| 403 | if (count($updatedList) > 0) { |
||
| 404 | Display::addFlash( |
||
| 405 | Display::return_message(get_lang('Terms updated').': '.implode(', ', $updatedList)) |
||
| 406 | ); |
||
| 407 | } |
||
| 408 | |||
| 409 | if (count($addedList) > 0) { |
||
| 410 | Display::addFlash( |
||
| 411 | Display::return_message(get_lang('Terms added').': '.implode(', ', $addedList)) |
||
| 412 | ); |
||
| 413 | } |
||
| 414 | |||
| 415 | if (count($badList) > 0) { |
||
| 416 | Display::addFlash( |
||
| 417 | Display::return_message( |
||
| 418 | get_lang('Term already exists').': '.implode(', ', $badList), |
||
| 419 | 'error' |
||
| 420 | ) |
||
| 421 | ); |
||
| 422 | } |
||
| 423 | |||
| 424 | if (count($doubles) > 0) { |
||
| 425 | Display::addFlash( |
||
| 426 | Display::return_message( |
||
| 427 | get_lang('Terms duplicated in file').': '.implode(', ', $doubles), |
||
| 428 | 'warning' |
||
| 429 | ) |
||
| 430 | ); |
||
| 431 | } |
||
| 432 | |||
| 433 | header('Location: '.$currentUrl); |
||
| 434 | exit; |
||
| 435 | } |
||
| 436 | |||
| 437 | break; |
||
| 438 | case 'export': |
||
| 439 | if (!api_is_allowed_to_edit(null, true)) { |
||
| 440 | api_not_allowed(true); |
||
| 441 | } |
||
| 442 | $format = isset($_GET['export_format']) ? $_GET['export_format'] : 'csv'; |
||
| 443 | GlossaryManager::exportToFormat($format); |
||
| 444 | |||
| 445 | break; |
||
| 446 | case 'changeview': |
||
| 447 | if (in_array($_GET['view'], ['list', 'table'])) { |
||
| 448 | Session::write('glossary_view', $_GET['view']); |
||
| 449 | } else { |
||
| 450 | $view = Session::read('glossary_view'); |
||
| 451 | $defaultView = api_get_setting('glossary.default_glossary_view'); |
||
| 452 | if (empty($defaultView)) { |
||
| 453 | $defaultView = 'table'; |
||
| 454 | } |
||
| 455 | if (empty($view)) { |
||
| 456 | Session::write('glossary_view', $defaultView); |
||
| 457 | } |
||
| 458 | } |
||
| 459 | header('Location: '.$currentUrl); |
||
| 460 | exit; |
||
| 461 | |||
| 462 | break; |
||
| 463 | case 'export_documents': |
||
| 464 | GlossaryManager::movePdfToDocuments(); |
||
| 465 | header('Location: '.$currentUrl); |
||
| 466 | exit; |
||
| 467 | |||
| 468 | break; |
||
| 469 | default: |
||
| 470 | $tool_name = get_lang('List'); |
||
| 471 | $htmlHeadXtra[] = '<script src="'.api_get_path(WEB_CODE_PATH).'glossary/glossary.js.php?add_ready=1&'.api_get_cidreq().'"></script>'; |
||
| 472 | $htmlHeadXtra[] = api_get_js('jquery.highlight.js'); |
||
| 473 | $content = GlossaryManager::display_glossary(); |
||
| 474 | |||
| 475 | break; |
||
| 476 | } |
||
| 477 | |||
| 478 | Display::display_header($tool_name); |
||
| 479 | Display::display_introduction_section(TOOL_GLOSSARY); |
||
| 480 | |||
| 481 | echo $content; |
||
| 482 | |||
| 483 | $extra = '<div id="dialog-confirm" title="'.get_lang('Please confirm your choice').'">'; |
||
| 484 | $form = new FormValidator( |
||
| 485 | 'report', |
||
| 486 | 'post', |
||
| 487 | api_get_self().'?'.api_get_cidreq(), |
||
| 488 | null, |
||
| 489 | ['class' => 'form-vertical'] |
||
| 490 | ); |
||
| 491 | $form->addElement( |
||
| 492 | 'radio', |
||
| 493 | 'export_format', |
||
| 494 | null, |
||
| 495 | get_lang('CSV export'), |
||
| 496 | 'csv', |
||
| 497 | ['id' => 'export_format_csv_label'] |
||
| 498 | ); |
||
| 499 | $form->addElement( |
||
| 500 | 'radio', |
||
| 501 | 'export_format', |
||
| 502 | null, |
||
| 503 | get_lang('Excel export'), |
||
| 504 | 'xls', |
||
| 505 | ['id' => 'export_format_xls_label'] |
||
| 506 | ); |
||
| 507 | $form->addElement( |
||
| 508 | 'radio', |
||
| 509 | 'export_format', |
||
| 510 | null, |
||
| 511 | get_lang('Export to PDF'), |
||
| 512 | 'pdf', |
||
| 513 | ['id' => 'export_format_pdf_label'] |
||
| 514 | ); |
||
| 515 | |||
| 516 | $form->setDefaults(['export_format' => 'csv']); |
||
| 517 | $extra .= $form->returnForm(); |
||
| 518 | $extra .= '</div>'; |
||
| 519 | |||
| 520 | echo $extra; |
||
| 521 | |||
| 522 | Display::display_footer(); |
||
| 523 |
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.
This is most likely a typographical error or the method has been renamed.