ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilECSObjectSettings.php
Go to the documentation of this file.
1 <?php
2 
3 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
4 
13 abstract class ilECSObjectSettings
14 {
18  protected $content_obj; // [ilObj]
19 
23  private $logger = null;
24 
25  const MAIL_SENDER = 6;
26 
32  public function __construct(ilObject $a_content_object)
33  {
34  $this->logger = $GLOBALS['DIC']->logger()->obj();
35  $this->content_obj = $a_content_object;
36  }
37 
44  public static function getInstanceByObject(ilObject $a_content_obj)
45  {
46  switch($a_content_obj->getType())
47  {
48  case 'crs':
49  include_once 'Modules/Course/classes/class.ilECSCourseSettings.php';
50  return new ilECSCourseSettings($a_content_obj);
51 
52  case 'cat':
53  include_once 'Modules/Category/classes/class.ilECSCategorySettings.php';
54  return new ilECSCategorySettings($a_content_obj);
55 
56  case 'file':
57  include_once 'Modules/File/classes/class.ilECSFileSettings.php';
58  return new ilECSFileSettings($a_content_obj);
59 
60  case 'glo':
61  include_once 'Modules/Glossary/classes/class.ilECSGlossarySettings.php';
62  return new ilECSGlossarySettings($a_content_obj);
63 
64  case 'grp':
65  include_once 'Modules/Group/classes/class.ilECSGroupSettings.php';
66  return new ilECSGroupSettings($a_content_obj);
67 
68  case 'lm':
69  include_once 'Modules/LearningModule/classes/class.ilECSLearningModuleSettings.php';
70  return new ilECSLearningModuleSettings($a_content_obj);
71 
72  case 'wiki':
73  include_once 'Modules/Wiki/classes/class.ilECSWikiSettings.php';
74  return new ilECSWikiSettings($a_content_obj);
75  }
76  }
77 
82  public function getContentObject()
83  {
84  return $this->content_obj;
85  }
86 
92  abstract protected function getECSObjectType();
93 
99  protected function isActive()
100  {
101  include_once('./Services/WebServices/ECS/classes/class.ilECSServerSettings.php');
102  if(ilECSServerSettings::getInstance()->activeServerExists())
103  {
104  // imported objects cannot be exported => why not
105  #include_once('./Services/WebServices/ECS/classes/class.ilECSImport.php');
106  #if(!ilECSImport::lookupServerId($this->content_obj->getId()))
107  {
108  return true;
109  }
110  }
111 
112  return false;
113  }
114 
122  public function addSettingsToForm(ilPropertyFormGUI $a_form, $a_type)
123  {
124  global $lng;
125 
126  $this->logger->debug('Show ecs settings.');
127  if(!$this->isActive($a_type))
128  {
129  $this->logger->debug('Object type is not active. => no settings.');
130  return;
131  }
132 
133  $obj_id = $this->content_obj->getId();
134 
135  // Return if no participant is enabled for export and the current object is not released
136  include_once './Services/WebServices/ECS/classes/class.ilECSExport.php';
137  include_once './Services/WebServices/ECS/classes/class.ilECSParticipantSettings.php';
138 
139  if(!$this->getContentObject()->withReferences())
140  {
141  $this->logger->debug('Called withot references. => no settings.');
142  return TRUE;
143  }
144 
146  if(!$exportablePart and !ilECSExport::_isExported($obj_id))
147  {
148  $this->logger->debug('Object type is not exportable. => no settings.');
149  return true;
150  }
151  if(
152  $GLOBALS['tree']->checkForParentType($GLOBALS['tree']->getParentId($this->getContentObject()->getRefId()),'crs',false) or
153  $GLOBALS['tree']->checkForParentType($GLOBALS['tree']->getParentId($this->getContentObject()->getRefId()),'grp',false)
154  )
155  {
156  $this->logger->debug('Parent crs/grp in path. => no settings.');
157  return true;
158  }
159 
160  $lng->loadLanguageModule('ecs');
161 
162  // show ecs property form section
163  $ecs = new ilFormSectionHeaderGUI();
164  $ecs->setTitle($lng->txt('ecs_'.$a_type.'_export'));
165  $a_form->addItem($ecs);
166 
167 
168  // release or not
169  $exp = new ilRadioGroupInputGUI($lng->txt('ecs_'.$a_type.'_export_obj_settings'),'ecs_export');
170  $exp->setRequired(true);
171  $exp->setValue(ilECSExport::_isExported($obj_id) ? 1 : 0);
172  $off = new ilRadioOption($lng->txt('ecs_'.$a_type.'_export_disabled'),0);
173  $exp->addOption($off);
174  $on = new ilRadioOption($lng->txt('ecs_'.$a_type.'_export_enabled'),1);
175  $exp->addOption($on);
176  $a_form->addItem($exp);
177 
178  // Show all exportable participants
179  $publish_for = new ilCheckboxGroupInputGUI($lng->txt('ecs_publish_for'),'ecs_sid');
180 
181  // @TODO: Active checkboxes for recipients
182  //$publish_for->setValue((array) $members);
183 
184  // Read receivers
185  $receivers = array();
186  include_once('./Services/WebServices/ECS/classes/class.ilECSEContentDetails.php');
187  foreach(ilECSExport::getExportServerIds($obj_id) as $sid)
188  {
189  $exp = new ilECSExport($sid, $obj_id);
190 
191  $participants = null;
192  $details = ilECSEContentDetails::getInstance($sid, $exp->getEContentId(),
193  $this->getECSObjectType());
194  if($details instanceof ilECSEContentDetails)
195  {
196  $participants = $details->getReceivers();
197  }
198  if($participants)
199  {
200  foreach($participants as $mid)
201  {
202  $receivers[] = $sid.'_'.$mid;
203  }
204  }
205  }
206  $publish_for->setValue($receivers);
207 
208  foreach($exportablePart as $pInfo)
209  {
210  include_once './Services/WebServices/ECS/classes/class.ilECSParticipantSetting.php';
211  $partSetting = new ilECSParticipantSetting($pInfo['sid'], $pInfo['mid']);
212 
213  $com = new ilCheckboxInputGUI(
214  $partSetting->getCommunityName().': '.$partSetting->getTitle(),
215  'sid_mid'
216  );
217  $com->setValue($pInfo['sid'].'_'.$pInfo['mid']);
218  $publish_for->addOption($com);
219  }
220  $on->addSubItem($publish_for);
221  return true;
222  }
223 
232  public function handleSettingsUpdate()
233  {
234  if(!$this->isActive())
235  {
236  return true;
237  }
238 
239  // Parse post data
240  $mids = array();
241  foreach((array) $_POST['ecs_sid'] as $sid_mid)
242  {
243  $tmp = explode('_',$sid_mid);
244  $mids[$tmp[0]][] = $tmp[1];
245  }
246 
247  try
248  {
249  include_once './Services/WebServices/ECS/classes/class.ilECSCommunitiesCache.php';
250  include_once './Services/WebServices/ECS/classes/class.ilECSParticipantSettings.php';
251  include_once './Services/WebServices/ECS/classes/class.ilECSSetting.php';
252 
253  // Update for each server
254  foreach(ilECSParticipantSettings::getExportServers() as $server_id)
255  {
257  if($server->isEnabled())
258  {
259  // Export
260  $export = true;
261  if(!$_POST['ecs_export'])
262  {
263  $export = false;
264  }
265  if(!count($mids[$server_id]))
266  {
267  $export = false;
268  }
269  $this->handleSettingsForServer(
270  $server,
271  $export,
272  $mids[$server_id]
273  );
274  }
275  }
276  }
277  catch(ilECSConnectorException $exc)
278  {
279  ilUtil::sendFailure('Error exporting to ECS server: '.$exc->getMessage());
280  return false;
281  }
282  return true;
283  }
284 
293  protected function handleSettingsForServer(ilECSSetting $a_server,$a_export,$a_mids)
294  {
295  try
296  {
297  include_once('./Services/WebServices/ECS/classes/class.ilECSExport.php');
298  $export_settings = new ilECSExport($a_server->getServerId(), $this->content_obj->getId());
299 
300  // already exported?
301  if($export_settings->isExported())
302  {
303  // still exportable: update ecs
304  if((bool)$a_export)
305  {
306  $this->doUpdate($a_server, $export_settings, $a_mids);
307  }
308  // not exportable anymore
309  else
310  {
311  $this->doDelete($a_server, $export_settings);
312  }
313  }
314  // not exported yet
315  else
316  {
317  // now to be exported
318  if($a_export)
319  {
320  $this->doAdd($a_server, $export_settings, $a_mids);
321  }
322  // was not and will not be exported
323  else
324  {
325 
326  }
327  }
328  }
329  catch(ilECSConnectorException $exc)
330  {
331  throw $exc;
332  }
333  }
334 
342  public function handleContentUpdate()
343  {
344  global $ilLog;
345 
346  if(!$this->isActive())
347  {
348  return true;
349  }
350 
351  include_once './Services/WebServices/ECS/classes/class.ilECSExport.php';
352  $export_servers = ilECSExport::getExportServerIds($this->content_obj->getId());
353  foreach($export_servers as $server_id)
354  {
355  include_once './Services/WebServices/ECS/classes/class.ilECSSetting.php';
357  if($server->isEnabled())
358  {
359  try
360  {
361  include_once('./Services/WebServices/ECS/classes/class.ilECSExport.php');
362  $export_settings = new ilECSExport($server_id, $this->content_obj->getId());
363 
364  // already exported, update ecs
365  if($export_settings->isExported())
366  {
367  $this->doUpdate($server, $export_settings);
368  }
369  // not exported yet, nothing to do
370  else
371  {
372 
373  }
374  }
375  catch(ilECSConnectorException $exc)
376  {
377  $ilLog->write(__METHOD__.': Cannot handle ECS content update. '.$exc->getMessage());
378  return false;
379  }
380  }
381  }
382  return true;
383  }
384 
392  protected function doAdd(ilECSSetting $a_server, ilECSExport $a_export_settings, array $a_mids)
393  {
394  global $ilLog;
395 
396  $ilLog->write(__METHOD__.': Starting ECS add resource...');
397 
398  $json = $this->buildJson($a_server);
399 
400  include_once 'Services/WebServices/ECS/classes/class.ilECSConnector.php';
401  $connector = new ilECSConnector($a_server);
402  $connector->addHeader(ilECSConnector::HEADER_MEMBERSHIPS, implode(',',$a_mids));
403  $econtent_id = $connector->addResource($this->getECSObjectType(),
404  json_encode($json));
405 
406  // status changed
407  $a_export_settings->setExported(true);
408  $a_export_settings->setEContentId($econtent_id);
409  $a_export_settings->save();
410 
411  $this->handlePermissionUpdate($a_server,true);
412 
413  // Send mail
414  $this->sendNewContentNotification($a_server, $econtent_id);
415  }
416 
425  protected function doUpdate(ilECSSetting $a_server, ilECSExport $a_export_settings, array $a_mids = null)
426  {
427  global $ilLog;
428 
429  include_once 'Services/WebServices/ECS/classes/class.ilECSConnector.php';
430 
431  $econtent_id = $a_export_settings->getEContentId();
432  if(!$econtent_id)
433  {
434  $ilLog->write(__METHOD__.': Missing eid. Aborting.');
435  throw new ilECSConnectorException('Missing ECS content ID. Aborting.');
436  }
437  $connector = new ilECSConnector($a_server);
438 
439  if(!$a_mids)
440  {
441  $a_mids = $this->getParticipants($a_server->getServerId(), $econtent_id);
442  }
443  $ilLog->write(__METHOD__.': Start updating ECS content - '.print_r($a_mids,true));
444  $connector->addHeader(ilECSConnector::HEADER_MEMBERSHIPS,implode(',',(array) $a_mids));
445 
446  $json = $this->buildJson($a_server);
447  $connector->updateResource($this->getECSObjectType(),
448  $econtent_id, json_encode($json));
449 
450  $this->handlePermissionUpdate($a_server,true);
451  }
452 
461  public function doDelete(ilECSSetting $a_server, ilECSExport $a_export_settings)
462  {
463  global $ilLog;
464 
465  // already exported?
466  if($a_export_settings->isExported())
467  {
468  include_once './Services/WebServices/ECS/classes/class.ilECSSetting.php';
469  include_once './Services/WebServices/ECS/classes/class.ilECSConnector.php';
470 
471  $econtent_id = $a_export_settings->getEContentId();
472  if(!$econtent_id)
473  {
474  $ilLog->write(__METHOD__.': Missing eid. Aborting.');
475  throw new ilECSConnectorException('Missing ECS content ID. Aborting.');
476  }
477  $connector = new ilECSConnector($a_server);
478 
479  $ilLog->write(__METHOD__.': Start deleting ECS content...');
480  $connector->deleteResource($this->getECSObjectType(),
481  $econtent_id);
482 
483  // status changed
484  $a_export_settings->setExported(false);
485  $a_export_settings->save();
486  }
487  }
488 
496  public static function _handleDelete(array $a_subbtree_nodes)
497  {
498  // active?
499  include_once './Services/WebServices/ECS/classes/class.ilECSServerSettings.php';
500  if(!ilECSServerSettings::getInstance()->activeServerExists())
501  {
502  return;
503  }
504 
505  include_once './Services/WebServices/ECS/classes/class.ilECSSetting.php';
506  include_once './Services/WebServices/ECS/classes/class.ilECSExport.php' ;
507  $exported = ilECSExport::getExportedIds();
508  foreach($a_subbtree_nodes as $node)
509  {
510  if(in_array($node['obj_id'],$exported))
511  {
512  if($content_obj = ilObjectFactory::getInstanceByRefId($node['child'],false))
513  {
514  $settings = self::getInstanceByObject($content_obj);
515 
516  // Read export server ids
517  foreach(ilECSExport::getExportServerIds($node['obj_id']) as $sid)
518  {
520  $export_settings = new ilECSExport($sid, $content_obj->getId());
521  $settings->doDelete($server, $export_settings);
522  }
523  }
524  }
525  }
526  }
527 
535  protected function getParticipants($a_server_id, $a_econtent_id)
536  {
537  $receivers = array();
538  include_once('./Services/WebServices/ECS/classes/class.ilECSEContentDetails.php');
539  foreach((array) $a_server_id as $sid)
540  {
541  $participants = null;
542  $details = ilECSEContentDetails::getInstance($sid, $a_econtent_id,$this->getECSObjectType());
543  if($details instanceof ilECSEContentDetails)
544  {
545  $participants = $details->getReceivers();
546  }
547  if($participants)
548  {
549  foreach($participants as $mid)
550  {
551  $receivers[] = $mid;
552  }
553  }
554  }
555  return (array) $receivers;
556  }
557 
563  protected function sendNewContentNotification(ilECSSetting $a_server, $a_econtent_id)
564  {
565  global $ilLog;
566 
567  if(!count($rcps = $a_server->getApprovalRecipients()))
568  {
569  return true;
570  }
571 
572  include_once('./Services/Mail/classes/class.ilMail.php');
573  include_once('./Services/Language/classes/class.ilLanguageFactory.php');
574 
576  $lang->loadLanguageModule('ecs');
577 
578  // @TODO: read mail
579  $mail = new ilMail(self::MAIL_SENDER);
580  $message = $lang->txt('ecs_export_created_body_a')."\n\n";
581  $message .= $lang->txt('title').': '.$this->content_obj->getTitle()."\n";
582  if(strlen($desc = $this->content_obj->getDescription()))
583  {
584  $message .= $lang->txt('desc').': '.$desc."\n";
585  }
586 
587  // Participant info
588  $message .= ("\n".$lang->txt('ecs_published_for'));
589 
590  try
591  {
592  $found = false;
593 
594  $receivers = null;
595  include_once('./Services/WebServices/ECS/classes/class.ilECSEContentDetails.php');
596  $details = ilECSEContentDetails::getInstance($a_server->getServerId(),
597  $a_econtent_id, $this->getECSObjectType());
598  if($details instanceof ilECSEContentDetails)
599  {
600  $receivers = $details->getReceivers();
601  }
602  if($receivers)
603  {
604  foreach($receivers as $member)
605  {
606  $found = true;
607 
608  include_once './Services/WebServices/ECS/classes/class.ilECSCommunityReader.php';
609  $part = ilECSCommunityReader::getInstanceByServerId($a_server->getServerId())->getParticipantByMID($member);
610 
611  $message .= ("\n\n".$part->getParticipantName()."\n");
612  $message .= ($part->getDescription());
613  }
614  }
615  if($found)
616  {
617  $message .= "\n\n";
618  }
619  else
620  {
621  $message .= (' '.$lang->txt('ecs_not_published')."\n\n");
622  }
623  }
624  catch(ilECSConnectorException $e)
625  {
626  $ilLog->write(__METHOD__.': Cannot read approvements.');
627  return false;
628  }
629 
630  include_once('./Services/Link/classes/class.ilLink.php');
631  $href = ilLink::_getStaticLink($this->content_obj->getRefId(),'crs',true);
632  $message .= $lang->txt("perma_link").': '.$href."\n\n";
633  $message .= ilMail::_getAutoGeneratedMessageString();
634 
635  $mail->sendMail($a_server->getApprovalRecipientsAsString(),
636  '','',
637  $lang->txt('ecs_new_approval_subject'),
638  $message,array(),array('normal'));
639 
640  return true;
641  }
642 
648  {
649  if(
650  ($this->content_obj->getType() == 'crs') ||
651  ($this->content_obj->getType() == 'grp')
652  )
653  {
654  $GLOBALS['ilLog']->write(__METHOD__.': Permission update for courses/groups');
655  $GLOBALS['rbacadmin']->grantPermission(
656  $server->getGlobalRole(),
657  ilRbacReview::_getOperationIdsByName(array('join','visible')),
658  $this->content_obj->getRefId()
659  );
660  }
661  }
662 
669  protected function getJsonCore($a_etype)
670  {
671  $json = new stdClass();
672  $json->lang = 'en_EN'; // :TODO: obsolet?
673  $json->id = 'il_'.IL_INST_ID.'_'.$this->getContentObject()->getType().'_'.$this->getContentObject()->getId();
674  $json->etype = $a_etype;
675  $json->title = $this->content_obj->getTitle();
676  $json->abstract = $this->content_obj->getLongDescription();
677 
678  include_once('./Services/Link/classes/class.ilLink.php');
679  $json->url = ilLink::_getLink($this->content_obj->getRefId(),$this->content_obj->getType());
680 
681  return $json;
682  }
683 
691  protected function addMetadataToJson(&$a_json, ilECSSetting $a_server, array $a_definition)
692  {
693  include_once('./Services/WebServices/ECS/classes/class.ilECSDataMappingSettings.php');
694  include_once('./Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php');
695  include_once('./Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php');
697 
698  include_once "Services/WebServices/ECS/classes/class.ilECSUtils.php";
699  $values = ilECSUtils::getAdvancedMDValuesForObjId($this->content_obj->getId());
700 
701  foreach($a_definition as $id => $type)
702  {
703  if(is_array($type))
704  {
705  $target = $type[1];
706  $type = $type[0];
707  }
708  else
709  {
710  $target = $id;
711  }
712 
713  if($field = $mappings->getMappingByECSName(ilECSDataMappingSetting::MAPPING_EXPORT, $id))
714  {
715  $value = isset($values[$field]) ? $values[$field] : '';
716 
717  switch($type)
718  {
720  $a_json->$target = explode(',', $value);
721  break;
722 
724  $a_json->$target = (int)$value;
725  break;
726 
728  $a_json->$target = (string)$value;
729  break;
730 
732  if(!isset($a_json->$target))
733  {
734  include_once('./Services/WebServices/ECS/classes/class.ilECSTimePlace.php');
735  $a_json->$target = new ilECSTimePlace();
736  }
737  $a_json->$target->{'set'.ucfirst($id)}($value);
738  break;
739  }
740  }
741  }
742  }
743 
750  abstract protected function buildJson(ilECSSetting $a_server);
751 }
752 
753 ?>
Class ilECSFileSettings.
This class represents an option in a radio group.
static getInstanceByServerId($a_server_id)
Get singleton instance.
handleContentUpdate()
Update ECS Content.
static getInstanceByServerId($a_server_id)
Get singleton instance per server.
getParticipants($a_server_id, $a_econtent_id)
Get participants for server and ecs resource.
Representation of ECS EContent Time Place.
static _getOperationIdsByName($operations)
get ops_id&#39;s by name.
This class represents a property form user interface.
getServerId()
Get current server id.
static getExportableParticipants($a_type)
Get participants which are enabled and export is allowed.
Storage of ECS exported objects.
This class represents a section header in a property form.
doUpdate(ilECSSetting $a_server, ilECSExport $a_export_settings, array $a_mids=null)
Update ECS resource.
isActive()
Is ECS (for current object) active?
getApprovalRecipientsAsString()
get approval recipients as string
static _handleDelete(array $a_subbtree_nodes)
handle delete Objects that are moved to the trash call ECS-Remove
setExported($a_status)
Set exported.
static getInstance()
Get singleton instance.
Class ilObject Basic functions for all objects.
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
This class represents a checkbox property in a property form.
Add rich text string
The name of the decorator.
addItem($a_item)
Add Item (Property, SectionHeader).
handleSettingsForServer(ilECSSetting $a_server, $a_export, $a_mids)
Save ECS settings (add- update- deleteResource)
Presentation of ecs content details (http://...campusconnect/courselinks/id/details) ...
getECSObjectType()
Get ECS resource identifier, e.g.
__construct(ilObject $a_content_object)
Constructor.
const TYPE_TIMEPLACE
Class ilECSLearningModuleSettings.
static getInstanceByServerId($a_server_id)
Get instance by server id.
getContentObject()
Get content object.
$a_type
Definition: workflow.php:93
Class ilECSWikiSettings.
static _getLanguage($a_lang_key='')
Get langauge object.
static getExportedIds()
Get exported ids ilDB $ilDB.
static getExportServerIds($a_obj_id)
lookup server ids of exported materials ilDB $ilDB
This class represents a property in a property form.
static getInstanceByObject(ilObject $a_content_obj)
Get settings handler for repository object.
addMetadataToJson(&$a_json, ilECSSetting $a_server, array $a_definition)
Add advanced metadata to json (export)
sendNewContentNotification(ilECSSetting $a_server, $a_econtent_id)
send notifications about new EContent
isExported()
check if an object is exported or not
getEContentId()
get econtent id
static getAdvancedMDValuesForObjId($a_obj_id)
Get advanced metadata values for object id.
Class ilECSGroupSettings.
This class handles base functions for mail handling.
setValue($a_value)
Set Value.
handlePermissionUpdate(ilECSSetting $server)
Handle permission update.
doAdd(ilECSSetting $a_server, ilECSExport $a_export_settings, array $a_mids)
Add resource to ECS.
This class represents a property in a property form.
static _isExported($a_obj_id)
Check if object is exported.
buildJson(ilECSSetting $a_server)
Build resource-specific json.
getType()
get object type public
Create styles array
The data for the language used.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
getGlobalRole()
get global role
handleSettingsUpdate()
Update ECS Export Settings.
$server
getJsonCore($a_etype)
Build core json structure.
global $lng
Definition: privfeed.php:17
for($i=1; $i<=count($kw_cases_sel); $i+=1) $lang
Definition: langwiz.php:349
static getInstanceByRefId($a_ref_id, $stop_on_error=true)
get an instance of an Ilias object by reference id
setEContentId($a_id)
set econtent id
Class ilECSCategorySettings.
getApprovalRecipients()
get approval recipients
Handles object exports to ECS.
addSettingsToForm(ilPropertyFormGUI $a_form, $a_type)
Fill ECS export settings "multiple servers".
static getInstance($a_server_id, $a_econtent_id, $a_resource_type)
Get data from server.
$_POST["username"]
doDelete(ilECSSetting $a_server, ilECSExport $a_export_settings)
Delete ECS resource.
setRequired($a_required)
Set Required.
Class ilECSGlossarySettings.
static getExportServers()
Get server ids which allow an export <type> $ilDB.
Class ilECSCourseSettings.