1<?php 2 3/* Copyright (c) 1998-2011 ILIAS open source, Extended GPL, see docs/LICENSE */ 4 5require_once("./Services/COPage/classes/class.ilPageContentGUI.php"); 6require_once("./Services/COPage/classes/class.ilPCInteractiveImage.php"); 7include_once("./Services/COPage/classes/class.ilMediaAliasItem.php"); 8 9/** 10 * User interface class for interactive images 11 * 12 * @author Alex Killing <alex.killing@gmx.de> 13 * @version $Id$ 14 * 15 * @ilCtrl_Calls ilPCInteractiveImageGUI: ilPCIIMTriggerEditorGUI 16 * 17 * @ingroup ServicesCOPage 18 */ 19class ilPCInteractiveImageGUI extends ilPageContentGUI 20{ 21 /** 22 * @var ilTabsGUI 23 */ 24 protected $tabs; 25 26 /** 27 * @var ilToolbarGUI 28 */ 29 protected $toolbar; 30 31 public function __construct($a_pg_obj, $a_content_obj, $a_hier_id = 0, $a_pc_id = "") 32 { 33 global $DIC; 34 35 $this->tpl = $DIC["tpl"]; 36 $this->lng = $DIC->language(); 37 $this->tabs = $DIC->tabs(); 38 $this->ctrl = $DIC->ctrl(); 39 $this->toolbar = $DIC->toolbar(); 40 parent::__construct($a_pg_obj, $a_content_obj, $a_hier_id, $a_pc_id); 41 } 42 43 /** 44 * execute command 45 */ 46 public function executeCommand() 47 { 48 $tpl = $this->tpl; 49 $lng = $this->lng; 50 $ilTabs = $this->tabs; 51 52 53 // $this->getCharacteristicsOfCurrentStyle("media_cont"); // scorm-2004 54 55 // get next class that processes or forwards current command 56 $next_class = $this->ctrl->getNextClass($this); 57 58 // get current command 59 $cmd = $this->ctrl->getCmd(); 60 61 if (is_object($this->content_obj)) { 62 $tpl->setTitleIcon(ilUtil::getImagePath("icon_mob.svg")); 63 $this->getTabs($this->tabs_gui); 64 65 /* $mob = $this->content_obj->getMediaObject(); 66 if (is_object($mob)) 67 { 68 $tpl->setVariable("HEADER", $lng->txt("mob").": ". 69 $this->content_obj->getMediaObject()->getTitle()); 70 $mob_gui = new ilObjMediaObjectGUI("", $this->content_obj->getMediaObject()->getId(),false, false); 71 $mob_gui->setBackTitle($this->page_back_title); 72 $mob_gui->setEnabledMapAreas($this->getEnabledMapAreas()); 73 $mob_gui->getTabs($this->tabs_gui); 74 }*/ 75 } else { 76 } 77 78 switch ($next_class) { 79 // trigger editor 80 case "ilpciimtriggereditorgui": 81 require_once("./Services/COPage/classes/class.ilPCIIMTriggerEditorGUI.php"); 82 $ilTabs->setTabActive("triggers"); 83 $image_map_edit = new ilPCIIMTriggerEditorGUI( 84 $this->content_obj, 85 $this->pg_obj 86 ); 87 $ret = $this->ctrl->forwardCommand($image_map_edit); 88 if ($ret != "") { 89 $tpl->setContent($ret); 90 } 91 break; 92 93 default: 94 $ret = $this->$cmd(); 95 break; 96 } 97 98 return $ret; 99 } 100 101 /** 102 * Add tabs to ilTabsGUI object 103 * 104 * @param object $tab_gui ilTabsGUI object 105 * @param boolean $a_create new creation true/false 106 */ 107 public function getTabs(&$tab_gui, $a_create = false, $a_change_obj_ref = false) 108 { 109 $ilCtrl = $this->ctrl; 110 $ilTabs = $this->tabs; 111 $lng = $this->lng; 112 113 if (!$a_create) { 114 $ilTabs->setBackTarget( 115 $lng->txt("pg"), 116 $ilCtrl->getParentReturn($this) 117 ); 118 119 $ilTabs->addTab( 120 "triggers", 121 $lng->txt("cont_active_areas"), 122 $ilCtrl->getLinkTargetByClass("ilpciimtriggereditorgui", "editMapAreas") 123 ); 124 125 $ilTabs->addTab( 126 "list_overlays", 127 $lng->txt("cont_overlay_images"), 128 $ilCtrl->getLinkTarget($this, "listOverlayImages") 129 ); 130 131 $ilTabs->addTab( 132 "content_popups", 133 $lng->txt("cont_content_popups"), 134 $ilCtrl->getLinkTarget($this, "listContentPopups") 135 ); 136 137 $ilTabs->addTab( 138 "edit_base_image", 139 $lng->txt("cont_base_image") . " & " . $lng->txt("cont_caption"), 140 $ilCtrl->getLinkTarget($this, "editBaseImage") 141 ); 142 } 143 } 144 145 /** 146 * Insert new media object form. 147 */ 148 public function insert($a_post_cmd = "edpost", $a_submit_cmd = "create_mob", $a_input_error = false) 149 { 150 $ilTabs = $this->tabs; 151 $tpl = $this->tpl; 152 $ilCtrl = $this->ctrl; 153 $lng = $this->lng; 154 155 ilUtil::sendInfo($lng->txt("cont_iim_create_info")); 156 157 // $this->getTabs($ilTabs, true); 158 // $ilTabs->setSubTabActive("cont_new_mob"); 159 160 if ($a_input_error) { 161 $form = $this->form; 162 } else { 163 $form = $this->initForm("create"); 164 } 165 $form->setFormAction($ilCtrl->getFormAction($this)); 166 167 $this->displayValidationError(); 168 169 $tpl->setContent($form->getHTML()); 170 } 171 172 /** 173 * Edit 174 */ 175 public function edit() 176 { 177 $tpl = $this->tpl; 178 $ilCtrl = $this->ctrl; 179 180 $ilCtrl->redirectByClass(array("ilpcinteractiveimagegui", "ilpciimtriggereditorgui"), "editMapAreas"); 181 //$tpl->setContent("hh"); 182 } 183 184 /** 185 * Edit base image 186 * 187 * @param 188 * @return 189 */ 190 public function editBaseImage($a_form = null) 191 { 192 $tpl = $this->tpl; 193 $ilTabs = $this->tabs; 194 $lng = $this->lng; 195 196 $ilTabs->activateTab("edit_base_image"); 197 198 $form = $this->initForm(); 199 $tpl->setContent($form->getHTML()); 200 } 201 202 203 /** 204 * Init creation/base image form. 205 * 206 * @param int $a_mode Edit Mode 207 */ 208 public function initForm($a_mode = "edit") 209 { 210 $lng = $this->lng; 211 $ilCtrl = $this->ctrl; 212 213 include_once("Services/Form/classes/class.ilPropertyFormGUI.php"); 214 $form = new ilPropertyFormGUI(); 215 216 // image file 217 $fi = new ilImageFileInputGUI($lng->txt("cont_file"), "image_file"); 218 $fi->setAllowDeletion(false); 219 if ($a_mode == "edit") { 220 $fi->setImage($this->content_obj->getBaseThumbnailTarget()); 221 } 222 $form->addItem($fi); 223 224 if ($a_mode == "edit") { 225 // caption 226 $ti = new ilTextInputGUI($this->lng->txt("cont_caption"), "caption"); 227 $ti->setMaxLength(200); 228 $ti->setSize(50); 229 $form->addItem($ti); 230 } 231 232 // save and cancel commands 233 if ($a_mode == "create") { 234 $form->setTitle($lng->txt("cont_ed_insert_iim")); 235 $form->addCommandButton("create_iim", $lng->txt("save")); 236 $form->addCommandButton("cancelCreate", $lng->txt("cancel")); 237 } else { 238 // get caption 239 $std_alias_item = new ilMediaAliasItem( 240 $this->dom, 241 $this->getHierId(), 242 "Standard", 243 $this->content_obj->getPcId(), 244 "InteractiveImage" 245 ); 246 $ti->setValue($std_alias_item->getCaption()); 247 248 $form->setTitle($lng->txt("cont_edit_base_image")); 249 $form->addCommandButton("update", $lng->txt("save")); 250 } 251 252 $form->setFormAction($ilCtrl->getFormAction($this)); 253 254 return $form; 255 } 256 257 /** 258 * Create new content element 259 */ 260 public function create() 261 { 262 $ilCtrl = $this->ctrl; 263 $lng = $this->lng; 264 265 $this->content_obj = new ilPCInteractiveImage($this->getPage()); 266 $this->content_obj->createMediaObject(); 267 $media_obj = $this->content_obj->getMediaObject(); 268 $media_obj->setTitle($_FILES['image_file']['name']); 269 $media_obj->create(); 270 $mob_dir = ilObjMediaObject::_getDirectory($media_obj->getId()); 271 // $media_obj->setStandardType("File"); 272 $media_obj->createDirectory(); 273 $media_item = new ilMediaItem(); 274 $media_obj->addMediaItem($media_item); 275 $media_item->setPurpose("Standard"); 276 277 $file = $mob_dir . "/" . $_FILES['image_file']['name']; 278 ilUtil::moveUploadedFile( 279 $_FILES['image_file']['tmp_name'], 280 $_FILES['image_file']['name'], 281 $file 282 ); 283 284 // get mime type 285 $format = ilObjMediaObject::getMimeType($file); 286 $location = $_FILES['image_file']['name']; 287 288 // set real meta and object data 289 $media_item->setFormat($format); 290 $media_item->setLocation($location); 291 $media_item->setLocationType("LocalFile"); 292 293 ilUtil::renameExecutables($mob_dir); 294 $media_obj->update(); 295 296 $this->content_obj->createAlias($this->pg_obj, $this->hier_id, $this->pc_id); 297 $this->updated = $this->pg_obj->update(); 298 if ($this->updated === true) { 299 $this->pg_obj->stripHierIDs(); 300 $this->pg_obj->addHierIDs(); 301 $ilCtrl->setParameter($this, "hier_id", $this->content_obj->readHierId()); 302 $ilCtrl->setParameter($this, "pc_id", $this->content_obj->readPCId()); 303 $this->content_obj->setHierId($this->content_obj->readHierId()); 304 $this->setHierId($this->content_obj->readHierId()); 305 $this->content_obj->setPCId($this->content_obj->readPCId()); 306 ilUtil::sendSuccess($lng->txt("cont_saved_interactive_image"), true); 307 $this->ctrl->redirectByClass("ilpcinteractiveimagegui", "edit"); 308 309 //$this->ctrl->returnToParent($this, "jump".$this->hier_id); 310 } else { 311 $this->insert(); 312 } 313 } 314 315 /** 316 * Update (base image) 317 */ 318 public function update() 319 { 320 $ilCtrl = $this->ctrl; 321 $lng = $this->lng; 322 323 $mob = $this->content_obj->getMediaObject(); 324 $mob_dir = ilObjMediaObject::_getDirectory($mob->getId()); 325 $std_item = $mob->getMediaItem("Standard"); 326 $location = $_FILES['image_file']['name']; 327 328 if ($location != "" && is_file($_FILES['image_file']['tmp_name'])) { 329 $file = $mob_dir . "/" . $_FILES['image_file']['name']; 330 ilUtil::moveUploadedFile( 331 $_FILES['image_file']['tmp_name'], 332 $_FILES['image_file']['name'], 333 $file 334 ); 335 336 // get mime type 337 $format = ilObjMediaObject::getMimeType($file); 338 $location = $_FILES['image_file']['name']; 339 $std_item->setFormat($format); 340 $std_item->setLocation($location); 341 $std_item->setLocationType("LocalFile"); 342 $mob->setDescription($format); 343 $mob->update(); 344 } 345 346 // set caption 347 $std_alias_item = new ilMediaAliasItem( 348 $this->dom, 349 $this->getHierId(), 350 "Standard", 351 $this->content_obj->getPcId(), 352 "InteractiveImage" 353 ); 354 $std_alias_item->setCaption(ilUtil::stripSlashes($_POST["caption"])); 355 $_SESSION["il_pg_error"] = $this->pg_obj->update(); 356 ilUtil::sendSuccess($lng->txt("msg_obj_modified"), true); 357 358 $ilCtrl->redirectByClass("ilpcinteractiveimagegui", "editBaseImage"); 359 } 360 361 362 /** 363 * Align media object to center 364 */ 365 public function centerAlign() 366 { 367 $std_alias_item = new ilMediaAliasItem( 368 $this->dom, 369 $this->getHierId(), 370 "Standard", 371 $this->content_obj->getPcId(), 372 "InteractiveImage" 373 ); 374 $std_alias_item->setHorizontalAlign("Center"); 375 $_SESSION["il_pg_error"] = $this->pg_obj->update(); 376 $this->ctrl->returnToParent($this, "jump" . $this->hier_id); 377 } 378 379 /** 380 * align media object to left 381 */ 382 public function leftAlign() 383 { 384 $std_alias_item = new ilMediaAliasItem( 385 $this->dom, 386 $this->getHierId(), 387 "Standard", 388 $this->content_obj->getPcId(), 389 "InteractiveImage" 390 ); 391 $std_alias_item->setHorizontalAlign("Left"); 392 $_SESSION["il_pg_error"] = $this->pg_obj->update(); 393 $this->ctrl->returnToParent($this, "jump" . $this->hier_id); 394 } 395 396 /** 397 * align media object to right 398 */ 399 public function rightAlign() 400 { 401 $std_alias_item = new ilMediaAliasItem( 402 $this->dom, 403 $this->getHierId(), 404 "Standard", 405 $this->content_obj->getPcId(), 406 "InteractiveImage" 407 ); 408 $std_alias_item->setHorizontalAlign("Right"); 409 $_SESSION["il_pg_error"] = $this->pg_obj->update(); 410 $this->ctrl->returnToParent($this, "jump" . $this->hier_id); 411 } 412 413 /** 414 * align media object to left, floating text 415 */ 416 public function leftFloatAlign() 417 { 418 $std_alias_item = new ilMediaAliasItem( 419 $this->dom, 420 $this->getHierId(), 421 "Standard", 422 $this->content_obj->getPcId(), 423 "InteractiveImage" 424 ); 425 $std_alias_item->setHorizontalAlign("LeftFloat"); 426 $_SESSION["il_pg_error"] = $this->pg_obj->update(); 427 $this->ctrl->returnToParent($this, "jump" . $this->hier_id); 428 } 429 430 /** 431 * align media object to right, floating text 432 */ 433 public function rightFloatAlign() 434 { 435 $std_alias_item = new ilMediaAliasItem( 436 $this->dom, 437 $this->getHierId(), 438 "Standard", 439 $this->content_obj->getPcId(), 440 "InteractiveImage" 441 ); 442 $std_alias_item->setHorizontalAlign("RightFloat"); 443 $_SESSION["il_pg_error"] = $this->pg_obj->update(); 444 $this->ctrl->returnToParent($this, "jump" . $this->hier_id); 445 } 446 447 //// 448 //// Overlay Images 449 //// 450 451 /** 452 * List overlay images 453 * 454 * @param 455 * @return 456 */ 457 public function listOverlayImages() 458 { 459 $tpl = $this->tpl; 460 $ilToolbar = $this->toolbar; 461 $ilCtrl = $this->ctrl; 462 $ilTabs = $this->tabs; 463 $lng = $this->lng; 464 465 ilUtil::sendInfo($lng->txt("cont_iim_overlay_info")); 466 467 $ilTabs->setTabActive("list_overlays"); 468 469 $ilToolbar->addButton( 470 $lng->txt("cont_add_images"), 471 $ilCtrl->getLinkTarget($this, "addOverlayImages") 472 ); 473 474 include_once("./Services/COPage/classes/class.ilPCIIMOverlaysTableGUI.php"); 475 $tab = new ilPCIIMOverlaysTableGUI( 476 $this, 477 "listOverlayImages", 478 $this->content_obj->getMediaObject() 479 ); 480 $tpl->setContent($tab->getHTML()); 481 } 482 483 /** 484 * Add overlay images 485 */ 486 public function addOverlayImages($a_form = null) 487 { 488 $tpl = $this->tpl; 489 490 if ($a_form) { 491 $form = $a_form; 492 } else { 493 $form = $this->initAddOverlaysForm(); 494 } 495 496 $tpl->setContent($form->getHTML()); 497 } 498 499 /** 500 * Init add overlays form 501 * 502 * @param 503 * @return 504 */ 505 public function initAddOverlaysForm() 506 { 507 $lng = $this->lng; 508 $ilCtrl = $this->ctrl; 509 $ilTabs = $this->tabs; 510 511 $ilTabs->setTabActive("list_overlays"); 512 513 include_once("Services/Form/classes/class.ilPropertyFormGUI.php"); 514 $form = new ilPropertyFormGUI(); 515 $form->setTitle($lng->txt("cont_add_images")); 516 $form->setFormAction($ilCtrl->getFormAction($this)); 517 518 // file input 519 include_once("./Services/Form/classes/class.ilFileWizardInputGUI.php"); 520 $fi = new ilFileWizardInputGUI($lng->txt("file"), "ovfile"); 521 $fi->setSuffixes(array("gif", "jpeg", "jpg", "png")); 522 $fi->setFilenames(array(0 => '')); 523 $fi->setRequired(true); 524 $form->addItem($fi); 525 526 $form->addCommandButton("uploadOverlayImages", $lng->txt("upload")); 527 $form->addCommandButton("listOverlayImages", $lng->txt("cancel")); 528 529 return $form; 530 } 531 532 533 /** 534 * Upload overlay images 535 * 536 * @param 537 * @return 538 */ 539 public function uploadOverlayImages() 540 { 541 $lng = $this->lng; 542 $ilCtrl = $this->ctrl; 543 544 $form = $this->initAddOverlaysForm(); 545 if ($form->checkInput()) { 546 if (is_array($_FILES["ovfile"]["name"])) { 547 foreach ($_FILES["ovfile"]["name"] as $k => $v) { 548 $name = $_FILES["ovfile"]["name"][$k]; 549 $mime = $_FILES["ovfile"]["type"][$k]; 550 $tmp_name = $_FILES["ovfile"]["tmp_name"][$k]; 551 $size = $_FILES["ovfile"]["size"][$k]; 552 553 $this->content_obj->getMediaObject()->uploadAdditionalFile( 554 $name, 555 $tmp_name, 556 "overlays" 557 ); 558 $piname = pathinfo($name); 559 $this->content_obj->getMediaObject()->makeThumbnail( 560 "overlays/" . $name, 561 basename($name, "." . $piname['extension']) . ".png" 562 ); 563 } 564 } 565 ilUtil::sendSuccess($lng->txt("msg_obj_modified")); 566 $ilCtrl->redirect($this, "listOverlayImages"); 567 } else { 568 $form->setValuesByPost(); 569 $this->addOverlayImages($form); 570 } 571 } 572 573 /** 574 * Confirm overlay deletion 575 */ 576 public function confirmDeleteOverlays() 577 { 578 $ilCtrl = $this->ctrl; 579 $tpl = $this->tpl; 580 $lng = $this->lng; 581 $ilTabs = $this->tabs; 582 583 $ilTabs->setTabActive("list_overlays"); 584 585 if (!is_array($_POST["file"]) || count($_POST["file"]) == 0) { 586 ilUtil::sendFailure($lng->txt("no_checkbox"), true); 587 $ilCtrl->redirect($this, "listOverlayImages"); 588 } else { 589 include_once("./Services/Utilities/classes/class.ilConfirmationGUI.php"); 590 $cgui = new ilConfirmationGUI(); 591 $cgui->setFormAction($ilCtrl->getFormAction($this)); 592 $cgui->setHeaderText($lng->txt("cont_really_delete_overlays")); 593 $cgui->setCancel($lng->txt("cancel"), "listOverlayImages"); 594 $cgui->setConfirm($lng->txt("delete"), "deleteOverlays"); 595 596 foreach ($_POST["file"] as $i => $d) { 597 $cgui->addItem("file[]", $i, $i); 598 } 599 600 $tpl->setContent($cgui->getHTML()); 601 } 602 } 603 604 /** 605 * Delete overlays 606 */ 607 public function deleteOverlays() 608 { 609 $ilCtrl = $this->ctrl; 610 $lng = $this->lng; 611 612 if (is_array($_POST["file"]) && count($_POST["file"]) != 0) { 613 foreach ($_POST["file"] as $f) { 614 $f = str_replace("..", "", ilUtil::stripSlashes($f)); 615 $this->content_obj->getMediaObject() 616 ->removeAdditionalFile("overlays/" . $f); 617 } 618 619 ilUtil::sendSuccess($lng->txt("cont_overlays_have_been_deleted"), true); 620 } 621 $ilCtrl->redirect($this, "listOverlayImages"); 622 } 623 624 625 //// 626 //// Content Popups 627 //// 628 629 /** 630 * List content popups 631 */ 632 public function listContentPopups() 633 { 634 $tpl = $this->tpl; 635 $ilToolbar = $this->toolbar; 636 $ilCtrl = $this->ctrl; 637 $ilTabs = $this->tabs; 638 $lng = $this->lng; 639 640 ilUtil::sendInfo($lng->txt("cont_iim_content_popups_info")); 641 642 $ilTabs->setTabActive("content_popups"); 643 644 $ilToolbar->addButton( 645 $lng->txt("cont_add_popup"), 646 $ilCtrl->getLinkTarget($this, "addPopup") 647 ); 648 649 include_once("./Services/COPage/classes/class.ilPCIIMPopupTableGUI.php"); 650 $tab = new ilPCIIMPopupTableGUI( 651 $this, 652 "listContentPopups", 653 $this->content_obj 654 ); 655 $tpl->setContent($tab->getHTML()); 656 } 657 658 /** 659 * Add popup 660 * 661 * @param 662 * @return 663 */ 664 public function addPopup() 665 { 666 $ilCtrl = $this->ctrl; 667 $lng = $this->lng; 668 669 $this->content_obj->addContentPopup(); 670 $this->pg_obj->update(); 671 ilUtil::sendSuccess($lng->txt("msg_obj_modified"), true); 672 $ilCtrl->redirect($this, "listContentPopups"); 673 } 674 675 /** 676 * Save popups 677 */ 678 public function savePopups() 679 { 680 $ilCtrl = $this->ctrl; 681 $lng = $this->lng; 682 683 if (is_array($_POST["title"])) { 684 $titles = ilUtil::stripSlashesArray($_POST["title"]); 685 $this->content_obj->savePopUps($titles); 686 $this->pg_obj->update(); 687 ilUtil::sendSuccess($lng->txt("msg_obj_modified"), true); 688 } 689 $ilCtrl->redirect($this, "listContentPopups"); 690 } 691 692 /** 693 * Confirm popup deletion 694 */ 695 public function confirmPopupDeletion() 696 { 697 $ilCtrl = $this->ctrl; 698 $tpl = $this->tpl; 699 $lng = $this->lng; 700 $ilTabs = $this->tabs; 701 702 $ilTabs->setTabActive("content_popups"); 703 704 if (!is_array($_POST["tid"]) || count($_POST["tid"]) == 0) { 705 ilUtil::sendFailure($lng->txt("no_checkbox"), true); 706 $ilCtrl->redirect($this, "listContentPopups"); 707 } else { 708 include_once("./Services/Utilities/classes/class.ilConfirmationGUI.php"); 709 $cgui = new ilConfirmationGUI(); 710 $cgui->setFormAction($ilCtrl->getFormAction($this)); 711 $cgui->setHeaderText($lng->txt("cont_really_delete_popups")); 712 $cgui->setCancel($lng->txt("cancel"), "listContentPopups"); 713 $cgui->setConfirm($lng->txt("delete"), "deletePopups"); 714 715 foreach ($_POST["tid"] as $i => $d) { 716 $cgui->addItem("tid[]", $i, $_POST["title"][$i]); 717 } 718 719 $tpl->setContent($cgui->getHTML()); 720 } 721 } 722 723 /** 724 * Delete popups 725 * 726 * @param 727 * @return 728 */ 729 public function deletePopups() 730 { 731 $lng = $this->lng; 732 $ilCtrl = $this->ctrl; 733 734 if (is_array($_POST["tid"]) && count($_POST["tid"]) != 0) { 735 foreach ($_POST["tid"] as $id) { 736 $id = explode(":", $id); 737 $this->content_obj->deletePopup($id[0], $id[1]); 738 } 739 $this->pg_obj->update(); 740 ilUtil::sendSuccess($lng->txt("cont_popups_have_been_deleted"), true); 741 } 742 $ilCtrl->redirect($this, "listContentPopups"); 743 } 744} 745