ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilMemberExport.php
Go to the documentation of this file.
1 <?php
2 /*
3  +-----------------------------------------------------------------------------+
4  | ILIAS open source |
5  +-----------------------------------------------------------------------------+
6  | Copyright (c) 1998-2006 ILIAS open source, University of Cologne |
7  | |
8  | This program is free software; you can redistribute it and/or |
9  | modify it under the terms of the GNU General Public License |
10  | as published by the Free Software Foundation; either version 2 |
11  | of the License, or (at your option) any later version. |
12  | |
13  | This program is distributed in the hope that it will be useful, |
14  | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16  | GNU General Public License for more details. |
17  | |
18  | You should have received a copy of the GNU General Public License |
19  | along with this program; if not, write to the Free Software |
20  | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21  +-----------------------------------------------------------------------------+
22 */
23 include_once('Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
24 include_once('Services/Membership/classes/class.ilMemberAgreement.php');
25 include_once('Modules/Course/classes/class.ilCourseParticipants.php');
26 include_once('Modules/Course/classes/Export/class.ilCourseDefinedFieldDefinition.php');
27 include_once('Services/User/classes/class.ilUserDefinedData.php');
28 include_once('Services/User/classes/class.ilUserFormSettings.php');
29 
30 define("IL_MEMBER_EXPORT_CSV_FIELD_SEPERATOR",',');
31 define("IL_MEMBER_EXPORT_CSV_STRING_DELIMITER",'"');
32 
33 
43 {
44  const EXPORT_CSV = 1;
45  const EXPORT_EXCEL = 2;
46 
47 
48  private $ref_id;
49  private $obj_id;
50  private $type;
51  private $members;
52 
53  private $lng;
54 
55  private $settings;
56 
57  private $export_type = null;
58  private $filename = null;
59 
60  private $user_ids = array();
61  private $user_course_data = array();
62  private $user_course_fields = array();
63  private $user_profile_data = array();
64  private $privacy;
65 
72  public function __construct($a_ref_id, $a_type = self::EXPORT_CSV)
73  {
74  global $ilObjDataCache,$lng;
75 
76  $this->lng = $lng;
77 
78  $this->export_type = $a_type;
79 
80  $this->ref_id = $a_ref_id;
81  $this->obj_id = $ilObjDataCache->lookupObjId($this->ref_id);
82  $this->type = ilObject::_lookupType($this->obj_id);
83 
84  $this->initMembers();
85 
86  $this->agreement = ilMemberAgreement::_readByObjId($this->obj_id);
87  $this->settings = new ilUserFormSettings('memexp');
88  $this->privacy = ilPrivacySettings::_getInstance();
89  }
90 
96  public function setFilename($a_file)
97  {
98  $this->filename = $a_file;
99  }
100 
105  public function getFilename()
106  {
107  return $this->filename;
108  }
109 
114  public function getRefId()
115  {
116  return $this->ref_id;
117  }
118 
123  public function getType()
124  {
125  return $this->type;
126  }
127 
132  public function getExportType()
133  {
134  return $this->export_type;
135  }
136 
141  public function getObjId()
142  {
143  return $this->obj_id;
144  }
145 
152  public function create()
153  {
154  $this->fetchUsers();
155 
156  // DONE: Switch different export types
157  switch($this->getExportType())
158  {
159  case self::EXPORT_CSV:
160  $this->createCSV();
161  break;
162 
163  case self::EXPORT_EXCEL:
164  $this->createExcel();
165  break;
166  }
167  }
168 
176  public function getCSVString()
177  {
178  return $this->csv->getCSVString();
179  }
180 
181 
186  public function createExcel()
187  {
188  include_once "./Services/Excel/classes/class.ilExcelUtils.php";
189  include_once "./Services/Excel/classes/class.ilExcelWriterAdapter.php";
190  $adapter = new ilExcelWriterAdapter($this->getFilename(), false);
191  $workbook = $adapter->getWorkbook();
192  $this->worksheet = $workbook->addWorksheet();
193  $this->write();
194  $workbook->close();
195  }
196 
203  public function createCSV()
204  {
205  include_once('Services/Utilities/classes/class.ilCSVWriter.php');
206  $this->csv = new ilCSVWriter();
207 
208  $this->write();
209  }
210 
211 
212 
220  protected function addCol($a_value,$a_row,$a_col)
221  {
222  switch($this->getExportType())
223  {
224  case self::EXPORT_CSV:
225  $this->csv->addColumn($a_value);
226  break;
227 
228  case self::EXPORT_EXCEL:
229  $this->worksheet->write($a_row,$a_col,$a_value);
230  break;
231  }
232  }
233 
238  protected function addRow()
239  {
240  switch($this->getExportType())
241  {
242  case self::EXPORT_CSV:
243  $this->csv->addRow();
244  break;
245 
246  case self::EXPORT_EXCEL:
247  break;
248  }
249  }
250 
258  protected function getOrderedExportableFields()
259  {
260  include_once('Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
261  include_once('Services/PrivacySecurity/classes/class.ilExportFieldsInfo.php');
262  include_once('Modules/Course/classes/Export/class.ilCourseDefinedFieldDefinition.php');
263  include_once('Services/User/classes/class.ilUserDefinedFields.php');
264 
266  $field_info->sortExportFields();
267  $fields[] = 'role';
268  // Append agreement info
270  if($privacy->courseConfirmationRequired())
271  {
272  $fields[] = 'agreement';
273  }
274 
275  foreach($field_info->getExportableFields() as $field)
276  {
277  if($this->settings->enabled($field))
278  {
279  $fields[] = $field;
280  }
281  }
282 
284  foreach($udf->getCourseExportableFields() as $field_id => $udf_data)
285  {
286  if($this->settings->enabled('udf_'.$field_id))
287  {
288  $fields[] = 'udf_'.$field_id;
289  }
290  }
291 
292  // Add course specific fields
293  foreach(ilCourseDefinedFieldDefinition::_getFields($this->obj_id) as $field_obj)
294  {
295  if($this->settings->enabled('cdf_'.$field_obj->getId()))
296  {
297  $fields[] = 'cdf_'.$field_obj->getId();
298  }
299  }
300  return $fields ? $fields : array();
301  }
302 
307  protected function write()
308  {
309  // Add header line
310  $row = 0;
311  $col = 0;
312  foreach($all_fields = $this->getOrderedExportableFields() as $field)
313  {
314  switch($field)
315  {
316  case 'role':
317  #$this->csv->addColumn($this->lng->txt($this->getType().'_role_status'));
318  $this->addCol($this->lng->txt($this->getType().'_role_status'), $row, $col++);
319  break;
320  case 'agreement':
321  #$this->csv->addColumn($this->lng->txt('ps_agreement_accepted'));
322  $this->addCol($this->lng->txt('ps_agreement_accepted'), $row, $col++);
323  break;
324  case 'consultation_hour':
325  $this->lng->loadLanguageModule('dateplaner');
326  $this->addCol($this->lng->txt('cal_ch_field_ch'), $row, $col++);
327  break;
328 
329  default:
330  if(substr($field,0,4) == 'udf_')
331  {
332  $field_id = explode('_',$field);
333  include_once('Services/User/classes/class.ilUserDefinedFields.php');
335  $def = $udf->getDefinition($field_id[1]);
336  #$this->csv->addColumn($def['field_name']);
337  $this->addCol($def['field_name'], $row, $col++);
338  }
339  elseif(substr($field,0,4) == 'cdf_')
340  {
341  $field_id = explode('_',$field);
342  #$this->csv->addColumn(ilCourseDefinedFieldDefinition::_lookupName($field_id[1]));
343  $this->addCol(ilCourseDefinedFieldDefinition::_lookupName($field_id[1]),$row,$col++);
344  }elseif($field == "username")//User Name Presentation Guideline; username should be named login
345  {
346  $this->addCol($this->lng->txt("login"), $row, $col++);
347  }
348  else
349  {
350  #$this->csv->addColumn($this->lng->txt($field));
351  $this->addCol($this->lng->txt($field), $row, $col++);
352  }
353  break;
354  }
355  }
356  #$this->csv->addRow();
357  $this->addRow();
358  // Add user data
359  foreach($this->user_ids as $usr_id)
360  {
361  $row++;
362  $col = 0;
363 
364  $udf_data = new ilUserDefinedData($usr_id);
365  foreach($all_fields as $field)
366  {
367  // Handle course defined fields
368  if($this->addUserDefinedField($udf_data,$field,$row,$col))
369  {
370  $col++;
371  continue;
372  }
373 
374  if($this->addCourseField($usr_id,$field,$row,$col))
375  {
376  $col++;
377  continue;
378  }
379 
380  switch($field)
381  {
382  case 'role':
383  switch($this->user_course_data[$usr_id]['role'])
384  {
385  case IL_CRS_ADMIN:
386  #$this->csv->addColumn($this->lng->txt('crs_admin'));
387  $this->addCol($this->lng->txt('crs_admin'), $row, $col++);
388  break;
389 
390  case IL_CRS_TUTOR:
391  #$this->csv->addColumn($this->lng->txt('crs_tutor'));
392  $this->addCol($this->lng->txt('crs_tutor'), $row, $col++);
393  break;
394 
395  case IL_CRS_MEMBER:
396  #$this->csv->addColumn($this->lng->txt('crs_member'));
397  $this->addCol($this->lng->txt('crs_member'), $row, $col++);
398  break;
399 
400  case IL_GRP_ADMIN:
401  #$this->csv->addColumn($this->lng->txt('il_grp_admin'));
402  $this->addCol($this->lng->txt('il_grp_admin'), $row, $col++);
403  break;
404 
405  case IL_GRP_MEMBER:
406  #$this->csv->addColumn($this->lng->txt('il_grp_member'));
407  $this->addCol($this->lng->txt('il_grp_member'), $row, $col++);
408  break;
409 
410  case 'subscriber':
411  #$this->csv->addColumn($this->lng->txt($this->getType().'_subscriber'));
412  $this->addCol($this->lng->txt($this->getType().'_subscriber'), $row, $col++);
413  break;
414 
415  default:
416  #$this->csv->addColumn($this->lng->txt('crs_waiting_list'));
417  $this->addCol($this->lng->txt('crs_waiting_list'), $row, $col++);
418  break;
419 
420  }
421  break;
422 
423  case 'agreement':
424  if(isset($this->agreement[$usr_id]))
425  {
426  if($this->agreement[$usr_id]['accepted'])
427  {
428  #$this->csv->addColumn(ilFormat::formatUnixTime($this->agreement[$usr_id]['acceptance_time'],true));
429  $this->addCol(ilFormat::formatUnixTime($this->agreement[$usr_id]['acceptance_time'],true),$row,$col++);
430  }
431  else
432  {
433  #$this->csv->addColumn($this->lng->txt('ps_not_accepted'));
434  $this->addCol($this->lng->txt('ps_not_accepted'),$row,$col++);
435  }
436  }
437  else
438  {
439  #$this->csv->addColumn($this->lng->txt('ps_not_accepted'));
440  $this->addCol($this->lng->txt('ps_not_accepted'),$row,$col++);
441  }
442  break;
443 
444  // These fields are always enabled
445  case 'username':
446  #$this->csv->addColumn($this->user_profile_data[$usr_id]['login']);
447  $this->addCol($this->user_profile_data[$usr_id]['login'],$row,$col++);
448  break;
449 
450  case 'firstname':
451  case 'lastname':
452  #$this->csv->addColumn($this->user_profile_data[$usr_id][$field]);
453  $this->addCol($this->user_profile_data[$usr_id][$field],$row,$col++);
454  break;
455 
456  case 'consultation_hour':
457  include_once './Services/Booking/classes/class.ilBookingEntry.php';
458  $bookings = ilBookingEntry::lookupManagedBookingsForObject($this->obj_id, $GLOBALS['ilUser']->getId());
459 
460  $uts = array();
461  foreach((array) $bookings[$usr_id] as $ut)
462  {
465  new ilDateTime($ut['dt'],IL_CAL_UNIX),
466  new ilDateTime($ut['dtend'],IL_CAL_UNIX)
467  );
468  if(strlen($ut['explanation']))
469  {
470  $tmp .= ' '.$ut['explanation'];
471  }
472  $uts[] = $tmp;
473  }
474  $uts_str = implode(',',$uts);
475  $this->addCol($uts_str, $row, $col++);
476  break;
477 
478  default:
479  // Check aggreement
480  if(!$this->privacy->courseConfirmationRequired() or $this->agreement[$usr_id]['accepted'])
481  {
482  #$this->csv->addColumn($this->user_profile_data[$usr_id][$field]);
483  $this->addCol($this->user_profile_data[$usr_id][$field],$row,$col++);
484  }
485  else
486  {
487  #$this->csv->addColumn('');
488  $this->addCol('', $row, $col++);
489  }
490  break;
491 
492  }
493  }
494  #$this->csv->addRow();
495  $this->addRow();
496  }
497 
498  }
499 
500 
501 
508  private function fetchUsers()
509  {
511 
512  if($this->settings->enabled('admin'))
513  {
514  $this->user_ids = $tmp_ids = $this->members->getAdmins();
515  $this->readCourseData($tmp_ids);
516  }
517  if($this->settings->enabled('tutor'))
518  {
519  $this->user_ids = array_merge($tmp_ids = $this->members->getTutors(),$this->user_ids);
520  $this->readCourseData($tmp_ids);
521  }
522  if($this->settings->enabled('member'))
523  {
524  $this->user_ids = array_merge($tmp_ids = $this->members->getMembers(),$this->user_ids);
525  $this->readCourseData($tmp_ids);
526  }
527  if($this->settings->enabled('subscribers'))
528  {
529  $this->user_ids = array_merge($tmp_ids = $this->members->getSubscribers(),$this->user_ids);
530  $this->readCourseData($tmp_ids,'subscriber');
531  }
532  if($this->settings->enabled('waiting_list'))
533  {
534  include_once('Modules/Course/classes/class.ilCourseWaitingList.php');
535  $waiting_list = new ilCourseWaitingList($this->obj_id);
536  $this->user_ids = array_merge($waiting_list->getUserIds(),$this->user_ids);
537 
538  }
539  // Sort by lastname
540  $this->user_ids = ilUtil::_sortIds($this->user_ids,'usr_data','lastname','usr_id');
541 
542  // Finally read user profile data
543  $this->user_profile_data = ilObjUser::_readUsersProfileData($this->user_ids);
544  }
545 
552  private function readCourseData($a_user_ids,$a_status = 'member')
553  {
554  foreach($a_user_ids as $user_id)
555  {
556  // Read course related data
557  if($this->members->isAdmin($user_id))
558  {
559  $this->user_course_data[$user_id]['role'] = $this->getType() == 'crs' ? IL_CRS_ADMIN : IL_GRP_ADMIN;
560  }
561  elseif($this->members->isTutor($user_id))
562  {
563  $this->user_course_data[$user_id]['role'] = IL_CRS_TUTOR;
564  }
565  elseif($this->members->isMember($user_id))
566  {
567  $this->user_course_data[$user_id]['role'] = $this->getType() == 'crs' ? IL_CRS_MEMBER : IL_GRP_MEMBER;
568  }
569  else
570  {
571  $this->user_course_data[$user_id]['role'] = 'subscriber';
572  }
573  }
574  }
575 
583  private function readCourseSpecificFieldsData()
584  {
585  include_once('Modules/Course/classes/Export/class.ilCourseUserData.php');
586  $this->user_course_fields = ilCourseUserData::_getValuesByObjId($this->obj_id);
587  }
588 
598  private function addCourseField($a_usr_id,$a_field,$row,$col)
599  {
600  if(substr($a_field,0,4) != 'cdf_')
601  {
602  return false;
603  }
604  if(!$this->privacy->courseConfirmationRequired() or $this->agreement[$a_usr_id]['accepted'])
605  {
606  $field_info = explode('_',$a_field);
607  $field_id = $field_info[1];
608  $value = $this->user_course_fields[$a_usr_id][$field_id];
609  #$this->csv->addColumn($value);
610  $this->addCol($value, $row, $col);
611  return true;
612  }
613  #$this->csv->addColumn('');
614  $this->addCol('', $row, $col);
615  return true;
616 
617  }
618 
627  private function addUserDefinedField($udf_data,$a_field,$row,$col)
628  {
629  if(substr($a_field,0,4) != 'udf_')
630  {
631  return false;
632  }
633  if(!$this->privacy->courseConfirmationRequired() or $this->agreement[$udf_data->getUserId()]['accepted'])
634  {
635  $field_info = explode('_',$a_field);
636  $field_id = $field_info[1];
637  $value = $udf_data->get('f_'.$field_id);
638  #$this->csv->addColumn($value);
639  $this->addCol($value, $row, $col);
640  return true;
641  }
642  #$this->csv->addColumn('');
643  $this->addCol('', $row, $col);
644  }
645 
650  protected function initMembers()
651  {
652  if($this->getType() == 'crs')
653  {
654  $this->members = ilCourseParticipants::_getInstanceByObjId($this->getObjId());
655  }
656  if($this->getType() == 'grp')
657  {
658  $this->members = ilGroupParticipants::_getInstanceByObjId($this->getObjId());
659  }
660  return true;
661  }
662 }
663 
664 
665 ?>
__construct($a_ref_id, $a_type=self::EXPORT_CSV)
Constructor.
Class for generation of member export files.
getCSVString()
toString method
static _getInstance()
Get instance.
Helper class to generate CSV files.
Class ilUserDefinedData.
createCSV()
Create CSV File.
readCourseData($a_user_ids, $a_status='member')
Read All User related course data.
getOrderedExportableFields()
Get ordered enabled fields.
const IL_GRP_ADMIN
static lookupManagedBookingsForObject($a_obj_id, $a_usr_id)
Lookup bookings for own and managed consultation hours of an object.
addUserDefinedField($udf_data, $a_field, $row, $col)
Add user defined fields.
static _getValuesByObjId($a_obj_id)
Get values by obj_id (for all users)
static formatPeriod(ilDateTime $start, ilDateTime $end)
Format a period of two date Shows: 14.
getObjId()
Get obj id.
static _getInstanceByObjId($a_obj_id)
Get singleton instance.
readCourseSpecificFieldsData()
Read course specific fields data.
static setUseRelativeDates($a_status)
set use relative dates
const IL_CRS_TUTOR
create()
Create Export File.
const IL_CAL_UNIX
const IL_GRP_MEMBER
static _readByObjId($a_obj_id)
Read user data by object id.
static _readUsersProfileData($a_user_ids)
STATIC METHOD get user data of selected users.
setFilename($a_file)
set filename
Class ilExcelWriterAdapter.
const IL_CRS_MEMBER
getFilename()
get filename
static _sortIds($a_ids, $a_table, $a_field, $a_id_name)
Function that sorts ids by a given table field using WHERE IN E.g: __sort(array(6,7),&#39;usr_data&#39;,&#39;lastname&#39;,&#39;usr_id&#39;) => sorts by lastname.
static _getInstanceByType($a_type)
Get Singleton Instance.
addCol($a_value, $a_row, $a_col)
Write on column.
formatUnixTime($ut, $with_time=false)
Date and time handling
const IL_CRS_ADMIN
Base class for course and group participants.
static _getInstanceByObjId($a_obj_id)
Get singleton instance.
static _lookupType($a_id, $a_reference=false)
lookup object type
addCourseField($a_usr_id, $a_field, $row, $col)
fill course specific fields
getExportType()
get current export type
getType()
get obj type
fetchUsers()
Fetch all users that will be exported.
initMembers()
Init member object.
static _getInstance()
Get instance of ilPrivacySettings.
static _lookupName($a_field_id)
Lookup field name.
$GLOBALS['PHPCAS_CLIENT']
This global variable is used by the interface class phpCAS.
Definition: CAS.php:276
static _getFields($a_container_id, $a_sort=IL_CDF_SORT_NAME)
Get all fields of a container.