ILIAS  release_4-4 Revision
All Data Structures Namespaces Files Functions Variables Modules Pages
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 
267  $fields[] = 'role';
268  // Append agreement info
270  if($privacy->courseConfirmationRequired() or ilCourseDefinedFieldDefinition::_hasFields($this->obj_id))
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  }
345  else
346  {
347  #$this->csv->addColumn($this->lng->txt($field));
348  $this->addCol($this->lng->txt($field), $row, $col++);
349  }
350  break;
351  }
352  }
353  #$this->csv->addRow();
354  $this->addRow();
355  // Add user data
356  foreach($this->user_ids as $usr_id)
357  {
358  $row++;
359  $col = 0;
360 
361  $udf_data = new ilUserDefinedData($usr_id);
362  foreach($all_fields as $field)
363  {
364  // Handle course defined fields
365  if($this->addUserDefinedField($udf_data,$field,$row,$col))
366  {
367  $col++;
368  continue;
369  }
370 
371  if($this->addCourseField($usr_id,$field,$row,$col))
372  {
373  $col++;
374  continue;
375  }
376 
377  switch($field)
378  {
379  case 'role':
380  switch($this->user_course_data[$usr_id]['role'])
381  {
382  case IL_CRS_ADMIN:
383  #$this->csv->addColumn($this->lng->txt('crs_admin'));
384  $this->addCol($this->lng->txt('crs_admin'), $row, $col++);
385  break;
386 
387  case IL_CRS_TUTOR:
388  #$this->csv->addColumn($this->lng->txt('crs_tutor'));
389  $this->addCol($this->lng->txt('crs_tutor'), $row, $col++);
390  break;
391 
392  case IL_CRS_MEMBER:
393  #$this->csv->addColumn($this->lng->txt('crs_member'));
394  $this->addCol($this->lng->txt('crs_member'), $row, $col++);
395  break;
396 
397  case IL_GRP_ADMIN:
398  #$this->csv->addColumn($this->lng->txt('il_grp_admin'));
399  $this->addCol($this->lng->txt('il_grp_admin'), $row, $col++);
400  break;
401 
402  case IL_GRP_MEMBER:
403  #$this->csv->addColumn($this->lng->txt('il_grp_member'));
404  $this->addCol($this->lng->txt('il_grp_member'), $row, $col++);
405  break;
406 
407  case 'subscriber':
408  #$this->csv->addColumn($this->lng->txt($this->getType().'_subscriber'));
409  $this->addCol($this->lng->txt($this->getType().'_subscriber'), $row, $col++);
410  break;
411 
412  default:
413  #$this->csv->addColumn($this->lng->txt('crs_waiting_list'));
414  $this->addCol($this->lng->txt('crs_waiting_list'), $row, $col++);
415  break;
416 
417  }
418  break;
419 
420  case 'agreement':
421  if(isset($this->agreement[$usr_id]))
422  {
423  if($this->agreement[$usr_id]['accepted'])
424  {
425  #$this->csv->addColumn(ilFormat::formatUnixTime($this->agreement[$usr_id]['acceptance_time'],true));
426  $this->addCol(ilFormat::formatUnixTime($this->agreement[$usr_id]['acceptance_time'],true),$row,$col++);
427  }
428  else
429  {
430  #$this->csv->addColumn($this->lng->txt('ps_not_accepted'));
431  $this->addCol($this->lng->txt('ps_not_accepted'),$row,$col++);
432  }
433  }
434  else
435  {
436  #$this->csv->addColumn($this->lng->txt('ps_not_accepted'));
437  $this->addCol($this->lng->txt('ps_not_accepted'),$row,$col++);
438  }
439  break;
440 
441  // These fields are always enabled
442  case 'username':
443  #$this->csv->addColumn($this->user_profile_data[$usr_id]['login']);
444  $this->addCol($this->user_profile_data[$usr_id]['login'],$row,$col++);
445  break;
446 
447  case 'firstname':
448  case 'lastname':
449  #$this->csv->addColumn($this->user_profile_data[$usr_id][$field]);
450  $this->addCol($this->user_profile_data[$usr_id][$field],$row,$col++);
451  break;
452 
453  case 'consultation_hour':
454  include_once './Services/Booking/classes/class.ilBookingEntry.php';
455  $bookings = ilBookingEntry::lookupManagedBookingsForObject($this->obj_id, $GLOBALS['ilUser']->getId());
456 
457  $uts = array();
458  foreach((array) $bookings[$usr_id] as $ut)
459  {
462  new ilDateTime($ut['dt'],IL_CAL_UNIX),
463  new ilDateTime($ut['dtend'],IL_CAL_UNIX)
464  );
465  if(strlen($ut['explanation']))
466  {
467  $tmp .= ' '.$ut['explanation'];
468  }
469  $uts[] = $tmp;
470  }
471  $uts_str = implode(',',$uts);
472  $this->addCol($uts_str, $row, $col++);
473  break;
474 
475  default:
476  // Check aggreement
477  if((!$this->privacy->courseConfirmationRequired() and !ilCourseDefinedFieldDefinition::_getFields($this->obj_id))
478  or $this->agreement[$usr_id]['accepted'])
479  {
480  #$this->csv->addColumn($this->user_profile_data[$usr_id][$field]);
481  $this->addCol($this->user_profile_data[$usr_id][$field],$row,$col++);
482  }
483  else
484  {
485  #$this->csv->addColumn('');
486  $this->addCol('', $row, $col++);
487  }
488  break;
489 
490  }
491  }
492  #$this->csv->addRow();
493  $this->addRow();
494  }
495 
496  }
497 
498 
499 
506  private function fetchUsers()
507  {
509 
510  if($this->settings->enabled('admin'))
511  {
512  $this->user_ids = $tmp_ids = $this->members->getAdmins();
513  $this->readCourseData($tmp_ids);
514  }
515  if($this->settings->enabled('tutor'))
516  {
517  $this->user_ids = array_merge($tmp_ids = $this->members->getTutors(),$this->user_ids);
518  $this->readCourseData($tmp_ids);
519  }
520  if($this->settings->enabled('member'))
521  {
522  $this->user_ids = array_merge($tmp_ids = $this->members->getMembers(),$this->user_ids);
523  $this->readCourseData($tmp_ids);
524  }
525  if($this->settings->enabled('subscribers'))
526  {
527  $this->user_ids = array_merge($tmp_ids = $this->members->getSubscribers(),$this->user_ids);
528  $this->readCourseData($tmp_ids,'subscriber');
529  }
530  if($this->settings->enabled('waiting_list'))
531  {
532  include_once('Modules/Course/classes/class.ilCourseWaitingList.php');
533  $waiting_list = new ilCourseWaitingList($this->obj_id);
534  $this->user_ids = array_merge($waiting_list->getUserIds(),$this->user_ids);
535 
536  }
537  // Sort by lastname
538  $this->user_ids = ilUtil::_sortIds($this->user_ids,'usr_data','lastname','usr_id');
539 
540  // Finally read user profile data
541  $this->user_profile_data = ilObjUser::_readUsersProfileData($this->user_ids);
542  }
543 
550  private function readCourseData($a_user_ids,$a_status = 'member')
551  {
552  foreach($a_user_ids as $user_id)
553  {
554  // Read course related data
555  if($this->members->isAdmin($user_id))
556  {
557  $this->user_course_data[$user_id]['role'] = $this->getType() == 'crs' ? IL_CRS_ADMIN : IL_GRP_ADMIN;
558  }
559  elseif($this->members->isTutor($user_id))
560  {
561  $this->user_course_data[$user_id]['role'] = IL_CRS_TUTOR;
562  }
563  elseif($this->members->isMember($user_id))
564  {
565  $this->user_course_data[$user_id]['role'] = $this->getType() == 'crs' ? IL_CRS_MEMBER : IL_GRP_MEMBER;
566  }
567  else
568  {
569  $this->user_course_data[$user_id]['role'] = 'subscriber';
570  }
571  }
572  }
573 
581  private function readCourseSpecificFieldsData()
582  {
583  include_once('Modules/Course/classes/Export/class.ilCourseUserData.php');
584  $this->user_course_fields = ilCourseUserData::_getValuesByObjId($this->obj_id);
585  }
586 
596  private function addCourseField($a_usr_id,$a_field,$row,$col)
597  {
598  if(substr($a_field,0,4) != 'cdf_')
599  {
600  return false;
601  }
602  if((!$this->privacy->courseConfirmationRequired() and ilCourseDefinedFieldDefinition::_getFields($this->obj_id))
603  or $this->agreement[$a_usr_id]['accepted'])
604  {
605  $field_info = explode('_',$a_field);
606  $field_id = $field_info[1];
607  $value = $this->user_course_fields[$a_usr_id][$field_id];
608  #$this->csv->addColumn($value);
609  $this->addCol($value, $row, $col);
610  return true;
611  }
612  #$this->csv->addColumn('');
613  $this->addCol('', $row, $col);
614  return true;
615 
616  }
617 
626  private function addUserDefinedField($udf_data,$a_field,$row,$col)
627  {
628  if(substr($a_field,0,4) != 'udf_')
629  {
630  return false;
631  }
632  if(!$this->privacy->courseConfirmationRequired() or $this->agreement[$udf_data->getUserId()]['accepted'])
633  {
634  $field_info = explode('_',$a_field);
635  $field_id = $field_info[1];
636  $value = $udf_data->get('f_'.$field_id);
637  #$this->csv->addColumn($value);
638  $this->addCol($value, $row, $col);
639  return true;
640  }
641  #$this->csv->addColumn('');
642  $this->addCol('', $row, $col);
643  }
644 
649  protected function initMembers()
650  {
651  if($this->getType() == 'crs')
652  {
653  $this->members = ilCourseParticipants::_getInstanceByObjId($this->getObjId());
654  }
655  if($this->getType() == 'grp')
656  {
657  $this->members = ilGroupParticipants::_getInstanceByObjId($this->getObjId());
658  }
659  return true;
660  }
661 }
662 
663 
664 ?>
__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
$GLOBALS['ct_recipient']
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
static _hasFields($a_container_id)
Check if there are any define fields.
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.
static _getFields($a_container_id, $a_sort=IL_CDF_SORT_NAME)
Get all fields of a container.